1、一、系统需求与功能分析 1系统需求分析医院信息化是医院应用信息技术及其产品的过程,是信息技术由局部到全局、由战术层次到战略层次向医院的全面渗透,运用于流程管理、支持医院经营管理的过程。信息化的实施从自上而下的角度说,必须与医院的制度创新、组织创新和管理创新结合;从自上而下的角度说,必须以作为医院主体的业务人员直接受益及其使用水平的逐步提高为基础。调查用户需求:本系统的最终用户为医院,我们根据从医院方面取得的图表资料、文字资料以及其他细节方面的信息,根据我们日常生活中的经验,根据我们所做的其他询问和调查,得出用户的下列实际要求:用户对系统的要求:信息要求:由于系统的使用主体是医院的管理人员,因此
2、对系统的信息要求可分为以下方面:(1)病人信息:首先是病人的基本信息,主要包括病人的姓名,性别,出生年月,年龄,家庭住址,联系方式等;:对于住院病人,还需要入院时间,所在病区,所在医科,床位等。(2)处理要求:系统应当完成以下的信息处理:存储病人信息,供相应的人员查询;:对病人信息进行及时的更新和统计;(3)安全性要求:系统应设置访问用户的标识以鉴别是否是合法用户,并要求合法用户设置其密码,保证用户身份不被盗用。2. 功能分析(1)信息录入处理:住院病人信息录入、住院病人治疗费用录入、住院病人药品费用录入。 住院病人信息录入就是将源数据库中没有的病人信息重新录入进去,并且可以录入病人姓名。住院
3、病人费用录入和住院病人药品录入功能相近,都是将 病人在住院期间的所花的费用进行录入保存,方便以后进行查询。(2)信息查询处理:住院病人信息查询和住院病人费用查询。 住院病人信息查询和住院病人费用查询功能相似,从数据库中将病人信息和费用显示到前台,让病人及时了解自己的个人信息和消费情况。(3)信息统计处理:住院病人总费用统计按大类科、专科、病区及指定的病人进行查询统计(4)信息打印处理:住院病人信息打印住院病人信息报表打印用于显示病人的住院号、床位号、床位费、病人姓名、性别编码出生日期、民族、籍贯和病症等详细信息。(5)系统维护处理:病人信息维护、大类科编码维护、专科编码维护、病区编码维护、治疗
4、项目编码维护、药品编码维护医生编码维护和用户编码维护。系统编码维护时分别对病人信息、大类科、专科、病区、治疗项目、药品信息、医生信息和用户信息进行录入、查询与修改等操作,数据编码表维护是对各类数据编码表中的记录进行录入、查询与修改等操作。3.系统功能菜单由此方案设计的系统功能菜单如下表所示。信息录入信息查询信息统计数据打印系统维护信息复制病人信息录入病人信息查询病人总费用统计病人信息打印系统维护批量复制病人治疗费用录入病人费用查询大类科编码维护病人药品费用录入专科编码维护病区编码维护治疗项目维护药品编码维护医生编码维护用户编码维护 表 学生成绩管理功能菜单二、数据库设计设计系统的数据库结构、数
5、据表结构包含序号、数据项名、含义、数据项类型、长度、非空、索引、主键、外键、引用字段、数据来源等。1.大类科编码表Category表1 大类科编码表tblCategory序号字段名含义类型宽度小数主/外键1Cate_Id 大类科编码Varchar10PK2Cate_Name大类科名称Varchar203Cate_Dean大类科主任Varchar102.专科编码表Spec表2 专科编码表tblSpec序号字段名含义类型宽度小数 主/外键关联表/字段1Spec_Id专科编码Varchar10PK2Spec_Name专科名称Varchar303Spec_Cate所属大类科编码Varchar10FKt
6、blCategory / Cate_ID3.病区编码表Ward表3 病区编码表tblWard序号字段名含义类型宽度小数 主/外键关联表/字段1Ward_Id病区编码Varchar10PK2Ward _Name病区名称Varchar203Ward_Pos病区位置Varchar204Ward_Beds总床位数Int5Ward_Used已用床位数Int6Ward_Rest剩余床位数flaot7Ward_Head病区主任Varchar108Ward_Spec所属专科编码Varchar 2FKtblSpec / Spec_ID4.病人信息表Patient表4 病人信息表tblPatient序号字段名含义
7、类型宽度小数 主/外键关联表/字段1Pat_Id住院号Varchar10PK2Pat_Bed 床位号Varchar503Pat_BedFee床位费money24Pat_Name病人姓名Varchar85Pat_Sex性别编码Varchar1tblSex / Sex_ID6Pat_Birth出生日期Datetime7Pat_Nation民族Varchar2tblNation / Nation_ID8Pat_NtvPlc籍贯Varchar6tblNtvPlc / NtvPlc_ID9Pat_Sympton病症Varchar2010Pat_Work工作单位Varchar2011Pat_CharId身
8、份证号Varchar4012Pat_Ward病区编码Varchar10tblWard / Ward_ID13Pat_ZipCode住宅邮编Varchar614Pat_Phone住宅电话Varchar2015Pat_Addr户口地址Varchar5016Pat_Admit入院日期Datetime17Pat_Leave出院日期Datetime18Pat_PayAd预交费money219Pat_PaySum费用总额money220Pat_PayRest费用结余money221Pat_Image病人照片Image5.性别编码表Sex表5 性别编码表tblSex序号字段名含义类型宽度小数主/外键1Sex
9、_Id性别编码Varchar1PK2Sex_Name性别Varchar106.民族编码表Nation表6 民族编码表tblNation序号字段名含义类型宽度小数主外键1Nation_Id民族编码Varchar2PK2Nation_Name民族名称Varchar207.籍贯编码表NtvPlc表7 籍贯编码表tblNtvPlc序号字段名含义类型宽度小数主/外键1NtvPlc_Id籍贯编码Varchar6PK2NtvPlc_Name籍贯名称Varchar208.治疗项目编码表Item表8 治疗项目编码表tblItem序号字段名含义类型宽度小数 主/外键关联表/字段1Item_Id项目编码Varcha
10、r10PK2Item_Name项目名称Varchar63Item_Type项目类别Varchar64Item_Wbm五笔码Varchar305Item_Pym拼音码Varchar106Item_PerPrice项目单价float27Item_Mark备注Varchar209.病人治疗项目费用表MedItem表9 病人治疗项目费用表tblMedItem序号字段名含义类型宽度小数 主/外键关联表/字段1Mi_PatId住院号Varchar10PKtblPatient / Pat_Id2Mi_ItemId项目编码Varchar10tblItem / Item_ID3Mi_Quantity数量floa
11、t4Mi_Amount金额int5Mi_Date使用日期Varchar106Mi_Time使用时间Varchar507Mi_DocId医生编码Varchar10tblDoctor / Doct_Id8Mi_Advice医嘱号Varchar1010.药品编码表Medicine表10 药品编码表tblMedicine序号字段名含义类型宽度小数 主/外键关联表/字段1Med_Id药品编码Varchar17PK2Med_Wbm五笔编码Varchar63Med_Pym拼音编码Varchar64Med_Name药品名称Varchar305Med_Spec药品规格Varchar166Med_Unit计量单位
12、Varchar67Med_PerPrice药品单价float28Med_Expirydate药品有效期Varchar11.病人药品费用表MedFee表11 病人药品费用表tblMedFee序号字段名含义类型宽度小数 主/外键关联表/字段1Mf_PatId住院号Varchar10PKtblPatient / Pat_Id2Mf_ItemId药品编码Varchar17tblMedicine / Med_Id3Mf_Unit药品单位Varchar44Mf_ Quantity数量float5Mf_Amount金额float6Mf_Date使用日期Varchar107Mf_Time使用时间Varchar
13、58Mf_DocId医生编码Varchar5tblDoctor / Doct_Id9Mf_Advice医嘱号Varchar1012.医生编码表Doctor序号字段名含义类型宽度小数主键表12 医生编码表tblDoctor序号字段名含义类型宽度小数 主/外键关联表/字段1Doct_ID医生编码Varchar5PK2Doct_Name医生名称Varchar83Doct_Spec所属专科编码Varchar8tblSpec / Spec_Id4Doct_Ward所属病区编码Varchar10tblWard / Ward_Id13.用户表User表13 用户表tblUser序号字段名含义类型宽度小数 主
14、/外键关联表/字段1User_ID用户名Varchar10PK2User_Psw用户密码Varchar203User_Flag用户权限标志Varchar1三、程序设计1.系统登录(主)图1 用户登录界面在登录界面的设计中,我采用的是有连接访问数据库,这样数据并发性问题更容易控制,数据也是当前的和及时更新的;此外还设有用户权限,权限不同登录成功后呈现出的主界面也不同;并且使用DataReader组件来以只读和仅转发的方式从数据源检索数据;核心代码如下:/有连接访问static string str = Data Source=ASUS-PCSQLEXPRESS;Initial Catalog=H
15、ospital;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 cmd = new SqlCommand(cmdStr, con); SqlParameter s1, s2; s1 = cmd.Parameters.Add(a, Sq
16、lDbType.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(); /只读的方式从数据源检索数据 if (dr.Read() /用户权限登录 Common.User_Flag = drUser_Flag.ToString(); /显示主窗体 Form_M
17、ain frm = new Form_Main(); frm.Show(); else MessageBox.Show(用户名或密码错误!); /关闭连接 con.Close();2.主界面(主)图2 医院住院信息管理系统在主界面设计,为了将所有界面以整体的方式全部实现出来,即执行一次就能看到全部效果,我在主界面添加了MenuStrip控件并且在MenuStrip控件上添加了MeauItem控件,双击MeauItem控件添加代码实现主/子窗体连接;而且把界面设计的漂亮、规范,我把Form窗体的IsMdiContainer属性设置为True,BackgroundImage属性导入一张图片,加入一
18、个timer控件在statusStrip显示时间;此外涉及到用户权限问题,我在Form_Load事件中添加代码,用户权限不同登录后访问的主界面也不同。核心代码如下:/单击主界面上住院病人药品费用录入时,将显示出住院病人药品费用录入的Form子窗体private void tsmiMfInput_Click(object sender, EventArgs e) Form_MedFee frm = new Form_MedFee(); frm.MdiParent = this; frm.Show(); slbl_window.Text = 当前窗体: + frm.Text;/用户权限设置priv
19、ate 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 e) slbl_time.Text = 日期:时间: + Convert.ToString(DateTime.Now); /单击主界面上住院病人总
20、费用录入时,将显示出住院病人总费用录入的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; /单击主界面上批量复制时,将显示出批量复制的Form子窗体private void toolStripButton1_Click(object sender, EventArgs
21、 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_PatBb(); frm.MdiParent = this; frm.Show(); slbl_window.Text = 当前窗体: +
22、frm.Text;3.病人信息录入(次)图3 病人信息录入病人信息用于对病人信息的录入、查询和显示等操作,并且可以插入病人照片。主要代码如下:while (myReader.Read() file = new FileStream(savedImageName, FileMode.OpenOrCreate, FileAccess.Write); bw = new BinaryWriter(file); startIndex = 0;/读取的起点位置 retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);/返回实际读取
23、的字节数 /当图片大小大于或等于数组大小时,需分块写入到文件中 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(); file.Close();4.住院病人信息查询(次)图4 住院病人信息查询从数据库中将
24、病人信息和费用显示到前台,让病人及时了解自己的个人信息。代码: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.VarChar, 2); s1.Value
25、 = 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 cbo_Spec.DisplayMembe
26、r = 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() != string.Empty) string st
27、rSpec = 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_Spec.GetValue(0).To
28、String(); 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.ExecuteReader(); while (r
29、d_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 SqlCommand(strPat, con);
30、 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(); treeView_Patient.Nodes
31、.Add(node_Cate);6.住院病人报表打印(主)图6 病人信息报表打印 病人信息报表打印是我们组的重头戏,在HISDataSet内存数据集中添加一个内存表,相比其他内存数据表,这个内存数据表不是建立连接从外存数据库中拉入的,而是我用Select语句编写的即Patient;在解决方案资源管理器中新建Crystal报表并且从HISDataSet内存数据集中导入用Patient内存表的数据信息;另外在Form窗体上添加crystalReportViewer窗体,作用是在运行时,使From窗体上查询的信息显示在crystalReportViewer窗体上,形成报表的格式;此外在代码上也有做修
32、改,当具体不知道病人的姓名时可采用模糊查询,当点击显示和预览两个按钮时出现的界面,这些都是通过代码实现的,具体代码如下:/预览按钮private void tsBtn_Preview_Click(object sender, EventArgs e) /显示crystalReportViewercrystalReportViewer1.Visible = true;/定义一个CrystalReport_Patient对象cr CrystalReport_Patient cr = new CrystalReport_Patient(); cr.SetDataSource(ds.TablesPat
33、ient); 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) cmd.CommandType = CommandType.Text; cmd.Connection = con; cmd.Command
34、Timeout = 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_Ntv
35、Plc,Pat_Sympton ; cmdStr += from Patient ;/模糊查询 cmdStr += Pat_Name like + textBox1.Text + %; cmd.CommandText = cmdStr; da.SelectCommand = cmd;/关闭连接 con.Close(); da.Fill(ds, Patient);/定义一个临时保存数据的网格虚拟表的对象table_Patient DataTable table_Patient = new DataTable(); table_Patient = ds.TablesPatient; dataGri
36、dView1.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_Name.DataBindings.Clear(); txt_Name.DataBindings.Add(Text, table_Patient, Pat_Name); txt_Sex.DataBindings.
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100