table_manager_model.dart 12.3 KB


import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/constant/error.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/area.dart';
import 'package:one_key/models/notebook.dart';
import 'package:one_key/models/tableOuter.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/models/table.dart' as t;
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:provider/provider.dart';

import 'notebook_model.dart';

class TableManagerModel with ChangeNotifier{

  List<Area> areas = []; //区域列表

  List<t.Table> selectTables = []; //选择的桌位

  List<TableOuter> tableOuterList = []; //区域-桌位列表

  Map<String, List<t.Table>> areaTableMap = {}; //区域-桌位Map
  List<t.Table> currentTables=[];//当前显示的区域-桌位

  Map<String, Notebook> tableMap = {}; //记录已预订桌位对应的订单

  String currentArea; //当前选中区域

  DateTime dateTime=DateTime.now();

  String dateText = ""; //当前显示日期时间
  int currTimeIndex = 1; //当前选中时间段
  String morning; //早市时间段
  String noon; //午市时间段
  String night; //晚市时间段
  UserModel userModel;

  PageState pageState = PageState.Loading;

  Map dailyMap = {}; // 早市对应半点钟,午市对应半点钟、晚市对应半点钟

  //初始化时间
  initTime(BuildContext context) async {
    userModel = Provider.of<UserModel>(context, listen: false);
    dateTime = DateTime.now();
    dateText = Utils.addZeroNumber(dateTime.month) +
        "月" +
        Utils.addZeroNumber(dateTime.day) +
        "日" +
        "  今天";
    morning =
    userModel.user.morning.isEmpty ? "00:00-00:00" : userModel.user.morning;
    noon = userModel.user.noon.isEmpty ? "00:00-00:00" : userModel.user.noon;
    night = userModel.user.night.isEmpty ? "00:00-00:00" : userModel.user.night;
    userModel.user.morning.isEmpty?dailyMap.putIfAbsent("morning", ()=>""):dailyMap.putIfAbsent("morning", () => _getHourAndMinute(morning,1));
    userModel.user.noon.isEmpty?dailyMap.putIfAbsent("noon", ()=>""):dailyMap.putIfAbsent("noon", () => _getHourAndMinute(noon,2));
    userModel.user.night.isEmpty?dailyMap.putIfAbsent("night", ()=>""):dailyMap.putIfAbsent("night", () => _getHourAndMinute(night,3));
    if (dateTime.isBefore(DateTime.parse(dateTime.year.toString() +
        "-" +
        Utils.addZeroNumber(dateTime.month) +
        "-" +
        Utils.addZeroNumber(dateTime.day) +
        " " +
        morning.split("-")[1] +
        ":00"))) {
      //未过早市
      currTimeIndex = 1;
    } else if (dateTime.isAfter(DateTime.parse(dateTime.year.toString() +
        "-" +
        Utils.addZeroNumber(dateTime.month) +
        "-" +
        Utils.addZeroNumber(dateTime.day) +
        " " +
        morning.split("-")[1] +
        ":00")) &&
        dateTime.isBefore(DateTime.parse(dateTime.year.toString() +
            "-" +
            Utils.addZeroNumber(dateTime.month) +
            "-" +
            Utils.addZeroNumber(dateTime.day) +
            " " +
            noon.split("-")[1] +
            ":00"))) {
      //过了早市,未过午市
      currTimeIndex = 2;
    } else if (dateTime.isAfter(DateTime.parse(dateTime.year.toString() +
        "-" +
        Utils.addZeroNumber(dateTime.month) +
        "-" +
        Utils.addZeroNumber(dateTime.day) +
        " " +
        noon.split("-")[1] +
        ":00")) &&
        dateTime.isBefore(DateTime.parse(dateTime.year.toString() +
            "-" +
            Utils.addZeroNumber(dateTime.month) +
            "-" +
            Utils.addZeroNumber(dateTime.day) +
            " " +
            night.split("-")[1] +
            ":00"))) {
      //过了午市,未过晚市
      currTimeIndex = 3;
    } else {
      //过了晚市
      currTimeIndex = 3;
    }
    await getTableList(context);
    getReserveList(context);
  }

