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); }
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); } }
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)); } }
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(); } } }
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); }
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); } }
/// <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); }
/// <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); }
//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)); } }
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 { //计算队长的变化 } }
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); }
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(); }
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); } }
//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); }
public void servePatient(S_Patient patient, S_Event @event) { this.patient = patient; this.LeaveEvent = @event; }
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; } } }
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); }