Esempio n. 1
0
        public static long?Insert(MySqlConnection sqlConnection, S_Event bowlEvent)
        {
            long?lastInsertedId = null;

            try
            {
                //create command and assign the query and connection from the constructor
                MySqlCommand command = new MySqlCommand();
                command.Connection = sqlConnection;

                command.CommandText = "INSERT INTO event ( eventcode,  scoresid,  opendatetime,  closedatetime,  status,  openmode) " +
                                      "VALUES (@eventcode, @scoresid, @opendatetime, @closedatetime, @status, @openmode)";

                command.Parameters.AddWithValue("@eventcode", Conversion.LongToSql(bowlEvent.eventCode));
                command.Parameters.AddWithValue("@scoresid", Conversion.LongToSql(bowlEvent.scoresId));
                command.Parameters.AddWithValue("@opendatetime", Conversion.DateTimeToSql(bowlEvent.openDateTime));
                command.Parameters.AddWithValue("@closedatetime", Conversion.DateTimeToSql(bowlEvent.closeDateTime));
                command.Parameters.AddWithValue("@status", Conversion.StringToSql(bowlEvent.status.ToString()));
                command.Parameters.AddWithValue("@openmode", Conversion.StringToSql(bowlEvent.openMode.ToString()));

                //Execute command
                command.ExecuteNonQuery();
                lastInsertedId = command.LastInsertedId;
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("Insert, Error inserting event data: {0}", ex.Message));
            }

            return(lastInsertedId.Value);
        }
Esempio n. 2
0
 void addEvent(List <S_Event> list, S_Event @event)
 {
     if (list.Count != 0)
     {
         if (@event.occur_time > ((S_Event)list[list.Count - 1]).occur_time)
         {
             list.Add(@event);
         }
         else
         {
             for (int i = 0; i != list.Count; i++)
             {
                 if (((S_Event)list[i]).occur_time > @event.occur_time)
                 {
                     list.Insert(i, @event);
                     break;
                 }
             }
         }
     }
     else
     {
         list.Add(@event);
     }
 }
Esempio n. 3
0
        public static void Update(MySqlConnection sqlConnection, S_Event bowlEvent)
        {
            try
            {
                //create command and assign the query and connection from the constructor
                MySqlCommand command = new MySqlCommand();
                command.Connection  = sqlConnection;
                command.CommandText = "UPDATE event SET eventcode=@eventcode, scoresid=@scoresid, opendatetime=@opendatetime, closedatetime=@closedatetime, status=@status, openmode=@openmode WHERE id=@id ";

                command.Parameters.AddWithValue("@id", Conversion.LongToSql(bowlEvent.id));
                command.Parameters.AddWithValue("@eventcode", Conversion.LongToSql(bowlEvent.eventCode));
                command.Parameters.AddWithValue("@scoresid", Conversion.LongToSql(bowlEvent.scoresId));
                command.Parameters.AddWithValue("@opendatetime", Conversion.DateTimeToSql(bowlEvent.openDateTime));
                command.Parameters.AddWithValue("@closedatetime", Conversion.DateTimeToSql(bowlEvent.closeDateTime));
                command.Parameters.AddWithValue("@status", Conversion.StringToSql(bowlEvent.status.ToString()));
                command.Parameters.AddWithValue("@openmode", Conversion.StringToSql(bowlEvent.openMode.ToString()));

                //Execute command
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("Update, Error updating event data: {0}", ex.Message));
            }
        }
Esempio n. 4
0
            void patientDeparture()
            {
                S_Patient this_Patient = beds[currentEvent.EventType].returnPatient();

                if (this_Patient.totalTime > 0.5)
                {
                    sl3[(int)this_Patient.arriveTime] += 1;
                }

                //依靠当前事件的 EventType 参数来确定窗口
                //判断实验终止条件,如果已经到达最大服务时间,则不进行处理
                if (currentEvent.occur_time < 24)
                {
                    //如果队列中还有病人,则生成下一位病人的离开事件
                    if (PatientQueue.Count > 0)
                    {
                        S_Patient patient = PatientQueue[0];
                        PatientQueue.RemoveAt(0);

                        double InterTime = 0;
                        double waitTime  = 0;
                        if (patient.remainTime > 0)
                        {// 曾经被退回来的病人
                            InterTime          = patient.remainTime;
                            waitTime           = currentEvent.occur_time - patient.lastLeave;
                            patient.totalTime += waitTime;
                            if (patient.lastLeave < patient.arriveTime + 0.5 && currentEvent.occur_time > patient.arriveTime + 0.5)
                            {
                                sl2[(int)patient.arriveTime - 1] += 1;
                            }
                        }
                        else
                        {                             // 第一次接受治疗的病人
                            InterTime = RandExp(miu); //计算当前病人的治疗时间

                            waitTime           = currentEvent.occur_time - patient.arriveTime;
                            patient.totalTime += waitTime;
                            if (waitTime > 0.5)
                            {
                                sl1[(int)patient.arriveTime] += 1;
                                sl2[(int)patient.arriveTime] += 1;
                            }
                        }

                        double  time       = currentEvent.occur_time + InterTime; //计算下一位病人离开事件的发生时间
                        S_Event temp_event = new S_Event(time, currentEvent.EventType);
                        addEvent(events, temp_event);

                        beds[currentEvent.EventType].servePatient(patient, temp_event); //从队列中取出下一位病人并分配至当前床位
                    }
                    else
                    {
                        beds[currentEvent.EventType].setIdle();
                    }
                }
            }