  getCurrDdateStr(){
    String currSelectTime="";
    int timeMillsNow=DateTime.now().millisecondsSinceEpoch;
    if(currTimeIndex==1){
      List<String> mornings=_getHourAndMinute(morning, 1);
      for(String temp in mornings){
        if(timeMillsNow<=DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "$temp:00"))){
          currSelectTime=temp;
          break;
        }
      }
    }else if(currTimeIndex==2){
      List<String> noons=_getHourAndMinute(noon, 2);
      for(String temp in noons){
        if(timeMillsNow<=DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "$temp:00"))){
          currSelectTime=temp;
          if(noons.contains("12:30")&&DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "$temp:00"))<DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "12:30:00"))){
            currSelectTime="12:30";
          }
          break;
        }
      }
    }else{
      List<String> nights=_getHourAndMinute(night, 3);
      for(String temp in nights){
        if(timeMillsNow<=DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "$temp:00"))){
          currSelectTime=temp;
          if(nights.contains("18:30")&&DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "$temp:00"))<DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "18:30:00"))){
            currSelectTime="18:30";
          }
          break;
        }
      }
    }
    LogUtil.v("currSelectTime:$currSelectTime");
    String ddateStr=DateUtil.getDateMsByTimeStr(DateUtil.formatDate(dateTime).replaceRange(11,19, "$currSelectTime:00")).toString();
    return ddateStr.substring(0,10);
  }

  //根据获取时间 11:00-12:30 获取30分钟间隔组装的数组
  _getHourAndMinute(
      String hourAndMinuteStr, int mnd) {
    List tempDate = hourAndMinuteStr.split("-");
    String beginDate = tempDate[0];
    String endDate = tempDate[1];
    List tempHour = beginDate.split(':');
    /*获取开始小时*/
    int beginHour = int.parse(tempHour[0]);
    /*获取开始分钟*/
    int beginMinute = int.parse(tempHour[1]);
    List<String> res = [];
    bool tempLimit = true;
    while (tempLimit) {
      String temp = _dealTime(beginHour, beginMinute);
      res.add(temp);
      if (temp == endDate) {
        tempLimit = false;
        break;
      }
      if (beginMinute == 30) {
        beginHour++;
        if (beginHour >= 24) {
          beginHour = 0;
        }
      }
      beginMinute = (beginMinute + 30) % 60;
    }
    return res;
  }

  /// 根据时间和分钟组装 格式:11:00
  _dealTime(int begin, int mm) {
    String sb = '';
    if (begin < 10) {
      sb = '0$begin';
    } else {
      sb = '$begin';
    }
    sb = '$sb:';
    if (mm < 10) {
      sb = '${sb}0${mm}';
    } else {
      sb = '${sb}${mm}';
    }
    return sb;
  }

  //获取桌位数据
  Future<List<TableOuter>> getTableList(BuildContext context) async {
    pageState = PageState.Loading;
    notifyListeners();
    Map<String, String> params = {"sellerid": userModel.user.sellerid};
    BaseResp<List> baseResp = await DioUtil()
        .request<List>(context, Method.get, HttpUrl.table_list,
        data: params,showLoading: false)
        .catchError((error) {
      print(error.toString());
      if (error is MyError) {
        switch (error.type) {
          case 1:
            pageState = PageState.ConnectivityError;
            break;
          case 2:
            pageState = PageState.ConnectivityTimeOut;
            break;
          default:
            pageState = PageState.ConnectivityError;
            break;
        }
      }
      notifyListeners();
    });
    tableOuterList=[];
    if(baseResp.code==Constant.status_success){
      if ((baseResp.data[0] as List).isEmpty) {
        pageState = PageState.Empty;
        notifyListeners();
      }
      tableOuterList=(baseResp.data[0] as List).map((value){
        TableOuter tableOuter=TableOuter();
        tableOuter.name=value["name"];
        tableOuter.list=(value["list"] as List).map((table){
          return t.Table.fromJson(table as Map<String,dynamic>);
        }).toList();
        return tableOuter;
      }).toList();
    }
    return tableOuterList;
  }

  //获取已预订列表
  getReserveList(BuildContext context) async {
    tableMap.clear();
    NoteBookModel model = new NoteBookModel();
    Map<String, String> params = {
      "sid": userModel.user.sellerid,
      "rdate": _getRdate(),
      "ddate_solt": currTimeIndex.toString(),
      "y": "200",
      "x": "1",
      "keywords": "",
      "sort": "1"
    };
    pageState = PageState.Loading;
    notifyListeners();
    List<Notebook> noteBooks = await model.getReserveList(context, params);
    for (Notebook notebook in noteBooks) {
      if (notebook.tid.isEmpty) continue;
      if (notebook.status == "1" ||
          notebook.status == "2" ||
          notebook.status == "5") {
        //已预订,用餐中,已安排
        List<String> tids = notebook.tid.split(",");
        for (String tid in tids) {
          tableMap["$tid"] = notebook;
        }
      }
    }
    print(tableMap);
    initData();
  }

  //获取一天开始-结束时间字符串
  String _getRdate() {
    //一天开始时间
    double startDay = (DateTime.parse((dateTime.year.toString() +
        "-" +
        Utils.addZeroNumber(dateTime.month) +
        "-" +
        Utils.addZeroNumber(dateTime.day) +
        " 00:00:00"))
        .millisecondsSinceEpoch) /
        1000;
    //一天结束时间
    double endDay = (DateTime.parse((dateTime.year.toString() +
        "-" +
        Utils.addZeroNumber(dateTime.month) +
        "-" +
        Utils.addZeroNumber(dateTime.day) +
        " 23:59:59"))
        .millisecondsSinceEpoch) /
        1000;
    return startDay.floor().toString() + "-" + endDay.floor().toString();
  }

  //初始桌位数据
  initData() {
    areas.clear();
    areaTableMap.clear();
    for (TableOuter outer in tableOuterList) {
      int count = 0;
      for (t.Table table in outer.list) {
        table.sign = "";
        table.notebookId = "";
        table.reserver = "";
        if (table.tablestatus == "0") {//没有用餐中
          if (tableMap["${table.id}"] != null) {
            Notebook notebook = tableMap["${table.id}"];
            table.sign = notebook.status;
            table.notebookId = notebook.id;
            table.reserver = notebook.rnameStr;
          } else {
            table.sign = "";
            table.notebookId = "";
            if (table.enable == "1") {
              count++;
            }
          }
        } else {//用餐中
          table.sign = "2";
          table.notebookId = "";
        }
      }
      areaTableMap["${outer.name}"] = outer.list;
      Area area = Area();
      area.name = outer.name;
      area.count = count;
      areas.add(area);
    }
    currentArea = areaTableMap.keys.first;
    currentTables=areaTableMap[currentArea];
    pageState = PageState.Success;
    notifyListeners();
  }

  //生成日期文本
  createDateText(BuildContext context,DateTime day) {
    if (Utils.isOneDay(day, dateTime)) return; //日期没变
    DateTime dateNow = DateTime.now();
    dateText = Utils.addZeroNumber(day.month) +
        "月" +
        Utils.addZeroNumber(day.day) +
        "日";
    if (Utils.isOneDay(day, dateNow)) {
      dateText += "  今天";
    } else if (Utils.isOneDay(day, dateNow.add(Duration(days: 1)))) {
      dateText += "  明天";
    } else if (Utils.isOneDay(day, dateNow.add(Duration(days: 2)))) {
      dateText += "  后天";
    } else {
      dateText += " 周${Utils.formatWeekDayNum(day.weekday)}";
    }
    dateTime = day;
    getReserveList(context);
  }

  //获取桌位数据
  Future<dynamic> setSwitchStatus(BuildContext context,Map<String,String> params) async {
    BaseResp<dynamic> baseResp = await DioUtil()
        .request<dynamic>(context, Method.get, HttpUrl.set_switch_status,
        data: params,showLoading: true)
        .catchError((error) {
      print(error.toString());
    });
    if(baseResp==null)return null;
    if(baseResp.code==Constant.status_success){
      return baseResp.data;
    }else{
      Utils.showToast(baseResp.msg);
    }
  }
}