table_manager_page.dart 36.6 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
import 'dart:async';

import 'package:common_utils/common_utils.dart';
import 'package:dotted_border/dotted_border.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/area.dart';
import 'package:one_key/models/notebook_detail.dart';
import 'package:one_key/models/tableOuter.dart';
import 'package:one_key/pages/table/area_item_table.dart';
import 'package:one_key/provider/table_manager_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/app_bar.dart';
import 'package:one_key/widgets/area_item.dart';
import 'package:one_key/widgets/common_button.dart';
import 'package:one_key/widgets/page_exception.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/table_item.dart';
import 'package:one_key/models/table.dart' as t;
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
import 'dart:convert' as convert;
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';

const scrollDuration = Duration(microseconds: 500);

class TableManagerPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new TableManagerPageState();
  }
}

class TableManagerPageState extends State<TableManagerPage> {
  TableManagerModel tableManagerModel;
  final ItemScrollController itemScrollController = ItemScrollController();
  bool isTap = false;
  int min;
  int max;
  int _selectIndex;
  ScrollController _areaController = ScrollController();

  final ItemPositionsListener itemPositionsListener =
      ItemPositionsListener.create();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    LogUtil.v("table_manager_page initState");
    tableManagerModel = Provider.of<TableManagerModel>(context, listen: false);
    WidgetsBinding.instance.addPostFrameCallback((_) {
      tableManagerModel.initTime(context);
      EventBus().on("refresh_tablemanager", (arg) {
        //订座-完成预订 刷新管理桌位
        tableManagerModel.getReserveList(context);
        print(tableManagerModel);
      });
    });
  }

  Widget list(List data) => ScrollablePositionedList.builder(
        itemCount: data.length,
        itemBuilder: (context, index) => item(index),
        itemScrollController: itemScrollController,
        itemPositionsListener: itemPositionsListener,
        reverse: false,
        scrollDirection: Axis.vertical,
      );

  void scrollTo(int index) => itemScrollController.scrollTo(
      index: index,
      duration: scrollDuration,
      curve: Curves.easeInOutCubic,
      alignment: 0);

  void jumpTo(int index) =>
      itemScrollController.jumpTo(index: index, alignment: 0);

  /// Generate item number [i].
  Widget item(int i) {
    int heightSum;
    int length =
        tableManagerModel.areaTableMap[tableManagerModel.areas[i].name].length;
    if (length % 4 == 0) {
      heightSum = (length / 4).floor();
    } else {
      heightSum = (length / 4).floor() + 1;
    }
    return Container(
        height: ScreenUtil().setWidth(185) * heightSum +
            heightSum * 10 +
            ScreenUtil().setWidth(60 * 2),
        child: Column(
          children: [
            Container(
              alignment: Alignment.center,
              height: ScreenUtil().setWidth(30 * 2),
              child: Text(tableManagerModel.areas[i].name,
                  style: TextStyle(
                      fontSize: ScreenUtil().setWidth(30),
                      color: MyColours.color_666666)),
            ),
            Container(
                constraints: BoxConstraints(
                    minHeight: ScreenUtil().setWidth(185) * heightSum),
                height: ScreenUtil().setWidth(200) * heightSum + heightSum * 10,
                child: GridView.builder(
                  physics: NeverScrollableScrollPhysics(),
                  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 4,
                    childAspectRatio: 8 / 9,
                  ),
                  itemBuilder: (context, index) {
                    return Selector<TableManagerModel, t.Table>(
                      shouldRebuild: (pre, next) => true,
                      selector: (context, model) => model.currentTables[index],
                      builder: (context, table, _) {
                        return TableItem(table, onSelected: (table) {
                          if ((table as t.Table).selected) {
                            tableManagerModel.selectTables.add(table);
                          } else {
                            tableManagerModel.selectTables
                                .removeWhere((t) => t.id == table.id);
                          }
                          DialogUtil.showTableManagerDialog(context, table)
                              .then((value) {
                            if (value != null) {
                              switch (value) {
                                case 1: //查看详情
                                  NavigatorUtil.goNotebookDetailPage(context,
                                      tableManagerModel.tableMap[table.id].id);
                                  break;
                                case 2: //订座
                                  NavigatorUtil.goNoteBookChangePage(
                                      context,
                                      NotebookDetail.fromTableManager(
                                          tableManagerModel.getCurrDdateStr(),
                                          tableManagerModel.currTimeIndex
                                              .toString(),
                                          table),
                                      "");
                                  break;
                                case 3: //停用,启用桌位
                                  Map<String, String> params = {
                                    "id": (table as t.Table).id,
                                    "status": (table as t.Table).enable == "1"
                                        ? "0"
                                        : "1"
                                  };
                                  tableManagerModel
                                      .setSwitchStatus(context, params)
                                      .then((value) {
                                    if (value != null) {
                                      (table as t.Table).enable = ((int.parse(
                                                      (table as t.Table)
                                                          .enable) +
                                                  1) %
                                              2)
                                          .toString();
                                      if ((table as t.Table).enable == "1") {
                                        for (Area area
                                            in tableManagerModel.areas) {
                                          if (area.name ==
                                              tableManagerModel.currentArea) {
                                            if (table.sign != '5' &&
                                                table.sign != '1') {
                                              //已预订
                                              area.count++;
                                            }
                                            break;
                                          }
                                        }
                                      } else {
                                        for (Area area
                                            in tableManagerModel.areas) {
                                          if (area.name ==
                                              tableManagerModel.currentArea) {
                                            if (table.sign != '5' &&
                                                table.sign != '1') {
                                              //已预订
                                              area.count--;
                                            }
                                            break;
                                          }
                                        }
                                      }
                                      tableManagerModel.notifyListeners();
                                    }
                                  });
                                  break;
                              }
                            }
                          });
                        },
                            canSelected: false,
                            fromPage: 'table_manage',
                            tableMap: tableManagerModel.tableMap,
                            rid: "");
                      },
                    );
                  },
                  itemCount: tableManagerModel
                      .areaTableMap[tableManagerModel.areas[i].name].length,
                )),
          ],
        ));
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<TableManagerModel>(
      builder: (context, model, child) {
        return Column(
          children: <Widget>[
            SystemAppBar("桌位", showLeading: false),
            Container(
              color: MyColours.color_ffffff,
              width: double.infinity,
              padding:
                  EdgeInsets.symmetric(vertical: ScreenUtil().setHeight(16)),
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    child: Center(
                      child: GestureDetector(
                        onTap: () {
                          DialogUtil.showCalendarDialog(
                                  context, tableManagerModel.dateTime)
                              .then((day) {
                            if (day != null) {
                              tableManagerModel.createDateText(context, day);
                            }
                          });
                        },
                        child: Container(
                          child: Text(
                            tableManagerModel.dateText,
                            style: TextStyle(
                                color: MyColours.color_199095,
                                fontSize: ScreenUtil().setSp(34)),
                          ),
                        ),
                      ),
                    ),
                  ),
                  MyDivider(
                    ScreenUtil().setWidth(2),
                    ScreenUtil().setHeight(68),
                    color: MyColours.color_E0E0E0,
                  ),
                  Expanded(
                    child: Padding(
                      padding: EdgeInsets.symmetric(
                          horizontal: ScreenUtil().setWidth(30)),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Offstage(
                              offstage:
                                  tableManagerModel.morning == "00:00-00:00"
                                      ? true
                                      : false,
                              child: Padding(
                                  padding: EdgeInsets.only(
                                      right: ScreenUtil().setWidth(18)),
                                  child: CommonButton(
                                    content: "早市",
                                    state: tableManagerModel.currTimeIndex == 1
                                        ? 1
                                        : 0,
                                    width: 92,
                                    height: 48,
                                    fontSize: 32,
                                    onPress: () {
                                      if (tableManagerModel.currTimeIndex == 1)
                                        return;
                                      tableManagerModel.currTimeIndex = 1;
                                      tableManagerModel.getReserveList(context);
                                    },
                                  ))),
                          Offstage(
                              offstage: tableManagerModel.noon == "00:00-00:00"
                                  ? true
                                  : false,
                              child: Padding(
                                  padding: EdgeInsets.only(
                                      right: ScreenUtil().setWidth(18)),
                                  child: CommonButton(
                                    content: "午市",
                                    state: tableManagerModel.currTimeIndex == 2
                                        ? 1
                                        : 0,
                                    width: 92,
                                    height: 48,
                                    fontSize: 32,
                                    onPress: () {
                                      if (tableManagerModel.currTimeIndex == 2)
                                        return;
                                      tableManagerModel.currTimeIndex = 2;
                                      tableManagerModel.getReserveList(context);
                                    },
                                  ))),
                          Offstage(
                            offstage: tableManagerModel.night == "00:00-00:00"
                                ? true
                                : false,
                            child: Container(
                                // padding: EdgeInsets.symmetric(
                                //     horizontal: ScreenUtil().setWidth(10)),
                                child: CommonButton(
                              content: "晚市",
                              state:
                                  tableManagerModel.currTimeIndex == 3 ? 1 : 0,
                              width: 92,
                              height: 48,
                              fontSize: 32,
                              onPress: () {
                                if (tableManagerModel.currTimeIndex == 3)
                                  return;
                                tableManagerModel.currTimeIndex = 3;
                                tableManagerModel.getReserveList(context);
                              },
                            )),
                          ),
                        ],
                      ),
                    ),
                  )
                ],
              ),
            ),
            Expanded(
              child: Consumer<TableManagerModel>(
                builder: (context, model, child) {
                  if (model.pageState != PageState.Success) {
                    return ExceptionPage(
                      pageState: model.pageState,
                      callback: () {
                        if (tableManagerModel.tableOuterList.isEmpty) {
                          tableManagerModel.getTableList(context);
                        } else {
                          tableManagerModel.getReserveList(context);
                        }
                      },
                      emptyMsg: "暂时没有桌位哦",
                      emptyImg: "empty_search",
                      showMsg: "加载中,请稍后...",
                    );
                  } else {
                    return Container(
                      color: MyColours.color_ffffff,
                      child: Column(children: <Widget>[
                        VEmptyView(20),
                        ValueListenableBuilder<Iterable<ItemPosition>>(
                            valueListenable:
                                itemPositionsListener.itemPositions,
                            builder: (context, positions, child) {
                              if (positions.isNotEmpty) {
                                // max = positions
                                //     .where((ItemPosition position) =>
                                //         position.itemLeadingEdge < 1)
                                //     .reduce((ItemPosition max,
                                //             ItemPosition position) =>
                                //         position.itemLeadingEdge >
                                //                 max.itemLeadingEdge
                                //             ? position
                                //             : max)
                                //     .index;
                                min = positions
                                    .where((ItemPosition position) =>
                                        position.itemTrailingEdge > 0)
                                    .reduce((ItemPosition min,
                                            ItemPosition position) =>
                                        position.itemTrailingEdge <
                                                min.itemTrailingEdge
                                            ? position
                                            : min)
                                    .index;

                                if (isTap) {
                                  if (min >= _selectIndex) {
                                    _selectIndex = min;
                                  } else {
                                    _selectIndex = _selectIndex;
                                  }
                                  isTap = false;
                                } else {
                                  _selectIndex = min;
                                }
                                tableManagerModel.currentArea =
                                    tableManagerModel.areas[_selectIndex].name;
                              }
                              return Container(
                                height: ScreenUtil().setWidth(50),
                                color: MyColours.color_ffffff,
                                margin: EdgeInsets.only(
                                    bottom: ScreenUtil().setWidth(20)),
                                child: ListView.builder(
                                  controller: _areaController,
                                  scrollDirection: Axis.horizontal,
                                  itemBuilder: (context, index) {
                                    if (index ==
                                            tableManagerModel.areas.length ||
                                        tableManagerModel.areas.length == 0) {
                                      return InkWell(
                                          onTap: () async {
                                            //添加区域弹框
                                            await DialogUtil
                                                .openCreateAreaDialog(context,
                                                    onTap: (value) async {
                                              print(value);
                                              //添加区域
                                              bool success =
                                                  await tableManagerModel
                                                      .addTableAreas(
                                                          context, value);
                                              print(success);
                                              if (success) {
                                                Utils.showToast('添加成功!');
                                                TableOuter tableOuter =
                                                    TableOuter();
                                                tableOuter.name = value;
                                                tableOuter.list = [];
                                                tableManagerModel.tableOuterList
                                                    .add(tableOuter);
                                                tableManagerModel.initData();
                                                Timer(
                                                    Duration(milliseconds: 500),
                                                    () => _areaController
                                                        .jumpTo(_areaController
                                                            .position
                                                            .maxScrollExtent));

                                                // await tableManagerModel
                                                //     .getTableList(context);
                                                // await tableManagerModel
                                                //     .initData();
                                              }
                                            });
                                          },
                                          child: DottedBorder(
                                            dashPattern: [5, 5, 5, 5],
                                            borderType: BorderType.RRect,
                                            radius: Radius.circular(
                                                ScreenUtil().setWidth(30)),
                                            // padding: EdgeInsets.all(ScreenUtil().setWidth(70)),
                                            color: MyColours.color_199095,
                                            strokeWidth:
                                                ScreenUtil().setWidth(2),
                                            child: ClipRRect(
                                              borderRadius: BorderRadius.all(
                                                  Radius.circular(ScreenUtil()
                                                      .setWidth(30))),
                                              child: Container(
                                                height: ScreenUtil()
                                                    .setWidth(50 * 2),
                                                width: ScreenUtil()
                                                    .setWidth(60 * 2),
                                                child: Column(
                                                  mainAxisAlignment:
                                                      MainAxisAlignment.center,
                                                  children: [
                                                    Image.asset(
                                                        Utils.getImgPath(
                                                            'add_store'),
                                                        width: ScreenUtil()
                                                            .setWidth(22)),
                                                  ],
                                                ),
                                              ),
                                            ),
                                          ));
                                    } else {
                                      return Selector<TableManagerModel, Area>(
                                        selector: (context, model) =>
                                            model.areas[index],
                                        builder: (context, area, _) {
                                          return AreaItemTable(area,
                                              tableManagerModel.currentArea,
                                              (area) {
                                            isTap = true;
                                            scrollTo(index);
                                            // setState(() {
                                            tableManagerModel.currentArea =
                                                tableManagerModel
                                                    .areas[index].name;
                                            tableManagerModel.currentTables =
                                                tableManagerModel.areaTableMap[
                                                    tableManagerModel
                                                        .currentArea];
                                            _selectIndex = index;
                                            // });
                                            // setState(() {
                                            //   tableManagerModel.currentArea =
                                            //       (area as Area).name;
                                            //   tableManagerModel.currentTables =
                                            //       tableManagerModel.areaTableMap[
                                            //           tableManagerModel
                                            //               .currentArea];
                                            // });
                                          });
                                        },
                                      );
                                    }
                                  },

                                  // itemExtent: ScreenUtil().setHeight(207),
                                  itemCount: tableManagerModel.areas.length + 1,
                                ),
                              );
                            }),
                        Expanded(
                          child: Container(
                              color: MyColours.color_ffffff,
                              padding: EdgeInsets.symmetric(
                                  horizontal: ScreenUtil().setWidth(40)),
                              width: double.infinity,
                              child: list(tableManagerModel.areas)),
                        ),
                        //   Expanded(
                        //     child: Container(
                        //         color: MyColours.color_e5e5e5,
                        //         padding: EdgeInsets.symmetric(
                        //             vertical: ScreenUtil().setHeight(10),
                        //             horizontal: ScreenUtil().setWidth(9)),
                        //         child: Column(
                        //           children: [
                        //             Expanded(
                        //                 child: GridView.builder(
                        //               gridDelegate:
                        //                   SliverGridDelegateWithFixedCrossAxisCount(
                        //                       crossAxisCount: 3,
                        //                       childAspectRatio: 8 / 9),
                        //               itemBuilder: (context, index) {
                        //                 return Selector<TableManagerModel,
                        //                     t.Table>(
                        //                   shouldRebuild: (pre, next) => true,
                        //                   selector: (context, model) =>
                        //                       model.currentTables[index],
                        //                   builder: (context, table, _) {
                        //                     return TableItem(table,
                        //                         onSelected: (table) {
                        //                       if ((table as t.Table).selected) {
                        //                         tableManagerModel.selectTables
                        //                             .add(table);
                        //                       } else {
                        //                         tableManagerModel.selectTables
                        //                             .removeWhere((t) =>
                        //                                 t.id == table.id);
                        //                       }
                        //                       DialogUtil.showTableManagerDialog(
                        //                               context, table)
                        //                           .then((value) {
                        //                         if (value != null) {
                        //                           switch (value) {
                        //                             case 1: //查看详情
                        //                               NavigatorUtil
                        //                                   .goNotebookDetailPage(
                        //                                       context,
                        //                                       tableManagerModel
                        //                                           .tableMap[
                        //                                               table.id]
                        //                                           .id);
                        //                               break;
                        //                             case 2: //订座
                        //                               NavigatorUtil.goNoteBookChangePage(
                        //                                   context,
                        //                                   NotebookDetail.fromTableManager(
                        //                                       tableManagerModel
                        //                                           .getCurrDdateStr(),
                        //                                       tableManagerModel
                        //                                           .currTimeIndex
                        //                                           .toString(),
                        //                                       table),
                        //                                   "");
                        //                               break;
                        //                             case 3: //停用,启用桌位
                        //                               Map<String, String>
                        //                                   params = {
                        //                                 "id": (table as t.Table)
                        //                                     .id,
                        //                                 "status": (table as t
                        //                                                 .Table)
                        //                                             .enable ==
                        //                                         "1"
                        //                                     ? "0"
                        //                                     : "1"
                        //                               };
                        //                               tableManagerModel
                        //                                   .setSwitchStatus(
                        //                                       context, params)
                        //                                   .then((value) {
                        //                                 if (value != null) {
                        //                                   (table as t.Table)
                        //                                           .enable =
                        //                                       ((int.parse((table as t.Table)
                        //                                                       .enable) +
                        //                                                   1) %
                        //                                               2)
                        //                                           .toString();
                        //                                   if ((table as t.Table)
                        //                                           .enable ==
                        //                                       "1") {
                        //                                     for (Area area
                        //                                         in tableManagerModel
                        //                                             .areas) {
                        //                                       if (area.name ==
                        //                                           tableManagerModel
                        //                                               .currentArea) {
                        //                                         if (table.sign !=
                        //                                                 '5' &&
                        //                                             table.sign !=
                        //                                                 '1') {
                        //                                           //已预订
                        //                                           area.count++;
                        //                                         }
                        //                                         break;
                        //                                       }
                        //                                     }
                        //                                   } else {
                        //                                     for (Area area
                        //                                         in tableManagerModel
                        //                                             .areas) {
                        //                                       if (area.name ==
                        //                                           tableManagerModel
                        //                                               .currentArea) {
                        //                                         if (table.sign !=
                        //                                                 '5' &&
                        //                                             table.sign !=
                        //                                                 '1') {
                        //                                           //已预订
                        //                                           area.count--;
                        //                                         }
                        //                                         break;
                        //                                       }
                        //                                     }
                        //                                   }
                        //                                   tableManagerModel
                        //                                       .notifyListeners();
                        //                                 }
                        //                               });
                        //                               break;
                        //                           }
                        //                         }
                        //                       });
                        //                     },
                        //                         canSelected: false,
                        //                         fromPage: 'table_manage',
                        //                         tableMap:
                        //                             tableManagerModel.tableMap,
                        //                         rid: "");
                        //                   },
                        //                 );
                        //               },
                        //               itemCount: tableManagerModel
                        //                   .currentTables.length,
                        //             )),
                        //           ],
                        //         )),
                        //   )
                        // ],
                      ]),
                    );
                  }
                },
              ),
            ),
          ],
        );
      },
    );
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    EventBus().off("refresh_tablemanager");
  }
}