Esempio n. 5
0
        private static S_Event DataToObject(MySqlDataReader dataReader)
        {
            S_Event bowlEvent = new S_Event();

            bowlEvent.id            = Conversion.SqlToIntOrNull(dataReader["id"]).Value;
            bowlEvent.eventCode     = Conversion.SqlToIntOrNull(dataReader["eventcode"]).Value;
            bowlEvent.scoresId      = Conversion.SqlToIntOrNull(dataReader["scoresid"]).Value;
            bowlEvent.openDateTime  = Conversion.SqlToDateTimeOrNull(dataReader["opendatetime"]).Value;
            bowlEvent.closeDateTime = Conversion.SqlToDateTimeOrNull(dataReader["closedatetime"]);
            bowlEvent.status        = (Status)Enum.Parse(typeof(Status), Conversion.SqlToString(dataReader["status"]));
            bowlEvent.openMode      = (OpenMode)Enum.Parse(typeof(OpenMode), Conversion.SqlToString(dataReader["openmode"]));

            return(bowlEvent);
        }
Esempio n. 6
0
 void init()
 {
     events.Add(new S_Event(0, -1));
     for (int i = 0; i != beds_num[0]; i++)
     {
         beds.Add(new S_Beds());
     }
     for (int i = 1; i != 24; i++)
     {
         //初始配置改变床位相关的事件
         S_Event temp_event = new S_Event(i, -2);
         temp_event.switchValue = beds_num[i] - beds_num[i - 1];
         addEvent(events, temp_event);
     }
 }
Esempio n. 7
0
        /// <summary>
        /// 注册事件
        /// </summary>
        /// <param name="eventName"></param>
        /// <param name="callback"></param>
        public static int Register(string eventName, Action <System.Object> callback)
        {
            if (!mEvents.ContainsKey(eventName))
            {
                mEvents.Add(eventName, new List <S_Event>());
            }
            var event_info = new S_Event()
            {
                id             = GetFreeId(),
                eventName      = eventName,
                type           = 3,
                callback_param = callback
            };

            mEvent_id.Add(event_info.id, event_info);
            mEvents[eventName].Add(event_info);
            return(event_info.id);
        }
Esempio n. 8
0
        /// <summary>
        /// 注册事件
        /// </summary>
        /// <param name="eventName"></param>
        /// <param name="callback"></param>
        public static int RegisterFromLua(string eventName, LuaFunction callback)
        {
            if (!mEvents.ContainsKey(eventName))
            {
                mEvents.Add(eventName, new List <S_Event>());
            }
            var event_info = new S_Event()
            {
                id           = GetFreeId(),
                eventName    = eventName,
                type         = 2,
                callback_lua = callback
            };

            mEvent_id.Add(event_info.id, event_info);
            mEvents[eventName].Add(event_info);
            return(event_info.id);
        }
Esempio n. 9
0
        //Update statement
        public static void Update(S_Event bowlEvent)
        {
            try
            {
                DatabaseConnection databaseconnection = new DatabaseConnection();

                //open connection
                if (databaseconnection.OpenConnection())
                {
                    Update(databaseconnection.getConnection(), bowlEvent);

                    //close connection
                    databaseconnection.CloseConnection();
                }
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("Update, Error updating event data: {0}", ex.Message));
            }
        }
