《医院管理系统课程设计说明书.doc》由会员分享,可在线阅读,更多相关《医院管理系统课程设计说明书.doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、系统需求及功能分析 1系统需求分析医院信息化是医院应用信息技术及其产品过程,是信息技术由局部到全局、由战术层次到战略层次向医院全面渗透,运用于流程管理、支持医院经营管理过程。信息化实施从自上而下角度说,必须及医院制度创新、组织创新与管理创新结合;从自上而下角度说,必须以作为医院主体业务人员直接受益及其使用水平逐步提高为基础。调查用户需求:本系统最终用户为医院,我们根据从医院方面取得图表资料、文字资料以及其他细节方面信息,根据我们日常生活中经验,根据我们所做其他询问与调查,得出用户下列实际要求:用户对系统要求:信息要求:由于系统使用主体是医院管理人员,因此对系统信息要求可分为以下方面:(1)
2、病人信息:首先是病人基本信息,主要包括病人姓名,性别,出生年月,年龄,家庭住址,联系方式等;:对于住院病人,还需要入院时间,所在病区,所在医科,床位等。(2)处理要求:系统应当完成以下信息处理:存储病人信息,供相应人员查询;:对病人信息进行及时更新与统计;(3)安全性要求:系统应设置访问用户标识以鉴别是否是合法用户,并要求合法用户设置其密码,保证用户身份不被盗用。2. 功能分析(1)信息录入处理:住院病人信息录入、住院病人治疗费用录入、住院病人药品费用录入。 住院病人信息录入就是将源数据库中没有病人信息重新录入进去,并且可以录入病人姓名。住院病人费用录入与住院病人药品录入功能相近,都是将 病人
3、在住院期间所花费用进行录入保存,方便以后进行查询。(2)信息查询处理:住院病人信息查询与住院病人费用查询。 住院病人信息查询与住院病人费用查询功能相似,从数据库中将病人信息与费用显示到前台,让病人及时了解自己个人信息与消费情况。(3)信息统计处理:住院病人总费用统计按大类科、专科、病区及指定病人进行查询统计(4)信息打印处理:住院病人信息打印住院病人信息报表打印用于显示病人住院号、床位号、床位费、病人姓名、性别编码出生日期、民族、籍贯与病症等详细信息。(5)系统维护处理:病人信息维护、大类科编码维护、专科编码维护、病区编码维护、治疗项目编码维护、药品编码维护医生编码维护与用户编码维护。系统编码
4、维护时分别对病人信息、大类科、专科、病区、治疗项目、药品信息、医生信息与用户信息进行录入、查询及修改等操作,数据编码表维护是对各类数据编码表中记录进行录入、查询及修改等操作。由此方案设计系统功能菜单如下表所示。信息录入信息查询信息统计数据打印系统维护信息复制病人信息录入病人信息查询病人总费用统计病人信息打印系统维护批量复制病人治疗费用录入病人费用查询大类科编码维护病人药品费用录入专科编码维护病区编码维护治疗项目维护药品编码维护医生编码维护用户编码维护 表 学生成绩管理功能菜单二、数据库设计设计系统数据库结构、数据表结构包含序号、数据项名、含义、数据项类型、长度、非空、索引、主键、外键、引用字段
5、、数据来源等。表1 大类科编码表tblCategory序号字段名含义类型宽度小数主/外键1Cate_Id 大类科编码Varchar10PK2Cate_Name大类科名称Varchar203Cate_Dean大类科主任Varchar10Spec表2 专科编码表tblSpec序号字段名含义类型宽度小数 主/外键关联表/字段1Spec_Id专科编码Varchar10PK2Spec_Name专科名称Varchar303Spec_Cate所属大类科编码Varchar10FKtblCategory / Cate_IDWard表3 病区编码表tblWard序号字段名含义类型宽度小数 主/外键关联表/字段1W
6、ard_Id病区编码Varchar10PK2Ward _Name病区名称Varchar203Ward_Pos病区位置Varchar204Ward_Beds总床位数Int5Ward_Used已用床位数Int6Ward_Rest剩余床位数flaot7Ward_Head病区主任Varchar108Ward_Spec所属专科编码Varchar 2FKtblSpec / Spec_IDPatient表4 病人信息表tblPatient序号字段名含义类型宽度小数 主/外键关联表/字段1Pat_Id住院号Varchar10PK2Pat_Bed 床位号Varchar503Pat_BedFee床位费money2
7、4Pat_Name病人姓名Varchar85Pat_Sex性别编码Varchar1tblSex / Sex_ID6Pat_Birth出生日期Datetime7Pat_Nation民族Varchar2tblNation / Nation_ID8Pat_NtvPlc籍贯Varchar6tblNtvPlc / NtvPlc_ID9Pat_Sympton病症Varchar2010Pat_Work工作单位Varchar2011Pat_CharId身份证号Varchar4012Pat_Ward病区编码Varchar10tblWard / Ward_ID13Pat_ZipCode住宅 Varchar614P
8、at_Phone住宅 Varchar2015Pat_Addr户口地址Varchar5016Pat_Admit入院日期Datetime17Pat_Leave出院日期Datetime18Pat_PayAd预交费money219Pat_PaySum费用总额money220Pat_PayRest费用结余money221Pat_Image病人照片Image表5 性别编码表tblSex序号字段名含义类型宽度小数主/外键1Sex_Id性别编码Varchar1PK2Sex_Name性别Varchar10表6 民族编码表tblNation序号字段名含义类型宽度小数主外键1Nation_Id民族编码Varchar
9、2PK2Nation_Name民族名称Varchar20表7 籍贯编码表tblNtvPlc序号字段名含义类型宽度小数主/外键1NtvPlc_Id籍贯编码Varchar6PK2NtvPlc_Name籍贯名称Varchar20表8 治疗项目编码表tblItem序号字段名含义类型宽度小数 主/外键关联表/字段1Item_Id项目编码Varchar10PK2Item_Name项目名称Varchar63Item_Type项目类别Varchar64Item_Wbm五笔码Varchar305Item_Pym拼音码Varchar106Item_PerPrice项目单价float27Item_Mark备注Var
10、char20表9 病人治疗项目费用表tblMedItem序号字段名含义类型宽度小数 主/外键关联表/字段1Mi_PatId住院号Varchar10PKtblPatient / Pat_Id2Mi_ItemId项目编码Varchar10tblItem / Item_ID3Mi_Quantity数量float4Mi_Amount金额int5Mi_Date使用日期Varchar106Mi_Time使用时间Varchar507Mi_DocId医生编码Varchar10tblDoctor / Doct_Id8Mi_Advice医嘱号Varchar10表10 药品编码表tblMedicine序号字段名含义
11、类型宽度小数 主/外键关联表/字段1Med_Id药品编码Varchar17PK2Med_Wbm五笔编码Varchar63Med_Pym拼音编码Varchar64Med_Name药品名称Varchar305Med_Spec药品规格Varchar166Med_Unit计量单位Varchar67Med_PerPrice药品单价float28Med_Expirydate药品有效期Varchar表11 病人药品费用表tblMedFee序号字段名含义类型宽度小数 主/外键关联表/字段1Mf_PatId住院号Varchar10PKtblPatient / Pat_Id2Mf_ItemId药品编码Varcha
12、r17tblMedicine / Med_Id3Mf_Unit药品单位Varchar44Mf_ Quantity数量float5Mf_Amount金额float6Mf_Date使用日期Varchar107Mf_Time使用时间Varchar58Mf_DocId医生编码Varchar5tblDoctor / Doct_Id9Mf_Advice医嘱号Varchar10序号字段名含义类型宽度小数主键表12 医生编码表tblDoctor序号字段名含义类型宽度小数 主/外键关联表/字段1Doct_ID医生编码Varchar5PK2Doct_Name医生名称Varchar83Doct_Spec所属专科编码
13、Varchar8tblSpec / Spec_Id4Doct_Ward所属病区编码Varchar10tblWard / Ward_Id表13 用户表tblUser序号字段名含义类型宽度小数 主/外键关联表/字段1User_ID用户名Varchar10PK2User_Psw用户密码Varchar203User_Flag用户权限标志Varchar1三、程序设计(主)图1 用户登录界面在登录界面设计中,我采用是有连接访问数据库,这样数据并发性问题更容易控制,数据也是当前与及时更新;此外还设有用户权限,权限不同登录成功后呈现出主界面也不同;并且使用DataReader组件来以只读与仅转发方式从数据源检
14、索数据;核心代码如下:/有连接访问static string str = Data Source=ASUS-PCSQLEXPRESS;Initial Catalog=Hospital;User Id=sa;Password=sa; SqlConnection con = new SqlConnection(str);private void btn_Login_Click(object sender, EventArgs e)string cmdStr = Select * From tblLogin Where User_Name=a and User_Pwd=b; SqlCommand c
15、md = new SqlCommand(cmdStr, con); SqlParameter s1, s2; s1 = cmd.Parameters.Add(a, SqlDbType.VarChar, 20); s2 = cmd.Parameters.Add(b, SqlDbType.VarChar, 20); s1.Value = txt_UserName.Text; s2.Value = txt_UserPwd.Text;/打开连接 con.Open();/定义SqlDataReader对象 SqlDataReader dr = cmd.ExecuteReader(); /只读方式从数据源
16、检索数据 if (dr.Read()/用户权限登录 Common.User_Flag = drUser_Flag.ToString(); /显示主窗体 Form_Main frm = new Form_Main(); frm.Show(); else MessageBox.Show(用户名或密码错误!);/关闭连接 con.Close();2.主界面(主)图2 医院住院信息管理系统在主界面设计,为了将所有界面以整体方式全部实现出来,即执行一次就能看到全部效果,我在主界面添加了MenuStrip控件并且在MenuStrip控件上添加了MeauItem控件,双击MeauItem控件添加代码实现主/
17、子窗体连接;而且把界面设计漂亮、规范,我把Form窗体IsMdiContainer属性设置为True,BackgroundImage属性导入一张图片,加入一个timer控件在statusStrip显示时间;此外涉及到用户权限问题,我在Form_Load事件中添加代码,用户权限不同登录后访问主界面也不同。核心代码如下:/单击主界面上住院病人药品费用录入时,将显示出住院病人药品费用录入Form子窗体private void tsmiMfInput_Click(object sender, EventArgs e) Form_MedFee frm = new Form_MedFee(); frm.M
18、diParent = this; frm.Show(); slbl_window.Text = 当前窗体: + frm.Text;/用户权限设置private void Form_Main_Load(object sender, EventArgs e) /调用Common类静态变量User_Flag,当用户权限为0时,系统维护界面失效,但可见 if (Common.User_Flag = 0) /系统维护界面失效 MenuMaintain.Enabled = false;/timer控件显示时间private void timer1_Tick(object sender, EventArgs
19、 e) slbl_time.Text = 日期:时间: + Convert.ToString(DateTime.Now); /单击主界面上住院病人总费用录入时,将显示出住院病人总费用录入Form子窗体private void 住院病人总费用统计ToolStripMenuItem_Click(object sender, EventArgs e) Form_FeeStat frm = new Form_FeeStat(); frm.MdiParent = this; frm.Show(); slbl_window.Text = 当前窗体: + frm.Text;/单击主界面上批量复制时,将显示出
20、批量复制Form子窗体private void toolStripButton1_Click(object sender, EventArgs e) Form_Copy frm = new Form_Copy(); frm.MdiParent = this; frm.Show(); slbl_window.Text = 当前窗体: + frm.Text;/单击主界面上住院病人信息打印时,将显示出住院病人信息打印Form子窗体private void tsmiPatPint_Click(object sender, EventArgs e) Form_PatBb frm = new Form_P
21、atBb(); frm.MdiParent = this; frm.Show(); slbl_window.Text = 当前窗体: + frm.Text;3.病人信息录入(次)图3 病人信息录入病人信息用于对病人信息录入、查询与显示等操作,并且可以插入病人照片。主要代码如下:while (myReader.Read() file = new (savedImageName, .OpenOrCreate, .Write); bw = new BinaryWriter(file); startIndex = 0;/读取起点位置 retval = myReader.GetBytes(0, star
22、tIndex, outbyte, 0, bufferSize);/返回实际读取字节数 /当图片大小大于或等于数组大小时,需分块写入到文件中 while (retval = bufferSize) bw.Write(outbyte); bw.Flush(); startIndex += bufferSize;/重置读取起点位置 retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize); bw.Write(outbyte, 0, (int)retval - 1); bw.Flush(); bw.Close();4.住院病人信
23、息查询(次)图4 住院病人信息查询从数据库中将病人信息与费用显示到前台,让病人及时了解自己个人信息。代码:private void cbo_Cate_SelectedIndexChanged(object sender, EventArgs e) /无连接访问实现专科表与大类科表绑定 string cmdStr = Select * From tblSpec where Spec_Cate=a; SqlCommand cmd = new SqlCommand(cmdStr, con); SqlParameter s1; s1 = cmd.Parameters.Add(a, SqlDbType.
24、VarChar, 2); s1.Value = cbo_Cate.SelectedValue.ToString(); SqlDataAdapter dp = new SqlDataAdapter(); dp.SelectCommand = cmd; DataSet ds = new DataSet(); dp.Fill(ds, Spec); cbo_Spec.DataSource = ds.TablesSpec; if (ds.TablesSpec.Rows.Count = 0) cbo_Spec.DisplayMember = ; cbo_Spec.ValueMember = ; else
25、cbo_Spec.DisplayMember = Spec_Name; cbo_Spec.ValueMember = Spec_Id;5.住院病人总费用统计(次)图5 住院病人总费用统计住院病人总费用统计时用于统计病人住院治疗等项目总费用,及其消费药品名称、数量、金额、使用时间等,都会相信显示出来,一目了然。主要代码如下:while (rd_Cate.Read() /定义树结点 TreeNode node_Cate = new TreeNode(rd_Cate.GetValue(0).ToString(); if (rd_Cate.GetValue(1).ToString() != strin
26、g.Empty) string strSpec = select Spec_Name,Spec_Id from tblSpec where Spec_Cate=; strSpec += rd_Cate.GetValue(1).ToString(); strSpec += ; SqlCommand cmd_Spec = new SqlCommand(strSpec, con); SqlDataReader rd_Spec = cmd_Spec.ExecuteReader(); while (rd_Spec.Read() TreeNode node_Spec = new TreeNode(rd_S
27、pec.GetValue(0).ToString(); if (rd_Spec.GetValue(1).ToString() != string.Empty) string strWard = select Ward_Name,Ward_Id from tblWard whereWard_Spec=; strWard += rd_Spec.GetValue(1).ToString(); strWard += ; SqlCommand cmd_Ward = new SqlCommand(strWard, con); SqlDataReader rd_Ward = cmd_Ward.Execute
28、Reader(); while (rd_Ward.Read() TreeNode node_Ward = new TreeNode(rd_Ward.GetValue(0).ToString(); if (rd_Ward.GetValue(1).ToString() != string.Empty) string strPat = select Pat_Name from tblPatient where Pat_Ward=; strPat += rd_Ward.GetValue(1).ToString(); strPat += ; SqlCommand cmd_Pat = new SqlCom
29、mand(strPat, con); SqlDataReader rd_Pat = cmd_Pat.ExecuteReader(); while (rd_Pat.Read() TreeNode node_Pat =new TreeNode(rd_Pat.GetValue(0).ToString(); node_Ward.Nodes.Add(node_Pat); rd_Pat.Close(); node_Spec.Nodes.Add(node_Ward); rd_Ward.Close(); node_Cate.Nodes.Add(node_Spec); rd_Spec.Close(); tree
30、View_Patient.Nodes.Add(node_Cate);6.住院病人报表打印(主)图6 病人信息报表打印 病人信息报表打印是我们组重头戏,在HISDataSet内存数据集中添加一个内存表,相比其他内存数据表,这个内存数据表不是建立连接从外存数据库中拉入,而是我用Select语句编写即Patient;在解决方案资源管理器中新建Crystal报表并且从HISDataSet内存数据集中导入用Patient内存表数据信息;另外在Form窗体上添加crystalReportViewer窗体,作用是在运行时,使From窗体上查询信息显示在crystalReportViewer窗体上,形成报表格
31、式;此外在代码上也有做修改,当具体不知道病人姓名时可采用模糊查询,当点击显示与预览两个按钮时出现界面,这些都是通过代码实现,具体代码如下:/预览按钮private void tsBtn_Preview_Click(object sender, EventArgs e) /显示crystalReportViewercrystalReportViewer1.Visible = true;/定义一个CrystalReport_Patient对象cr CrystalReport_Patient cr = new CrystalReport_Patient(); cr.SetDataSource(ds.
32、TablesPatient); crystalReportViewer1.ReportSource = cr;/显示按钮private void tsBtn_Display_Click(object sender, EventArgs e)/不显示crystalReportViewer控件 crystalReportViewer1.Visible = false;private void Form_PatBb_Load(object sender, EventArgs e) cmdmandType = CommandType.Text; cmd.Connection = con; cmdman
33、dTimeout = 15;/不显示crystalReportViewer控件 crystalReportViewer1.Visible = false; /写一个私有BindingPatient()方法private void BindingPatient()/打开连接 con.Open();/使用Select语句从内存数据集HISDataSet中Patient数据表中选择信息 string cmdStr = Select Pat_Id,Pat_Bed,Pat_BedFee, ; cmdStr += Pat_Name,Pat_Sex,Pat_Birth,Pat_Nation,Pat_NtvP
34、lc,Pat_Sympton ; cmdStr += from Patient ;/模糊查询 cmdStr += Pat_Name like + textBox1.Text + %; cmdmandText = cmdStr; da.SelectCommand = cmd;/关闭连接 con.Close(); da.Fill(ds, Patient);/定义一个临时保存数据网格虚拟表对象table_Patient DataTable table_Patient = new DataTable(); table_Patient = ds.TablesPatient; dataGridView1.
35、DataSource = ds.TablesPatient; txt_Id.DataBindings.Clear(); txt_Id.DataBindings.Add(Text, table_Patient, Pat_Id); txt_Bed.DataBindings.Clear(); txt_Bed.DataBindings.Add(Text, table_Patient, Pat_Bed); txt_BedFee.DataBindings.Clear(); txt_BedFee.DataBindings.Add(Text, table_Patient, Pat_BedFee); txt_N
36、ame.DataBindings.Clear(); txt_Name.DataBindings.Add(Text, table_Patient, Pat_Name); txt_Sex.DataBindings.Clear(); txt_Sex.DataBindings.Add(Text, table_Patient, Pat_Sex); txt_Birth.DataBindings.Clear(); txt_Birth.DataBindings.Add(Text, table_Patient, Pat_Birth); txt_Nation.DataBindings.Clear(); txt_N
37、ation.DataBindings.Add(Text, table_Patient, Pat_Nation); txt_NtvPlc.DataBindings.Clear(); txt_NtvPlc.DataBindings.Add(Text, table_Patient, Pat_NtvPlc); txt_Svmpton.DataBindings.Clear(); txt_Svmpton.DataBindings.Add(Text, table_Patient, Pat_Sympton);/查询按钮private void Btn_Find_Click(object sender, EventArgs e)con.Open();/打开连接/使用Select语句从内存数据集HISDataSet中Patient数据表中选择信息 string cmdStr = Select Pat_Id,Pat_Bed,Pat_BedFee,Pat_Name,Sex_Name,Pat_Birth,Nation_Name,NtvPlc_Name,Pat_Sympton ; cmdStr += from P
限制150内