import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:liftmanager/common/common.dart'; import 'package:liftmanager/internal/account/account_router.dart'; import 'package:liftmanager/internal/account/model/user_info_entity.dart'; import 'package:liftmanager/internal/account/provider/user_provider.dart'; import 'package:liftmanager/internal/wode/wode_router.dart'; import 'package:liftmanager/net/api_service.dart'; import 'package:liftmanager/routers/fluro_navigator.dart'; import 'package:liftmanager/utils/image_utils.dart'; import 'package:liftmanager/widgets/app_bar.dart'; import 'package:liftmanager/widgets/click_item.dart'; import 'package:liftmanager/widgets/load_image.dart'; import 'package:liftmanager/widgets/my_button.dart'; import 'package:provider/provider.dart'; import 'package:liftmanager/widgets/bbs_content.dart'; import 'package:liftmanager/internal/bbs/bbs_router.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:liftmanager/utils/toast.dart'; import 'package:liftmanager/internal/bbs/model/liftcase_model.dart'; import 'package:liftmanager/utils/time_format.dart'; import 'package:liftmanager/internal/wode/order_const.dart'; // import 'package:amap_all_fluttify/amap_all_fluttify.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:video_player/video_player.dart'; import 'package:chewie/chewie.dart'; import 'package:liftmanager/utils/utils.dart'; import 'package:liftmanager/utils/theme_utils.dart'; import 'package:flutter/services.dart'; import 'package:orientation/orientation.dart'; class OrderDetailMaster extends StatefulWidget { OrderDetailMaster(this.id); final String id; @override State createState() { return OrderDetailMasterState(); } } class OrderDetailMasterState extends State with AutomaticKeepAliveClientMixin { UserProvider provider = UserProvider(); bool _hasData = false; LiftCasesDetailModel detailObj; double totalPay; getBrandDetail() { // showLoading(context); if(_controllerBefore != null){ _controllerBefore.pause(); _controllerBefore = null; } if(_controllerAfter != null){ _controllerAfter.pause(); _controllerAfter = null; } NewApiService().getLiftcaseDetail(widget.id, onSuccess: (res) { detailObj = res; print("获取详情成功"); if(detailObj.beforeRepair!=null){ _controllerBefore = VideoPlayerController.network( Utils.getImagePath(detailObj.beforeRepair) ); } if(detailObj.afterRepair!=null){ _controllerAfter = VideoPlayerController.network( Utils.getImagePath(detailObj.afterRepair) ); } double serviceCost = detailObj.serviceCost!=null?detailObj.serviceCost:0.0; double travelCost = detailObj.travelCost!=null?detailObj.travelCost:0.0; double couponDeduction = detailObj.couponDeduction!=null?detailObj.couponDeduction:0.0; double redEnvelopeDeduction = detailObj.redEnvelopeDeduction!=null?detailObj.redEnvelopeDeduction:0.0; totalPay = (serviceCost + travelCost) - ( couponDeduction + redEnvelopeDeduction); if(totalPay < 0){ totalPay = 0.0; } _hasData = true; // dismissLoading(context); setState(() {}); }, onError: (code, msg) { // dismissLoading(context); toasts(msg); }); } VideoPlayerController _controllerBefore; VideoPlayerController _controllerAfter; // 确认完成 void _confirmComplete() { showLoading(context); NewApiService().chargeMakeSureCase({ "id": widget.id, }, onSuccess: (res) { toasts("确认完成"); getBrandDetail(); dismissLoading(context); setState(() {}); }, onError: (code, msg) { dismissLoading(context); toasts(msg); }); } @override void initState() { if(this.mounted){ getBrandDetail(); } super.initState(); } @override void dispose() { if(detailObj.beforeRepair!=null){ _controllerBefore.pause(); _controllerBefore.dispose(); } if(detailObj.afterRepair!=null){ _controllerAfter.pause(); _controllerAfter.dispose(); } // SystemChrome.setPreferredOrientations([ // DeviceOrientation.portraitUp, // ]); OrientationPlugin.forceOrientation(DeviceOrientation.portraitUp); // provider.dispose(); super.dispose(); } getHeight(detailObj){ bool isHeight = false; if((OrderConstant.isShow(detailObj.statuz,detailObj.dataTable,'showExpertQuoteButton'))|| (OrderConstant.isShow(detailObj.statuz,detailObj.dataTable,'showExpertPunchButton') &&detailObj.arrivedFlag == 0)|| (OrderConstant.isShow(detailObj.statuz,detailObj.dataTable,'showExpertConfirmOrderButton',arrivedFlag:detailObj.arrivedFlag))|| (OrderConstant.isShow(detailObj.statuz,detailObj.dataTable,'showExpertArchiveButton')) ){ isHeight = true; } return isHeight; } @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; double height = MediaQuery.of(context).size.height; if(width > height){ // SystemChrome.setPreferredOrientations([ // DeviceOrientation.portraitUp, // ]); OrientationPlugin.forceOrientation(DeviceOrientation.portraitUp); } return ChangeNotifierProvider( create: (_) => provider, child: Scaffold( appBar: MyAppBar( centerTitle: "订单详情", ), body: _hasData ? Consumer( builder: (_, provider, __) { return Stack( children: [ ListView(padding: EdgeInsets.all(0.0), children: [ Container( decoration: BoxDecoration( gradient: const LinearGradient( colors: [Color(0xFF00D9FF), Color(0xFF0287FF)]), ), padding: EdgeInsets.only( top: ScreenUtil().setWidth(10), left: ScreenUtil().setWidth(30)), height: ScreenUtil().setWidth(70), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( OrderConstant.getStatusName( detailObj.statuz, detailObj.dataTable, arrivedFlag: detailObj.arrivedFlag, userType: 'EXPERT'), textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(17), color: Color(0xffffffff), ), ), // detailObj.statuz == 1 // ? Text( // '还剩23小时59分钟自动确认', // textAlign: TextAlign.left, // style: TextStyle( // fontSize: ScreenUtil().setSp(13), // color: Color(0xffeeeeee), // ), // ) // : Container( // child: null, // ), ], ), ), Container( // height: 20, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(20), top: ScreenUtil().setWidth(10)), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: GestureDetector( onTap: () { NavigatorUtils.push(context, "${BbsRouter.recommendAsk}?id=${detailObj.id}&type=3"); }, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( margin: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(10), top: ScreenUtil().setWidth(5)), decoration: BoxDecoration( borderRadius: BorderRadius.circular( ScreenUtil().setWidth(22)), ), child: LoadNetworkImage( detailObj.avatarUrl != null ? detailObj.avatarUrl : '', width: ScreenUtil().setWidth(43), height: ScreenUtil().setWidth(43), // alignment: Alignment.centerLeft, ), ), Expanded( child: Container( child: Column( children: [ Container( child: Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment .center, children: [ Text( detailObj.name ?? '', style: TextStyle( fontSize: ScreenUtil() .setSp( 17)), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only( left: 5), child: Text( detailObj.dataTable == 1 ? '问诊服务' : '出诊服务', style: TextStyle( color: Color( 0xff0288FF), fontSize: ScreenUtil() .setSp( 13), ), textAlign: TextAlign.start, ), ) ], ), ], ), ), Container( child: Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment .center, children: [ Text( detailObj.createTime != null ? DateUtils .instance .getFormartData( timeSamp: detailObj .createTime, format: "MM月dd日", ) : '', style: TextStyle( color: Color( 0xff999999), fontSize: ScreenUtil() .setSp( 13)), textAlign: TextAlign.start, ), Container( // padding: // EdgeInsets.only( // left: 5), child: Text( detailObj .brandName ?? '', style: TextStyle( color: Color( 0xff999999), fontSize: ScreenUtil() .setSp( 13)), textAlign: TextAlign.start, ), ) ], ), ], ), ), Container( child: Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment .start, children: [ Text( detailObj.dataTable == 1 ? "问题描述:" : "出诊时间:", style: TextStyle( color: Color( 0xff999999), fontSize: ScreenUtil() .setSp( 13)), textAlign: TextAlign.start, ), Container( width: width*0.5, padding: EdgeInsets.only( left: 5), child: Text( detailObj.dataTable == 1 ? (detailObj .expression ?? '') : (detailObj.arrivedTime != null ? DateUtils .instance .getFormartData( timeSamp: detailObj.arrivedTime, format: "MM-dd HH:mm", ) : ''), style: TextStyle( color: Color( 0xff999999), fontSize: ScreenUtil() .setSp( 13), ), textAlign: TextAlign.start, ), ) ], ), ], ), ), SizedBox( height: 6, ), Container( child: Row( // mainAxisAlignment: // MainAxisAlignment // .spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment .start, children: [ Text( detailObj.dataTable == 1 ? "已尝试方法:" : "出诊地点:", style: TextStyle( color: Color( 0xff999999), fontSize: ScreenUtil() .setSp(13), ), textAlign: TextAlign.start, ), Container( width: width*0.6, padding: EdgeInsets.only( left: 5,right:50), child: Text( detailObj.dataTable == 1 ? (detailObj .usedMethods ?? '') : (detailObj .address ?? ""), style: TextStyle( color: Color( 0xff999999), fontSize: ScreenUtil() .setSp( 13), ), textAlign: TextAlign.start, ), ) ], ), ], ), ), detailObj.dataTable == 2 ? Container( child: Row( mainAxisAlignment: MainAxisAlignment .start, children: [ Container( width: 260, child: Text( detailObj .expression ?? '', style: TextStyle( color: Color( 0xff0288FF), fontSize: ScreenUtil() .setSp( 15), ), textAlign: TextAlign .left, maxLines: 1, overflow: TextOverflow .ellipsis, ), ) ], ), ) : Container(), ], ), ), ) ], ), ), ), ], ), ), Container( color: ThemeUtils.getDialogTextFieldColor(context), height: ScreenUtil().setWidth(5), ), Column( children: [ detailObj.dataTable == 2 ? Heng( left: "差旅费", right: detailObj.travelCost != null ? "¥" + detailObj.travelCost.toString() : '¥0', leftColor: 0xff666666, rightColor: 0xff666666, ) : Container(), Heng( left: "技术服务费", right: detailObj.serviceCost != null ? "¥" + detailObj.serviceCost.toString() : '¥0', leftColor: 0xff666666, rightColor: 0xff666666, ), Heng( left: "优惠券抵扣", right: detailObj.couponDeduction != null ? "- ¥" + detailObj.couponDeduction.toString() : '- ¥0', leftColor: 0xff666666, rightColor: 0xff666666, ), Heng( left: "红包抵扣", right: detailObj.redEnvelopeDeduction != null ? "- ¥" + detailObj.redEnvelopeDeduction.toString() : '- ¥0', leftColor: 0xff666666, rightColor: 0xff666666, ), Heng( left: "实付款", right: detailObj.payCost != null ? "¥" + detailObj.payCost.toString() : '¥' + totalPay.toStringAsFixed(2).toString(), leftColor: 0xff666666, rightColor: 0xffFD0808, ), Container( color: ThemeUtils.getDialogTextFieldColor(context), height: ScreenUtil().setWidth(5), ), ], ), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide( width: .5, color: ThemeUtils.getDialogTextFieldColor(context)), ), ), child: Text( '订单信息', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(17), ), ), ), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), child: Column( children: [ Row(children: [ Text( '订单编号:', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), Text( detailObj.orderNo != null ? detailObj.orderNo : '', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), ]), Row( children: [ Text( '创建时间:', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), Text( detailObj.createTime != null ? DateUtils.instance.getFormartData( timeSamp: detailObj.createTime, format: "yyyy-MM-dd HH:mm:ss") : '', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), ], ), detailObj.questionBankEntity!=null? Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '驳回原因:', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), Container( width: width*0.75, child: Text( detailObj.questionBankEntity?.notExamineReason??"", textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), ) ], ):Container(child: null,), ], ), ), // detailObj.statuz == 3 // ? Container( // padding: EdgeInsets.only( // left: ScreenUtil().setWidth(15), // top: ScreenUtil().setWidth(10), // bottom: ScreenUtil().setWidth(10)), // decoration: BoxDecoration( // border: Border( // bottom: BorderSide( // width: .5, color: Color(0xfff5f5f5)), // ), // ), // child: Text( // '现场情况(维修前)', // textAlign: TextAlign.left, // style: TextStyle( // fontSize: ScreenUtil().setSp(17), // color: Color(0xff333333), // ), // ), // ) // : Container(child: null), // detailObj.statuz == 3 // ? Container( // padding: EdgeInsets.only( // left: ScreenUtil().setWidth(15), // right: ScreenUtil().setWidth(15), // top: ScreenUtil().setWidth(10), // bottom: ScreenUtil().setWidth(10)), // child: Stack( // children: [ // ClipRRect( // borderRadius: BorderRadius.circular(5), // child: Container( // width: width, // height: ScreenUtil().setWidth(200), // child: LoadAssetImage( // "temporary/xue1", // fit: BoxFit.cover, // ), // ), // ), // Positioned( // left: // width / 2 - ScreenUtil().setWidth(20), // top: ScreenUtil().setWidth(85), // child: Container( // width: ScreenUtil().setWidth(30), // height: ScreenUtil().setWidth(30), // // color:Colors.red, // child: Icon( // IconData(0xe607, // fontFamily: "myfont"), // size: 30.0, // color: Color(0xffdddddd), // ), // ), // ) // ], // ), // ) // : Container(child: null), // detailObj.statuz == 2 || detailObj.statuz == 3 // ? Container( // padding: EdgeInsets.only( // left: ScreenUtil().setWidth(15), // top: ScreenUtil().setWidth(10), // bottom: ScreenUtil().setWidth(10)), // decoration: BoxDecoration( // border: Border( // bottom: BorderSide( // width: .5, color: Color(0xfff5f5f5)), // ), // ), // child: Text( // detailObj.statuz == 2 // ? '现场情况(维修前)' // : '现场情况(维修后)', // textAlign: TextAlign.left, // style: TextStyle( // fontSize: ScreenUtil().setSp(17), // color: Color(0xff333333), // ), // ), // ) // : Container(child: null), // detailObj.statuz == 2 || detailObj.statuz == 3 // ? Container( // padding: EdgeInsets.only( // left: ScreenUtil().setWidth(15), // right: ScreenUtil().setWidth(15), // top: ScreenUtil().setWidth(10), // bottom: ScreenUtil().setWidth(10)), // child: Stack( // children: [ // ClipRRect( // borderRadius: BorderRadius.circular(5), // child: Container( // width: width, // height: ScreenUtil().setWidth(200), // child: LoadAssetImage( // "temporary/xue1", // fit: BoxFit.cover, // ), // ), // ), // Positioned( // left: // width / 2 - ScreenUtil().setWidth(20), // top: ScreenUtil().setWidth(85), // child: Container( // width: ScreenUtil().setWidth(30), // height: ScreenUtil().setWidth(30), // // color:Colors.red, // child: Icon( // IconData(0xe607, // fontFamily: "myfont"), // size: 30.0, // color: Color(0xffdddddd), // ), // ), // ) // ], // ), // ) // : Container(child: null), detailObj.dataTable==2? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: width, padding: EdgeInsets.only(left:ScreenUtil().setWidth(15),top:ScreenUtil().setWidth(10),bottom:ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: .5, color:Color(0xfff5f5f5)), ), ), child: Text( '现场情况(维修前)', textAlign: TextAlign.left, style: TextStyle( fontSize:ScreenUtil().setSp(17), ), ), ), detailObj.beforeRepair!=null?Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(15)), child: ClipRRect( borderRadius: BorderRadius.circular(5), child: new Chewie( controller: ChewieController( videoPlayerController: // VideoPlayerController.network( // Utils.getImagePath(detailObj.beforeRepair) // // imgFontUrl + detailObj.url // ) _controllerBefore, aspectRatio: 3 / 2, autoPlay: false, looping: true, showControls: true, deviceOrientationsAfterFullScreen:[DeviceOrientation.portraitUp,], // 占位图 // placeholder: Image.network( // imgFontUrl+detailObj.cover, // fit: BoxFit.contain, // ), // 是否在 UI 构建的时候就加载视频 autoInitialize: true, // 拖动条样式颜色 materialProgressColors: new ChewieProgressColors( playedColor: Colors.red, handleColor: Colors.blue, backgroundColor: Colors.grey, bufferedColor: Colors.lightGreen, ), ), ), )):Container( padding: EdgeInsets.only(left:15), child: Text("暂无"), ), Container( width: width, padding: EdgeInsets.only(left:ScreenUtil().setWidth(15),top:ScreenUtil().setWidth(10),bottom:ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: .5, color:Color(0xfff5f5f5)), ), ), child: Text( '现场情况(维修后)', textAlign: TextAlign.left, style: TextStyle( fontSize:ScreenUtil().setSp(17), ), ), ), detailObj.afterRepair!=null? Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(15)), child: ClipRRect( borderRadius: BorderRadius.circular(5), child: new Chewie( controller: ChewieController( videoPlayerController: // VideoPlayerController.network( // Utils.getImagePath(detailObj.afterRepair) // // imgFontUrl + detailObj.url // ) _controllerAfter, aspectRatio: 3 / 2, autoPlay: false, looping: true, showControls: true, deviceOrientationsAfterFullScreen:[DeviceOrientation.portraitUp,], // 占位图 // placeholder: Image.network( // imgFontUrl+detailObj.cover, // fit: BoxFit.contain, // ), // 是否在 UI 构建的时候就加载视频 autoInitialize: true, // 拖动条样式颜色 materialProgressColors: new ChewieProgressColors( playedColor: Colors.red, handleColor: Colors.blue, backgroundColor: Colors.grey, bufferedColor: Colors.lightGreen, ), ), ), )):Container( padding: EdgeInsets.only(left:15), child: Text("暂无"), ), ], ):Container(child: null,), SizedBox(height: 80), ]), Positioned( bottom: 0, left: 0, child: Container( width: width, height: !getHeight(detailObj)?0:60, padding: EdgeInsets.only( right: ScreenUtil().setWidth(15), left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(12), bottom: ScreenUtil().setWidth(12)), decoration: BoxDecoration( border: Border( top: BorderSide( width: 0.5, color: Color(0xffeeeeee)), ), color: ThemeUtils.getDialogTextFieldColor(context), ), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.center, children: [ OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertQuoteButton') ? BottomBtn( title: detailObj.statuz==1?"立即报价":"修改报价", fun: () { NavigatorUtils.push(context, "${WodeRouter.baoPrice}?id=${detailObj.id}&travelCost=${detailObj.travelCost!=null?detailObj.travelCost.toString():''}&serviceCost=${detailObj.serviceCost!=null?detailObj.serviceCost.toString():''}"); }, ) : Container(child: null), // detailObj.statuz == 3 || detailObj.statuz == 6 // ? BottomBtn( // title: "上传视频", // fun: () { // // NavigatorUtils.push(context,WodeRouter.representations); // }, // ) // : Container(child: null), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertPunchButton') && detailObj.arrivedFlag == 0 ? BottomBtn( title: "立即打卡", fun: () { NavigatorUtils.push(context, "${WodeRouter.punchin}?id=${detailObj.id}"); }, ) : Container(child: null), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertConfirmOrderButton', arrivedFlag:detailObj.arrivedFlag) ? BottomBtn( title: "确认完成", fun: () { if(detailObj.dataTable == 1) { _confirmComplete(); } else { NavigatorUtils.push(context, "${WodeRouter.confirmOrder}?id=${detailObj.id}"); } }, ) : Container(child: null), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertArchiveButton') ? BottomBtn( title: "立即归档", fun: () { NavigatorUtils.push(context, "${WodeRouter.archive}?id=${detailObj.id}"); }, ) : Container(child: null), ], ), ), ) ], ); }, ) : Center( child: Text("正在加载..."), ), ), ); } @override bool get wantKeepAlive => true; } class BottomBtn extends StatelessWidget { BottomBtn({Key key, this.title, this.fun}) : super(key: key); Function fun; String title; @override Widget build(BuildContext context) { return Container( margin: EdgeInsets.only(left: 10), child: GestureDetector( onTap: () { fun(); }, child: Container( child: Container( // height:22, padding: EdgeInsets.only( left: ScreenUtil().setWidth(20), right: ScreenUtil().setWidth(20), ), decoration: BoxDecoration( border: Border.all(width: 1, color: Color(0xff1B87F6)), borderRadius: BorderRadius.circular(ScreenUtil().setWidth(17)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( title, textAlign: TextAlign.center, style: TextStyle( fontSize: ScreenUtil().setSp(15), color: Color(0xff0288FF), ), ), ], ), ), ), ), ); } }