Esempio n. 10
0
            void patientArrive(int currentHour)
            {
                patientCount[currentHour] += 1;                             //该时间段内病人总数+1

                //-------------------------------生成下一名病人的到达事件---------------------------------------//
                double  intertime  = RandExp((double)lambda[currentHour]);  //下一名救护车病人到达的时间间隔
                double  time       = currentEvent.occur_time + intertime;   //下一名救护车病人的到达时间
                S_Event temp_event = new S_Event(time, -1);                 //生成下一名病人的到达事件

                //判断实验终止条件,如果已经到达24点,则不将事件加入事件列表。
                if (time < 24)
                {
                    addEvent(events, temp_event);
                }

                //------------------------------根据到达事件生成当前病人----------------------------------------//
                S_Patient inPatient = new S_Patient(currentEvent.occur_time);

                //将病人加入排队
                PatientQueue.Add(inPatient);


                //--------------------------------处理目前队列中的病人-----------------------------------------//
                int idleIndex = GetIdleBed();                               //寻找空闲的床位

                if (idleIndex >= 0)
                {
                    S_Patient outPatient = PatientQueue[0];
                    time = currentEvent.occur_time + RandExp(miu);
                    PatientQueue.RemoveAt(0);                               //将病人从队列中取出
                    beds[idleIndex].setBusy();                              //将床位状态设置为“繁忙”

                    temp_event = new S_Event(time, idleIndex);              //产生对应的离开事件
                    addEvent(events, temp_event);
                    beds[idleIndex].servePatient(outPatient, temp_event);   //将病人安排至床位
                }
                else
                {
                    //计算队长的变化
                }
            }
Esempio n. 11
0
        public static S_Event GetEventById(long id)
        {
            S_Event bowlEvent = null;

            try
            {
                DatabaseConnection databaseconnection = new DatabaseConnection();

                //Open connection
                if (databaseconnection.OpenConnection())
                {
                    //Create Command
                    MySqlCommand command = new MySqlCommand();
                    command.Connection  = databaseconnection.getConnection();
                    command.CommandText = "SELECT * FROM event WHERE id=@id";
                    command.Parameters.AddWithValue("@id", Conversion.LongToSql(id));

                    //Create a data reader and Execute the command
                    MySqlDataReader dataReader = command.ExecuteReader();

                    //Read the data and store them in the list
                    if (dataReader.Read())
                    {
                        bowlEvent = DataToObject(dataReader);
                    }

                    //close Data Reader
                    dataReader.Close();

                    //close Connection
                    databaseconnection.CloseConnection();
                }
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("GetEventById, Error reading event data: {0}", ex.Message));
            }

            return(bowlEvent);
        }
Esempio n. 12
0
 void run()
 {
     init();
     while (events.Count != 0)
     {
         currentEvent = events[0];
         if (currentEvent.EventType == -1)                       //事件类型为-1,病人到达
         {
             patientArrive((int)currentEvent.occur_time);
         }
         else if (currentEvent.EventType == -2)                  //事件类型为-2,医院换班
         {
             bedsSwitch(currentEvent.switchValue);
         }
         else
         {
             patientDeparture();                                 //事件类型非-1或2,处理病人离开事件
         }
         events.RemoveAt(0);
     }
     reset();
 }
Esempio n. 13
0
        public static void Save(MySqlConnection sqlConnection, S_Scores score, S_Event bowlEvent)
        {
            long?eventId = null;

            bowlEvent.scoresId = score.id;

            if (!EventManager.EventExistByScoreIdAndEventCode(sqlConnection, score.id, bowlEvent.eventCode, out eventId))
            {
                bowlEvent.id = Insert(sqlConnection, bowlEvent).Value;
            }
            else
            {
                bowlEvent.id = eventId.Value;
                // closeDateTime and Status might have changed
                Update(sqlConnection, bowlEvent);
            }

            foreach (S_Game game in bowlEvent.games)
            {
                GameManager.Save(sqlConnection, bowlEvent, game);
            }
        }
Esempio n. 14
0
        //Insert statement
        public static long?Insert(S_Event bowlEvent)
        {
            long?lastInsertedId = null;

            try
            {
                DatabaseConnection databaseconnection = new DatabaseConnection();

                //open connection
                if (databaseconnection.OpenConnection())
                {
                    lastInsertedId = Insert(databaseconnection.getConnection(), bowlEvent);

                    //close connection
                    databaseconnection.CloseConnection();
                }
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("Insert, Error inserting event data: {0}", ex.Message));
            }

            return(lastInsertedId.Value);
        }
Esempio n. 15
0
 public void servePatient(S_Patient patient, S_Event @event)
 {
     this.patient    = patient;
     this.LeaveEvent = @event;
 }
