work_place.dart 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. import 'package:flutter/material.dart';
  2. import 'package:liftmanager/res/gaps.dart';
  3. import 'package:liftmanager/net/api_service.dart';
  4. import 'package:liftmanager/utils/toast.dart';
  5. import 'package:liftmanager/widgets/app_bar.dart';
  6. import 'package:liftmanager/internal/search/search_router.dart';
  7. import 'package:liftmanager/widgets/app_search_bar.dart';
  8. import 'package:liftmanager/res/resources.dart';
  9. import 'package:liftmanager/routers/fluro_navigator.dart';
  10. import 'package:liftmanager/widgets/load_image.dart';
  11. import 'package:liftmanager/internal/bbs/bbs_router.dart';
  12. import 'dart:math' as math;
  13. import 'package:liftmanager/internal/search/presenter/base_list_provider.dart';
  14. import 'package:flutter_screenutil/flutter_screenutil.dart';
  15. import 'package:liftmanager/internal/bbs/model/liftcase_model.dart';
  16. import 'package:liftmanager/mvp/base_page_state.dart';
  17. import 'package:liftmanager/widgets/my_refresh_list.dart';
  18. import 'package:provider/provider.dart';
  19. import 'package:liftmanager/internal/bbs/presenter/liftcase_list_presenter.dart';
  20. import 'dart:async';
  21. import 'package:liftmanager/utils/time_format.dart';
  22. import 'package:liftmanager/utils/url.dart';
  23. import 'dart:convert';
  24. import 'package:liftmanager/common/common.dart';
  25. // import 'package:flustars/flustars.dart';
  26. import 'package:flustars/flustars.dart' as FlutterStars;
  27. import 'package:liftmanager/internal/wode/order_const.dart';
  28. class WorkPlace extends StatefulWidget {
  29. @override
  30. WorkPlaceState createState() => WorkPlaceState();
  31. }
  32. class WorkPlaceState extends BasePageState<WorkPlace, LiftcaseListPresenter> {
  33. BaseListProvider<LiftCasesDetailModel> provider =
  34. BaseListProvider<LiftCasesDetailModel>();
  35. // ExpertListState({Key key}) : super(key: key);
  36. bool sortBool = true;
  37. String sortName = "排序";
  38. int indexNowConst = 999;
  39. String checkId = "";
  40. bool isOnline = true;
  41. int _page = 1;
  42. List<String> labelList = ["特邀专家", "普通专家"];
  43. List<dynamic> expertType = [
  44. {"value": 0, "label": "特邀专家"},
  45. {"value": 1, "label": "普通专家"}
  46. ];
  47. @override
  48. void initState() {
  49. super.initState();
  50. getBrandDetail();
  51. _onRefresh();
  52. startTimer();
  53. }
  54. getLevel(level){
  55. String img;
  56. if(level == 1){
  57. img = "L1@2x";
  58. }else if (level == 2){
  59. img = "L2@2x";
  60. }else if (level == 3){
  61. img = "L3@2x";
  62. }else if (level == 4){
  63. img = "L4@2x";
  64. }else if (level == 5){
  65. img = "L5@2x";
  66. }
  67. return img;
  68. }
  69. bool _hasData = false;
  70. var detailObj;
  71. getBrandDetail() {
  72. NewApiService().getExpertDetail(FlutterStars.SpUtil.getString(Constant.userId), onSuccess: (res) {
  73. detailObj = res;
  74. print("获取详情成功");
  75. if(detailObj.statuz==1){
  76. isOnline = true;
  77. }else {
  78. isOnline = false;
  79. }
  80. print(JsonEncoder().convert(res));
  81. print(123123);
  82. _hasData = true;
  83. setState(() {});
  84. }, onError: (code, msg) {
  85. toasts(msg);
  86. });
  87. }
  88. updateUser(int status){
  89. NewApiService().updateUser({
  90. "userId":FlutterStars.SpUtil.getString(Constant.userId),
  91. "statuz":status
  92. }, onSuccess: (res) {
  93. getBrandDetail();
  94. setState(() {});
  95. }, onError: (code, msg) {
  96. toasts(msg);
  97. });
  98. }
  99. Timer _timer;
  100. void startTimer() {
  101. //设置 30 秒回调一次
  102. const period = const Duration(seconds: 30);
  103. _timer = Timer.periodic(period, (timer) {
  104. _onRefresh();
  105. //更新界面
  106. setState(() {});
  107. });
  108. }
  109. void cancelTimer() {
  110. if (_timer != null) {
  111. _timer.cancel();
  112. _timer = null;
  113. }
  114. }
  115. @override
  116. void dispose() {
  117. super.dispose();
  118. cancelTimer();
  119. }
  120. @override
  121. Widget build(BuildContext context) {
  122. double width = MediaQuery.of(context).size.width;
  123. double height = MediaQuery.of(context).size.height;
  124. return Container(
  125. child: ChangeNotifierProvider<BaseListProvider<LiftCasesDetailModel>>(
  126. create: (_) => provider,
  127. child: Scaffold(
  128. appBar: MyAppBar(
  129. centerTitle: '工作台',
  130. isFun: true,
  131. fun: () {
  132. Navigator.popUntil(context, ModalRoute.withName('/home'));
  133. },
  134. ),
  135. body: Container(
  136. child: Stack(
  137. children: <Widget>[
  138. Column(
  139. children: <Widget>[
  140. _hasData
  141. ? Container(
  142. height: ScreenUtil().setWidth(150),
  143. decoration: BoxDecoration(
  144. gradient: const LinearGradient(
  145. colors: [Color(0xFF00D9FF), Color(0xFF0287FF)],
  146. ),
  147. ),
  148. child: Column(
  149. children: <Widget>[
  150. Container(
  151. child: Row(
  152. crossAxisAlignment: CrossAxisAlignment.start,
  153. children: <Widget>[
  154. Container(
  155. margin: EdgeInsets.only(
  156. left: ScreenUtil().setWidth(10),
  157. right: ScreenUtil().setWidth(10),
  158. top: ScreenUtil().setWidth(5)),
  159. decoration: BoxDecoration(
  160. borderRadius: BorderRadius.circular(
  161. ScreenUtil().setWidth(25)),
  162. ),
  163. child: Container(
  164. width: ScreenUtil().setWidth(50),
  165. height: ScreenUtil().setWidth(70),
  166. child: Stack(
  167. children: <Widget>[
  168. Container(
  169. padding: EdgeInsets.only(left:ScreenUtil().setWidth(3)),
  170. child: ClipRRect(
  171. borderRadius: BorderRadius.all(
  172. Radius.circular(50)),
  173. child: LoadNetworkImage(
  174. // image: AssetImage(i['img']),
  175. FlutterStars.SpUtil.getString(
  176. "avatarUrl"),
  177. width: ScreenUtil().setWidth(44),
  178. height: ScreenUtil().setWidth(44),
  179. // alignment: Alignment.centerLeft,
  180. ),
  181. ),
  182. ),
  183. Positioned(
  184. top:ScreenUtil().setWidth(34),
  185. left: 0,
  186. child: LoadAssetImage(
  187. // image: AssetImage(i['img']),
  188. getLevel(detailObj.expertLevel),
  189. width: ScreenUtil().setWidth(50),
  190. height: ScreenUtil().setWidth(13),
  191. // alignment: Alignment.centerLeft,
  192. ),
  193. )
  194. ],
  195. ),
  196. )
  197. ),
  198. Expanded(
  199. child: Container(
  200. padding: EdgeInsets.only(
  201. right: ScreenUtil().setWidth(15),bottom: detailObj.platformInvitedFlag==0?ScreenUtil().setWidth(20):ScreenUtil().setWidth(35)),
  202. child: Column(
  203. crossAxisAlignment:
  204. CrossAxisAlignment.start,
  205. children: <Widget>[
  206. Text(
  207. detailObj.name ?? '',
  208. style: TextStyle(
  209. color: Colors.white,
  210. fontSize:
  211. ScreenUtil().setSp(18)),
  212. ),
  213. Text(
  214. detailObj.proficiencyBrandName ?? '',
  215. style: TextStyle(
  216. color: Colors.white,
  217. fontSize:
  218. ScreenUtil().setSp(14)),
  219. // textAlign:TextAlign.start,
  220. overflow: TextOverflow.ellipsis,
  221. ),
  222. detailObj.platformInvitedFlag==0?Container(
  223. padding:EdgeInsets.only(left:5,right:5),
  224. margin: EdgeInsets.only(right:5,top:10),
  225. // color:Colors.red,
  226. decoration: BoxDecoration(
  227. borderRadius: BorderRadius.circular(1.0),
  228. border: Border.all(
  229. width:0.5,
  230. color:Color(0xffB0E2FF),
  231. ),
  232. ),
  233. child:Text(
  234. "特邀专家",
  235. style: TextStyle(
  236. color:Colors.white,
  237. fontSize:ScreenUtil().setSp(12)
  238. ),
  239. textAlign:TextAlign.center,
  240. ),
  241. ):Container(child: null,)
  242. ],
  243. ),
  244. ),
  245. ),
  246. GestureDetector(
  247. onTap: () {
  248. setState(() {
  249. isOnline = !isOnline;
  250. if(isOnline==true){
  251. updateUser(1);
  252. }else {
  253. updateUser(0);
  254. }
  255. });
  256. },
  257. child: Container(
  258. margin: EdgeInsets.only(right: 20),
  259. child: LoadAssetImage(
  260. // image: AssetImage(i['img']),
  261. isOnline
  262. ? "tab_first/upline"
  263. : "tab_first/downline",
  264. width: ScreenUtil().setWidth(58),
  265. height: ScreenUtil().setWidth(26),
  266. // alignment: Alignment.centerLeft,
  267. ),
  268. ),
  269. )
  270. ],
  271. ),
  272. ),
  273. Container(
  274. child: Row(
  275. crossAxisAlignment: CrossAxisAlignment.center,
  276. mainAxisAlignment:
  277. MainAxisAlignment.spaceAround,
  278. children: <Widget>[
  279. Container(
  280. child: Column(
  281. crossAxisAlignment:
  282. CrossAxisAlignment.center,
  283. children: <Widget>[
  284. Text(
  285. detailObj.serviceCounts!=null?detailObj.serviceCounts.toString():"",
  286. style: TextStyle(
  287. color: Colors.white,
  288. fontSize:
  289. ScreenUtil().setSp(16)),
  290. textAlign: TextAlign.start,
  291. ),
  292. Text(
  293. "服务次数",
  294. style: TextStyle(
  295. color: Colors.white,
  296. fontSize:
  297. ScreenUtil().setSp(14)),
  298. textAlign: TextAlign.start,
  299. ),
  300. ],
  301. ),
  302. ),
  303. Container(
  304. child: Column(
  305. crossAxisAlignment:
  306. CrossAxisAlignment.center,
  307. children: <Widget>[
  308. Text(
  309. detailObj.adoptCounts!=null?detailObj.adoptCounts.toString():"",
  310. style: TextStyle(
  311. color: Colors.white,
  312. fontSize:
  313. ScreenUtil().setSp(16)),
  314. textAlign: TextAlign.start,
  315. ),
  316. Text(
  317. "采纳次数",
  318. style: TextStyle(
  319. color: Colors.white,
  320. fontSize:
  321. ScreenUtil().setSp(14)),
  322. textAlign: TextAlign.start,
  323. ),
  324. ],
  325. ),
  326. ),
  327. ],
  328. ),
  329. ),
  330. ],
  331. ),
  332. )
  333. : Container(child: null),
  334. Expanded(
  335. flex: 1,
  336. child: Consumer<BaseListProvider<LiftCasesDetailModel>>(
  337. builder: (_, provider, __) {
  338. return MyListView(
  339. key: Key('liftcase_list'),
  340. pageSize: 10,
  341. itemCount: provider.list.length,
  342. stateType: provider.stateType,
  343. onRefresh: _onRefresh,
  344. loadMore: _loadMore,
  345. hasMore: provider.hasMore,
  346. itemBuilder: (_, index) {
  347. return WorkListWidget(item: provider.list[index]);
  348. },
  349. );
  350. }))
  351. ],
  352. ),
  353. ],
  354. ))),
  355. ));
  356. }
  357. Future _onRefresh() async {
  358. _page = 1;
  359. await presenter.getLiftcaseList(_page);
  360. }
  361. Future _loadMore() async {
  362. _page++;
  363. await presenter.getLiftcaseList(_page);
  364. }
  365. @override
  366. LiftcaseListPresenter createPresenter() {
  367. return LiftcaseListPresenter();
  368. }
  369. }
  370. class WorkListWidget extends StatelessWidget {
  371. WorkListWidget({Key key, this.item}) : super(key: key);
  372. dynamic item;
  373. @override
  374. Widget build(BuildContext context) {
  375. double width = MediaQuery.of(context).size.width;
  376. return Container(
  377. // height: 20,
  378. padding: EdgeInsets.only(
  379. bottom: ScreenUtil().setWidth(20), top: ScreenUtil().setWidth(10)),
  380. decoration: BoxDecoration(
  381. border: Border(
  382. bottom: BorderSide(width: 0.5, color: Colours.line),
  383. ),
  384. ),
  385. child: Row(
  386. crossAxisAlignment: CrossAxisAlignment.start,
  387. children: <Widget>[
  388. Expanded(
  389. child: GestureDetector(
  390. behavior: HitTestBehavior.opaque,
  391. onTap: () {
  392. if (item.dataTable == 1) {
  393. NavigatorUtils.push(context,
  394. "${BbsRouter.recommendAsk}?id=${item.id}&type=1");
  395. } else if (item.dataTable == 2) {
  396. NavigatorUtils.push(context,
  397. "${BbsRouter.recommendAsk}?id=${item.id}&type=2");
  398. }
  399. },
  400. child: Row(
  401. crossAxisAlignment: CrossAxisAlignment.start,
  402. children: <Widget>[
  403. Container(
  404. margin: EdgeInsets.only(
  405. left: ScreenUtil().setWidth(10),
  406. right: ScreenUtil().setWidth(10),
  407. top: ScreenUtil().setWidth(5),
  408. ),
  409. decoration: BoxDecoration(
  410. borderRadius:
  411. BorderRadius.circular(ScreenUtil().setWidth(22)),
  412. ),
  413. child: ClipRRect(
  414. borderRadius: BorderRadius.all(Radius.circular(50)),
  415. child: LoadNetworkImage(
  416. // image: AssetImage(i['img']),
  417. item.avatarUrl,
  418. width: ScreenUtil().setWidth(43),
  419. height: ScreenUtil().setWidth(43),
  420. // alignment: Alignment.centerLeft,
  421. ),
  422. ),
  423. ),
  424. Expanded(
  425. child: Container(
  426. padding:
  427. EdgeInsets.only(right: ScreenUtil().setWidth(15)),
  428. child: Column(
  429. children: <Widget>[
  430. Container(
  431. child: Row(
  432. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  433. children: <Widget>[
  434. Row(
  435. crossAxisAlignment: CrossAxisAlignment.start,
  436. children: <Widget>[
  437. Container(
  438. width: width * 0.3,
  439. child: Text(
  440. item.name ?? "",
  441. style: TextStyle(
  442. color: Color(0xff333333),
  443. fontSize: ScreenUtil().setSp(17),
  444. ),
  445. textAlign: TextAlign.start,
  446. maxLines: 1,
  447. overflow: TextOverflow.ellipsis,
  448. ),
  449. ),
  450. Container(
  451. padding: EdgeInsets.only(left: 5),
  452. child: Text(
  453. item.dataTable == 1 ? "问诊服务" : "出诊服务",
  454. style: TextStyle(
  455. color: Color(0xff0288FF),
  456. fontSize: ScreenUtil().setSp(14),
  457. ),
  458. textAlign: TextAlign.start,
  459. ),
  460. )
  461. ],
  462. ),
  463. Container(
  464. child: Text(
  465. OrderConstant.getStatusName(
  466. item.statuz, item.dataTable, arrivedFlag: item.arrivedFlag),
  467. style: TextStyle(
  468. color: Color(0xffF84203),
  469. fontSize: ScreenUtil().setSp(14),
  470. ),
  471. textAlign: TextAlign.end,
  472. ),
  473. )
  474. ],
  475. ),
  476. ),
  477. Container(
  478. child: Row(
  479. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  480. children: <Widget>[
  481. Row(
  482. crossAxisAlignment: CrossAxisAlignment.center,
  483. children: <Widget>[
  484. Text(
  485. item.createTime != null
  486. ? DateUtils.instance.getFormartData(
  487. timeSamp: item.createTime,
  488. format: "yyyy-MM-dd")
  489. : "",
  490. style: TextStyle(
  491. color: Color(0xff999999),
  492. fontSize: ScreenUtil().setSp(13),
  493. ),
  494. textAlign: TextAlign.start,
  495. ),
  496. Container(
  497. padding: EdgeInsets.only(left: 5),
  498. child: Text(
  499. item.brandName ?? "",
  500. style: TextStyle(
  501. color: Color(0xff999999),
  502. fontSize: ScreenUtil().setSp(13),
  503. ),
  504. textAlign: TextAlign.start,
  505. ),
  506. )
  507. ],
  508. ),
  509. ],
  510. ),
  511. ),
  512. item.dataTable == 2
  513. ? Container(
  514. child: Row(
  515. mainAxisAlignment:
  516. MainAxisAlignment.spaceBetween,
  517. children: <Widget>[
  518. Row(
  519. crossAxisAlignment:
  520. CrossAxisAlignment.center,
  521. children: <Widget>[
  522. Text(
  523. '出诊时间:',
  524. style: TextStyle(
  525. color: Color(0xff666666),
  526. fontSize: ScreenUtil().setSp(14),
  527. ),
  528. textAlign: TextAlign.start,
  529. ),
  530. Container(
  531. padding: EdgeInsets.only(left: 5),
  532. child: Text(
  533. item.arrivedTime != null
  534. ? DateUtils.instance
  535. .getFormartData(
  536. timeSamp:
  537. item.arrivedTime,
  538. format: "yyyy-MM-dd HH:mm")
  539. : "",
  540. style: TextStyle(
  541. color: Color(0xff666666),
  542. fontSize:
  543. ScreenUtil().setSp(14),
  544. ),
  545. textAlign: TextAlign.start,
  546. ),
  547. )
  548. ],
  549. ),
  550. ],
  551. ),
  552. )
  553. : Container(child: null),
  554. item.dataTable == 2
  555. ? Container(
  556. child: Row(
  557. mainAxisAlignment:
  558. MainAxisAlignment.spaceBetween,
  559. children: <Widget>[
  560. Row(
  561. crossAxisAlignment:
  562. CrossAxisAlignment.center,
  563. children: <Widget>[
  564. Text(
  565. '出诊地点:',
  566. style: TextStyle(
  567. color: Color(0xff666666),
  568. fontSize: ScreenUtil().setSp(14),
  569. ),
  570. textAlign: TextAlign.start,
  571. ),
  572. Container(
  573. width: width*0.6,
  574. padding: EdgeInsets.only(left: 5),
  575. child: Text(
  576. item.address ?? "",
  577. style: TextStyle(
  578. color: Color(0xff666666),
  579. fontSize:
  580. ScreenUtil().setSp(14),
  581. ),
  582. textAlign: TextAlign.start,
  583. maxLines: 1,
  584. overflow: TextOverflow.ellipsis,
  585. ),
  586. )
  587. ],
  588. ),
  589. ],
  590. ),
  591. )
  592. : Container(child: null),
  593. Container(
  594. child: Row(
  595. crossAxisAlignment: CrossAxisAlignment.start,
  596. children: <Widget>[
  597. Container(
  598. width: width*0.7,
  599. child: Text(
  600. '问题描述:' +
  601. (item.expression != null
  602. ? item.expression
  603. : ""),
  604. style: TextStyle(
  605. color: Color(0xff666666),
  606. fontSize: ScreenUtil().setSp(14),
  607. ),
  608. textAlign: TextAlign.start,
  609. maxLines: 1,
  610. overflow: TextOverflow.ellipsis,
  611. ),
  612. )
  613. ],
  614. ),
  615. ),
  616. // list[i]["type"] != "1"
  617. // ? Container(
  618. // margin: EdgeInsets.only(top: 6),
  619. // child: Row(
  620. // children: <Widget>[
  621. // Container(
  622. // padding:
  623. // EdgeInsets.only(right: 5),
  624. // child: Text(
  625. // "¥${list[i]["price"]}",
  626. // style: TextStyle(
  627. // color: Color(0xffFD0808),
  628. // fontSize:
  629. // ScreenUtil().setSp(15)),
  630. // textAlign: TextAlign.start,
  631. // ),
  632. // ),
  633. // ],
  634. // ),
  635. // )
  636. // : Container(child: null)
  637. ],
  638. ),
  639. ),
  640. )
  641. ],
  642. ),
  643. ),
  644. ),
  645. ],
  646. ),
  647. );
  648. }
  649. }