Changeset 1083 for Scheduling
- Timestamp:
- Jan 26, 2011, 6:01:39 AM (14 years ago)
- Location:
- Scheduling/trunk/cs/bsdx0200GUISourceCode
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
Scheduling/trunk/cs/bsdx0200GUISourceCode/CGAppointments.cs
r1075 r1083 61 61 { 62 62 CGAppointments newappts = new CGAppointments(); 63 //appts.apptList = (Hashtable)apptList.Clone();64 63 foreach (DictionaryEntry d in this.apptList) 65 64 { -
Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocument.cs
r1073 r1083 272 272 //sam: This is a test that duplicates RefreshDocument, but without the UpdateAllViews, 273 273 // as that has to be done synchornously. 274 //XXXXXX: Needs to be refactored obviously, but now for testing. 274 //XXX: Needs to be refactored obviously, but now for testing. 275 //XXX: Tested extensively enough. Less refactoring now. 2011-01-26 275 276 public void RefreshDocumentAsync() 276 277 { 278 Debug.WriteLine("IN REFERSH DOCUMENT ASYNC\n\n"); 279 277 280 bool bRet = false; 278 281 if (m_sResourcesArray.Count == 0) … … 423 426 m_DocManager.ConnectInfo.LoadConnectInfo(); 424 427 } 425 426 m_pAvArray.Clear();427 428 428 429 ArrayList saryApptTypes = new ArrayList(); … … 464 465 string sAccessRuleList; 465 466 466 467 foreach (DataRow rTemp in rAvailabilitySchedule.Rows) 468 { 469 //get StartTime, EndTime and Slots 470 dStart = (DateTime)rTemp["START_TIME"]; 471 dEnd = (DateTime)rTemp["END_TIME"]; 472 473 //TODO: Fix this slots datatype problem 474 string sSlots = rTemp["SLOTS"].ToString(); 475 nSlots = Convert.ToInt16(sSlots); 476 477 sResourceList = rTemp["RESOURCE"].ToString(); 478 sAccessRuleList = rTemp["ACCESS_TYPE"].ToString(); 479 480 string sNote = rTemp["NOTE"].ToString(); 481 482 if ((nSlots < -1000) || (sAccessRuleList == "")) 467 //smh: moved clear availabilities down here. 468 //smh: Temporary solution to make sure that people don't touch the availability table at the same time!!! 469 //NOTE: This lock makes sure that availabilities aren't queried for slots when the array is an intermediate 470 //state. The other place that has this lock is SlotsAvailable function. 471 lock (this.m_pAvArray) 472 { 473 m_pAvArray.Clear(); 474 475 foreach (DataRow rTemp in rAvailabilitySchedule.Rows) 483 476 { 484 nApptTypeID = 0; 485 } 486 else 487 { 488 foreach (DataRow rType in rTypeSchedule.Rows) 477 //get StartTime, EndTime and Slots 478 dStart = (DateTime)rTemp["START_TIME"]; 479 dEnd = (DateTime)rTemp["END_TIME"]; 480 481 //TODO: Fix this slots datatype problem 482 string sSlots = rTemp["SLOTS"].ToString(); 483 nSlots = Convert.ToInt16(sSlots); 484 485 sResourceList = rTemp["RESOURCE"].ToString(); 486 sAccessRuleList = rTemp["ACCESS_TYPE"].ToString(); 487 488 string sNote = rTemp["NOTE"].ToString(); 489 490 if ((nSlots < -1000) || (sAccessRuleList == "")) 489 491 { 490 491 dTypeStart = (DateTime)rType["StartTime"]; 492 dTypeEnd = (DateTime)rType["EndTime"]; 493 //if start & end times overlap, then 494 string sTypeResource = rType["ResourceName"].ToString(); 495 if ((dTypeStart.DayOfYear == dStart.DayOfYear) && (sResourceList == sTypeResource)) 492 nApptTypeID = 0; 493 } 494 else 495 { 496 foreach (DataRow rType in rTypeSchedule.Rows) 496 497 { 497 crRectA.Y = GetTotalMinutes(dStart); 498 crRectA.Height = GetTotalMinutes(dEnd) - crRectA.Top;499 crRectB.Y = GetTotalMinutes(dTypeStart);500 crRectB.Height = GetTotalMinutes(dTypeEnd) - crRectB.Top;501 bIsect = crRectA.IntersectsWith(crRectB);502 if ( bIsect == true)498 499 dTypeStart = (DateTime)rType["StartTime"]; 500 dTypeEnd = (DateTime)rType["EndTime"]; 501 //if start & end times overlap, then 502 string sTypeResource = rType["ResourceName"].ToString(); 503 if ((dTypeStart.DayOfYear == dStart.DayOfYear) && (sResourceList == sTypeResource)) 503 504 { 504 //TODO: This code: 505 // nApptTypeID = (int) rType["AppointmentTypeID"]; 506 //Causes this exception: 507 //Unhandled Exception: System.InvalidCastException: Specified cast is not valid. 508 string sTemp = rType["AppointmentTypeID"].ToString(); 509 nApptTypeID = Convert.ToInt16(sTemp); 510 break; 505 crRectA.Y = GetTotalMinutes(dStart); 506 crRectA.Height = GetTotalMinutes(dEnd) - crRectA.Top; 507 crRectB.Y = GetTotalMinutes(dTypeStart); 508 crRectB.Height = GetTotalMinutes(dTypeEnd) - crRectB.Top; 509 bIsect = crRectA.IntersectsWith(crRectB); 510 if (bIsect == true) 511 { 512 //TODO: This code: 513 // nApptTypeID = (int) rType["AppointmentTypeID"]; 514 //Causes this exception: 515 //Unhandled Exception: System.InvalidCastException: Specified cast is not valid. 516 string sTemp = rType["AppointmentTypeID"].ToString(); 517 nApptTypeID = Convert.ToInt16(sTemp); 518 break; 519 } 511 520 } 512 } 513 } //end foreach datarow rType514 } 515 516 AddAvailability(dStart, dEnd, nApptTypeID, nSlots, false, sResourceList, sAccessRuleList, sNote);517 }//end foreach datarow rTemp518 521 }//end foreach datarow rType 522 } 523 524 525 AddAvailability(dStart, dEnd, nApptTypeID, nSlots, false, sResourceList, sAccessRuleList, sNote); 526 }//end foreach datarow rTemp 527 }//end lock 519 528 return true; 520 529 } … … 531 540 } 532 541 542 /// <summary> 543 /// Adds Availability to Availability Array held by document 544 /// </summary> 545 /// <param name="StartTime">Self-Explan</param> 546 /// <param name="EndTime">Self-Explan</param> 547 /// <param name="nType"></param> 548 /// <param name="nSlots"></param> 549 /// <param name="UpdateView"></param> 550 /// <param name="sResourceList"></param> 551 /// <param name="sAccessRuleList"></param> 552 /// <param name="sNote"></param> 553 /// <returns></returns> 533 554 public int AddAvailability(DateTime StartTime, DateTime EndTime, int nType, int nSlots, bool UpdateView, string sResourceList, string sAccessRuleList, string sNote) 534 555 { … … 579 600 //TODO: Test that resource is not currently in list, that it IS a resource, etc 580 601 this.m_sResourcesArray.Add(sResource); 581 //SAM: removing: Remove UpdateAllViews: Redraws all the open views. But does not call server.582 //this.UpdateAllViews();583 }584 585 public void ClearResources()586 {587 this.m_sResourcesArray.Clear();588 602 } 589 603 … … 604 618 crRectB.Height = GetTotalMinutes(dSelEnd) - crRectB.Y; 605 619 606 // //loop thru m_pAvArray 607 // //Compare the start time and end time of eachblock 608 while (i < m_pAvArray.Count) 609 { 610 pAv = (CGAvailability)m_pAvArray[i]; 611 dStart = pAv.StartTime; 612 dEnd = pAv.EndTime; 613 if ((sResource == pAv.ResourceList) && 614 ((dSelStart.Date == dStart.Date) || (dSelStart.Date == dEnd.Date))) 615 { 616 crRectA.Y = (dStart.Date < dSelStart.Date) ? 0 : GetTotalMinutes(dStart); 617 crRectA.Height = (dEnd.Date > dSelEnd.Date) ? 1440 : GetTotalMinutes(dEnd); 618 crRectA.Height = crRectA.Height - crRectA.Y; 619 bIsect = crRectA.IntersectsWith(crRectB); 620 if (bIsect != false) 620 //NOTE: What's this lock? This lock makes sure that nobody is editing the availability array 621 //when we are looking at it. Since the availability array could potentially be updated on 622 //a different thread, we are can be potentially left stuck with an empty array. 623 // 624 //The other place that uses this lock is the RefershAvailabilitySchedule method 625 // 626 //This is a temporary fix until I figure out how to divorce the availbilities here from those drawn 627 //on the calendar. Appointments are cloned b/c they are in an object that supports that; and b/c I 628 //don't need to suddenly query them at runtime like I do with Availabilities. 629 630 lock (this.m_pAvArray) 631 { 632 //loop thru m_pAvArray 633 //Compare the start time and end time of eachblock 634 while (i < m_pAvArray.Count) 635 { 636 pAv = (CGAvailability)m_pAvArray[i]; 637 dStart = pAv.StartTime; 638 dEnd = pAv.EndTime; 639 if ((sResource == pAv.ResourceList) && 640 ((dSelStart.Date == dStart.Date) || (dSelStart.Date == dEnd.Date))) 621 641 { 622 nSlots = pAv.Slots; 623 if (nSlots < 1) 642 crRectA.Y = (dStart.Date < dSelStart.Date) ? 0 : GetTotalMinutes(dStart); 643 crRectA.Height = (dEnd.Date > dSelEnd.Date) ? 1440 : GetTotalMinutes(dEnd); 644 crRectA.Height = crRectA.Height - crRectA.Y; 645 bIsect = crRectA.IntersectsWith(crRectB); 646 if (bIsect != false) 624 647 { 625 nAvailableSlots = 0; 626 break; 627 } 628 if (nSlots < nAvailableSlots) 629 { 630 nAvailableSlots = nSlots; 631 sAccessType = pAv.AccessTypeName; 632 sAvailabilityMessage = pAv.Note; 633 634 } 635 } 636 } 637 i++; 638 } 648 nSlots = pAv.Slots; 649 if (nSlots < 1) 650 { 651 nAvailableSlots = 0; 652 break; 653 } 654 if (nSlots < nAvailableSlots) 655 { 656 nAvailableSlots = nSlots; 657 sAccessType = pAv.AccessTypeName; 658 sAvailabilityMessage = pAv.Note; 659 660 } 661 }//end if 662 }//end if 663 i++; 664 }//end while 665 }//end lock 666 639 667 if (nAvailableSlots == 999) 640 668 { … … 759 787 aCopy.HealthRecordNumber = rApptInfo.HealthRecordNumber; 760 788 aCopy.AccessTypeID = rApptInfo.AccessTypeID; 789 aCopy.WalkIn = bWalkin ? true : false; 761 790 762 791 string sSql = "BSDX ADD NEW APPOINTMENT^" + sStart + "^" + sEnd + "^" + sPatID + "^" + sResource + "^" + sLen + "^" + sNote + "^" + sApptID; … … 773 802 aCopy.AppointmentKey = nApptID; 774 803 this.m_appointments.AddAppointment(aCopy); 775 776 bool bRet = RefreshAvailabilitySchedule(); 777 778 UpdateAllViews(); 804 805 806 //Have make appointment from CGView responsible for requesting an update for the avialability. 807 //bool bRet = RefreshAvailabilitySchedule(); 808 809 //Sam: don't think this is needed as it is called from CGView. 810 //Make CGView responsible for all drawing. 811 //UpdateAllViews(); 779 812 780 813 return nApptID; … … 822 855 string sErrorID = r["ERRORID"].ToString(); 823 856 824 if (this.m_appointments.AppointmentTable.ContainsKey(nApptID)) 825 { 826 bool bRet = RefreshSchedule(); 827 UpdateAllViews(); 828 } 857 829 858 } 830 859 -
Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocumentManager.cs
r1073 r1083 1182 1182 DataTable dtOut; 1183 1183 1184 #if TRACE1185 DateTime sendTime = DateTime.Now;1186 #endif1187 1184 try 1188 1185 { … … 1198 1195 throw ex; 1199 1196 } 1200 1201 #if TRACE1202 DateTime receiveTime = DateTime.Now;1203 TimeSpan executionTime = receiveTime - sendTime;1204 Debug.Write("CGDocumentManager::RPMSDataTable Execution Time: " + executionTime.Milliseconds + " ms.\n");1205 #endif1206 1197 1207 1198 return dtOut; -
Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs
r1075 r1083 617 617 this.tvSchedules.Location = new System.Drawing.Point(0, 0); 618 618 this.tvSchedules.Name = "tvSchedules"; 619 this.tvSchedules.Size = new System.Drawing.Size(128, 332);619 this.tvSchedules.Size = new System.Drawing.Size(128, 290); 620 620 this.tvSchedules.Sorted = true; 621 621 this.tvSchedules.TabIndex = 1; … … 664 664 this.panelRight.Location = new System.Drawing.Point(941, 0); 665 665 this.panelRight.Name = "panelRight"; 666 this.panelRight.Size = new System.Drawing.Size(128, 332);666 this.panelRight.Size = new System.Drawing.Size(128, 290); 667 667 this.panelRight.TabIndex = 3; 668 668 this.panelRight.Visible = false; … … 762 762 this.panelCenter.Location = new System.Drawing.Point(136, 24); 763 763 this.panelCenter.Name = "panelCenter"; 764 this.panelCenter.Size = new System.Drawing.Size(802, 2 84);764 this.panelCenter.Size = new System.Drawing.Size(802, 242); 765 765 this.panelCenter.TabIndex = 7; 766 766 // … … 848 848 this.panelBottom.Controls.Add(this.statusBar1); 849 849 this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom; 850 this.panelBottom.Location = new System.Drawing.Point(136, 308);850 this.panelBottom.Location = new System.Drawing.Point(136, 266); 851 851 this.panelBottom.Name = "panelBottom"; 852 852 this.panelBottom.Size = new System.Drawing.Size(802, 24); … … 866 866 this.splitter1.Location = new System.Drawing.Point(128, 24); 867 867 this.splitter1.Name = "splitter1"; 868 this.splitter1.Size = new System.Drawing.Size(8, 308);868 this.splitter1.Size = new System.Drawing.Size(8, 266); 869 869 this.splitter1.TabIndex = 9; 870 870 this.splitter1.TabStop = false; … … 875 875 this.splitter2.Location = new System.Drawing.Point(938, 24); 876 876 this.splitter2.Name = "splitter2"; 877 this.splitter2.Size = new System.Drawing.Size(3, 308);877 this.splitter2.Size = new System.Drawing.Size(3, 266); 878 878 this.splitter2.TabIndex = 10; 879 879 this.splitter2.TabStop = false; … … 903 903 this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources"))); 904 904 this.calendarGrid1.SelectedAppointment = 0; 905 this.calendarGrid1.Size = new System.Drawing.Size(802, 2 84);905 this.calendarGrid1.Size = new System.Drawing.Size(802, 242); 906 906 this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0); 907 907 this.calendarGrid1.TabIndex = 0; … … 916 916 // 917 917 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 918 this.ClientSize = new System.Drawing.Size(1069, 332);918 this.ClientSize = new System.Drawing.Size(1069, 290); 919 919 this.Controls.Add(this.panelCenter); 920 920 this.Controls.Add(this.panelBottom); … … 1923 1923 Debug.Assert(nApptID != 0); 1924 1924 1925 CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID]; 1926 1925 //smh 1926 //CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID]; 1927 CGAppointment a = (CGAppointment)this.Document.Appointments.AppointmentTable[nApptID]; 1927 1928 try 1928 1929 { … … 1980 1981 DateTime dtCheckIn = dlgCheckin.CheckInTime; 1981 1982 1982 this.Document.CheckInAppointment(nApptID, dtCheckIn); 1983 //Save to Database 1984 this.Document.CheckInAppointment(nApptID, dtCheckIn); 1985 1986 //Tell appointment that it is checked in--smh cancel that! 1987 //a.CheckInTime = DateTime.Now; 1988 1983 1989 //smh new code 1984 1990 if (dlgCheckin.PrintRouteSlip) … … 1986 1992 // end new code 1987 1993 1994 //redraw grid (would this work???) 1988 1995 this.calendarGrid1.Invalidate(); 1989 1996 } … … 2034 2041 * 8-10-05 Added overbook prompt for walkin 2035 2042 */ 2036 this.Document.RefreshDocument(); 2043 //SMH: Takes too long to do. 2044 //this.Document.RefreshDocument(); 2037 2045 string sAccessType = ""; 2038 2046 string sAvailabilityMessage = ""; … … 2067 2075 appt.HealthRecordNumber = dPat.HealthRecordNumber; 2068 2076 2069 this.Document.RefreshDocument(); 2077 //smh: Takes too long 2078 //this.Document.RefreshDocument(); 2070 2079 2071 2080 //Call Document to add a walkin appointment … … 2074 2083 //Now check them in. 2075 2084 calendarGrid1.SelectedAppointment = nApptID; 2076 2077 2085 AppointmentCheckIn(); 2078 2086 2079 try 2080 { 2081 RaiseRPMSEvent("BSDX SCHEDULE" , m_Document.DocName); 2082 } 2083 catch (Exception ex) 2084 { 2085 Debug.Write(ex.Message); 2086 } 2087 //Show the new set of appointments by calling UpdateArrays. Fetches Document's CGAppointments 2088 this.UpdateArrays(); 2089 2090 //Get the appointments and availabilities, async, from Server. Callback updates this thread's controls. 2091 OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule); 2092 ousd.BeginInvoke(OnUpdateScheduleCallback, null); 2093 2094 2095 } 2096 catch (Exception ex) 2097 { 2098 string msg; 2099 if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error. 2100 msg = BMXNetLib.Piece(ex.Message, "~", 4); 2101 else 2102 msg = ex.Message; 2103 2104 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Walk-in Appointment"); 2105 return; 2106 } 2107 2108 try 2109 { 2110 RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName); 2111 } 2112 catch (Exception ex) 2113 { 2114 Debug.Write(ex.Message); 2115 } 2087 2116 2088 } 2089 catch (Exception ex) 2090 { 2091 MessageBox.Show("Unable to add walk-in appointment " + ex.Message, "Clinical Scheduling"); 2092 return; 2093 2094 } 2117 2095 2118 } 2096 2119 … … 2133 2156 Debug.Assert(nDuration > 0); 2134 2157 2135 this.Document.RefreshDocument(); 2158 2159 //Sam: takes too long. Remove this call; deal with the issue of concurrent appointments another way. 2160 //this.Document.RefreshDocument(); 2136 2161 string sAccessType = ""; 2137 2162 string sAvailabilityMessage = ""; … … 2180 2205 appt.AccessTypeID = nAccessTypeID; 2181 2206 2182 //Call Document to add a new appointment 2207 //Call Document to add a new appointment. Document adds appointment to CGAppointments array. 2183 2208 this.Document.CreateAppointment(appt); 2184 this.Document.RefreshDocument(); 2185 2209 2210 //Show the new set of appointments by calling UpdateArrays. Fetches Document's CGAppointments 2211 this.UpdateArrays(); 2212 2213 //Get the appointments and availabilities, async, from Server. Callback updates this thread's controls. 2214 OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule); 2215 ousd.BeginInvoke(OnUpdateScheduleCallback, null); 2186 2216 } 2187 2217 catch (Exception ex) 2188 { 2189 MessageBox.Show("Unable to add new appointment " + ex.Message, "Clinical Scheduling"); 2218 { 2219 string msg; 2220 if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error. 2221 msg = BMXNetLib.Piece(ex.Message, "~", 4); 2222 else 2223 msg = ex.Message; 2224 2225 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Appointment"); 2190 2226 return; 2191 2192 } 2227 } 2228 2193 2229 try 2194 2230 { … … 2320 2356 Debug.Assert(this.InvokeRequired == false,"CGView.UpdateArrays InvokeRequired"); 2321 2357 // This is where you set how the grid will look 2358 2359 //Create Deep copy of Availability Array 2360 ArrayList availArrayCopy = new ArrayList(); 2361 foreach (CGAvailability av in this.m_Document.AvailabilityArray) 2362 availArrayCopy.Add(av); 2363 2322 2364 try 2323 2365 { 2324 2366 //Tell the grid about Avails, Appts, and Resources. 2325 this.calendarGrid1.AvailabilityArray = this.m_Document.AvailabilityArray;2367 this.calendarGrid1.AvailabilityArray = availArrayCopy; 2326 2368 //Appts are cloned b/c if we tie into the class directly, we shoot off errors when we manipulate it. 2327 this.calendarGrid1.Appointments = (CGAppointments)this.m_Document.Appointments.Clone(); //smh new line again2369 this.calendarGrid1.Appointments = (CGAppointments)this.m_Document.Appointments.Clone(); 2328 2370 this.calendarGrid1.Resources = this.m_Document.Resources; 2329 2371 //Redraw the calendar grid … … 3135 3177 3136 3178 3137 3179 /// <summary> 3180 /// Update Selection of date if user does not pick a date/time 3181 /// </summary> 3182 /// <param name="sender"></param> 3183 /// <param name="e"></param> 3138 3184 private void dateTimePicker1_Leave(object sender, EventArgs e) 3139 3185 { … … 3142 3188 } 3143 3189 3190 /// <summary> 3191 /// Handle Selection of Date via mouse from datetimepicker dropdown 3192 /// </summary> 3193 /// <param name="sender"></param> 3194 /// <param name="e"></param> 3144 3195 private void dateTimePicker1_CloseUp(object sender, EventArgs e) 3145 3196 { … … 3148 3199 } 3149 3200 3201 /// <summary> 3202 /// Handle Enter and Escape key on dateTimePicker 3203 /// </summary> 3204 /// <param name="sender"></param> 3205 /// <param name="e"></param> 3150 3206 private void dateTimePicker1_KeyPress(object sender, KeyPressEventArgs e) 3151 3207 { -
Scheduling/trunk/cs/bsdx0200GUISourceCode/CalendarGrid.cs
r1075 r1083 1028 1028 } 1029 1029 1030 /// <summary> 1031 /// Draws Availabilities. Draws Some of the Empty cells (don't know where the rest go) with the Khaki color 1032 /// </summary> 1030 1033 private void SetAppointmentTypes() 1031 1034 {
Note:
See TracChangeset
for help on using the changeset viewer.