Esempio n. 16
0
            void bedsSwitch(int amount)
            {
                if (amount > 0)                                             //增加床位
                {
                    for (int i = 0; i != amount; i++)
                    {
                        beds.Add(new S_Beds());
                    }
                }
                else if (amount < 0)
                {                                                           //减少床位
                    Random rand = new Random();
                    for (int i = 0; i != (-amount); i++)
                    {
                        int r = rand.Next(0, beds.Count - 1);

                        //处理标记为r处的床位的病人
                        //首先检查这个床位是否有人,如果没有的话就跳过
                        if (beds[r].isIdle())
                        {
                            beds.RemoveAt(r);
                        }
                        else
                        {
                            //计算病人剩余的治疗时间
                            int    idleNum     = GetIdleBed();
                            double currentTime = currentEvent.occur_time;
                            double endTime     = beds[r].LeaveEvent.occur_time;

                            S_Patient rePatient = beds[r].returnPatient();
                            rePatient.remainTime = endTime - currentTime;

                            //移除病人原本的离开事件
                            events.Remove(beds[r].LeaveEvent);

                            //根据选择的策略处理换班
                            switch (switchRule)
                            {
                            case 0:
                                if (idleNum != -1)
                                {    //若存在空闲服务台,正在服务中的服务台将工作转交给空闲服务台后下班
                                    S_Event event_0 = new S_Event(endTime, idleNum);
                                    addEvent(events, event_0);
                                    beds[idleNum].servePatient(rePatient, event_0);
                                }
                                else
                                {    //否则,正在服务中的服务台将完成当前顾客的服务后下班
                                    if (rePatient.totalTime > 0.5)
                                    {
                                        sl3[(int)rePatient.arriveTime] += 1;
                                    }
                                }
                                break;

                            case 1:
                                //正在服务中的服务台将直接下班,其正在服务中的顾客被退回队首
                                rePatient.lastLeave = currentTime;
                                PatientQueue.Insert(0, rePatient);
                                break;

                            case 2:
                                //正在服务中的服务台完成当前顾客的服务后下班
                                if (rePatient.totalTime > 0.5)
                                {
                                    sl3[(int)rePatient.arriveTime] += 1;
                                }
                                break;
                            }
                            beds.RemoveAt(r);
                        }

                        for (int j = 0; j != events.Count; j++)
                        {
                            if (events[j].EventType >= r)
                            {
                                events[j].EventType -= 1;
                            }
                        }
                    }
                }
                for (int j = 0; j != events.Count; j++)
                {
                    if (events[j].EventType == -1)
                    {
                        S_Event newEvent = events[j];
                        newEvent.occur_time = currentEvent.occur_time;
                        events.RemoveAt(j);
                        addEvent(events, newEvent);
                        break;
                    }
                }
            }
Esempio n. 17
0
        private static S_Event GetEvent(XmlNode xmlEventNode)
        {
            S_Event bowlEvent = new S_Event();

            bowlEvent.games = new List <S_Game>();

            try
            {
                #region xml example
                //<Event>
                //  <IDEvent>6</IDEvent>
                //  <OpenDateTime>201308270953</OpenDateTime>
                //  <CloseDateTime>201308271004</CloseDateTime>
                //  <Status>Played</Status>
                //  <OpenMode>Single</OpenMode>
                //  <Games>
                //      <Game>....</Game>
                //      <Game>....</Game>
                //  </Games>
                //</Event>
                #endregion

                // all child nodes in Event
                XmlNodeList xmlEventChildNodeList = xmlEventNode.SelectNodes("*");

                foreach (XmlNode xmlEventChildNode in xmlEventChildNodeList)
                {
                    switch (xmlEventChildNode.Name)
                    {
                    case "IDEvent":
                        bowlEvent.eventCode = Conversion.StringToInt(xmlEventChildNode.InnerText).Value;
                        break;

                    case "OpenDateTime":
                        bowlEvent.openDateTime = Conversion.StringToDateTimeQubica(xmlEventChildNode.InnerText).Value;
                        break;

                    case "CloseDateTime":
                        bowlEvent.closeDateTime = Conversion.StringToDateTimeQubica(xmlEventChildNode.InnerText).Value;
                        break;

                    case "Status":
                        bowlEvent.status = (Status)Enum.Parse(typeof(Status), xmlEventChildNode.InnerText);
                        break;

                    case "OpenMode":
                        bowlEvent.openMode = (OpenMode)Enum.Parse(typeof(OpenMode), xmlEventChildNode.InnerText);
                        break;

                    case "Games":
                        // all child nodes in Games (game)
                        XmlNodeList xmlGamesNodeList = xmlEventChildNode.SelectNodes("*");

                        // loop over all game nodes for this Event
                        foreach (XmlNode xmlGameNode in xmlGamesNodeList)
                        {
                            bowlEvent.games.Add(GetGame(xmlGameNode));
                        }
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(String.Format("Error parsing scores from response: {0}", ex.Message));
            }

            return(bowlEvent);
        }