资源描述
无锡职业技术学院课程设计说明书
一、系统需求与功能分析
1.系统需求分析
医院信息化是医院应用信息技术及其产品的过程,是信息技术由局部到全局、由战术层次到战略层次向医院的全面渗透,运用于流程管理、支持医院经营管理的过程。信息化的实施从自上而下的角度说,必须与医院的制度创新、组织创新和管理创新结合;从自上而下的角度说,必须以作为医院主体的业务人员直接受益及其使用水平的逐步提高为基础。
调查用户需求:
本系统的最终用户为医院,我们根据从医院方面取得的图表资料、文字资料以及其他细节方面的信息,根据我们日常生活中的经验,根据我们所做的其他询问和调查,得出用户的下列实际要求:
用户对系统的要求:
信息要求:
由于系统的使用主体是医院的管理人员,因此对系统的信息要求可分为以下方面:
(1)病人信息
①:首先是病人的基本信息,主要包括病人的姓名,性别,出生年月,年龄,家庭住址,联系方式等;
②:对于住院病人,还需要入院时间,所在病区,所在医科,床位等.
(2)处理要求:
系统应当完成以下的信息处理:
①:存储病人信息,供相应的人员查询;
②:对病人信息进行及时的更新和统计;
(3)安全性要求:
系统应设置访问用户的标识以鉴别是否是合法用户,并要求合法用户设置其密码,保证用户身份不被盗用.
2. 功能分析
(1)信息录入处理:住院病人信息录入、住院病人治疗费用录入、住院病人药品费用录入。
住院病人信息录入就是将源数据库中没有的病人信息重新录入进去,并且可以录入病人姓名.住院病人费用录入和住院病人药品录入功能相近,都是将 病人在住院期间的所花的费用进行录入保存,方便以后进行查询。
(2)信息查询处理:住院病人信息查询和住院病人费用查询。
住院病人信息查询和住院病人费用查询功能相似,从数据库中将病人信息和费用显示到前台,让病人及时了解自己的个人信息和消费情况。
(3)信息统计处理:住院病人总费用统计
按大类科、专科、病区及指定的病人进行查询统计
(4)信息打印处理:住院病人信息打印
住院病人信息报表打印用于显示病人的住院号、床位号、床位费、病人姓名、性别编码出生日期、民族、籍贯和病症等详细信息。
(5)系统维护处理:病人信息维护、大类科编码维护、专科编码维护、病区编码维护、治疗项目编码维护、药品编码维护医生编码维护和用户编码维护。
系统编码维护时分别对病人信息、大类科、专科、病区、治疗项目、药品信息、医生信息和用户信息进行录入、查询与修改等操作,数据编码表维护是对各类数据编码表中的记录进行录入、查询与修改等操作。
3。系统功能菜单
由此方案设计的系统功能菜单如下表所示。
信息录入
信息查询
信息统计
数据打印
系统维护
信息复制
病人信息录入
病人信息查询
病人总费用统计
病人信息打印
系统维护
批量复制
病人治疗费用录入
病人费用查询
大类科编码维护
病人药品费用录入
专科编码维护
病区编码维护
治疗项目维护
药品编码维护
医生编码维护
用户编码维护
表 学生成绩管理功能菜单
二、数据库设计
设计系统的数据库结构、数据表结构包含序号、数据项名、含义、数据项类型、长度、非空、索引、主键、外键、引用字段、数据来源等。
1.大类科编码表Category
表1 大类科编码表tblCategory
序号
字段名
含义
类型
宽度
小数
主/外键
1
Cate_Id
大类科编码
Varchar
10
PK
2
Cate_Name
大类科名称
Varchar
20
3
Cate_Dean
大类科主任
Varchar
10
2.专科编码表Spec
表2 专科编码表tblSpec
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Spec_Id
专科编码
Varchar
10
PK
2
Spec_Name
专科名称
Varchar
30
3
Spec_Cate
所属大类科编码
Varchar
10
FK
tblCategory / Cate_ID
3。病区编码表Ward
表3 病区编码表tblWard
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Ward_Id
病区编码
Varchar
10
PK
2
Ward _Name
病区名称
Varchar
20
3
Ward_Pos
病区位置
Varchar
20
4
Ward_Beds
总床位数
Int
5
Ward_Used
已用床位数
Int
6
Ward_Rest
剩余床位数
flaot
7
Ward_Head
病区主任
Varchar
10
8
Ward_Spec
所属专科编码
Varchar
2
FK
tblSpec / Spec_ID
4.病人信息表Patient
表4 病人信息表tblPatient
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Pat_Id
住院号
Varchar
10
PK
2
Pat_Bed
床位号
Varchar
50
3
Pat_BedFee
床位费
money
2
4
Pat_Name
病人姓名
Varchar
8
5
Pat_Sex
性别编码
Varchar
1
tblSex / Sex_ID
6
Pat_Birth
出生日期
Datetime
7
Pat_Nation
民族
Varchar
2
tblNation / Nation_ID
8
Pat_NtvPlc
籍贯
Varchar
6
tblNtvPlc / NtvPlc_ID
9
Pat_Sympton
病症
Varchar
20
10
Pat_Work
工作单位
Varchar
20
11
Pat_CharId
身份证号
Varchar
40
12
Pat_Ward
病区编码
Varchar
10
tblWard / Ward_ID
13
Pat_ZipCode
住宅邮编
Varchar
6
14
Pat_Phone
住宅电话
Varchar
20
15
Pat_Addr
户口地址
Varchar
50
16
Pat_Admit
入院日期
Datetime
17
Pat_Leave
出院日期
Datetime
18
Pat_PayAd
预交费
money
2
19
Pat_PaySum
费用总额
money
2
20
Pat_PayRest
费用结余
money
2
21
Pat_Image
病人照片
Image
5。性别编码表Sex
表5 性别编码表tblSex
序号
字段名
含义
类型
宽度
小数
主/外键
1
Sex_Id
性别编码
Varchar
1
PK
2
Sex_Name
性别
Varchar
10
6。民族编码表Nation
表6 民族编码表tblNation
序号
字段名
含义
类型
宽度
小数
主外键
1
Nation_Id
民族编码
Varchar
2
PK
2
Nation_Name
民族名称
Varchar
20
7.籍贯编码表NtvPlc
表7 籍贯编码表tblNtvPlc
序号
字段名
含义
类型
宽度
小数
主/外键
1
NtvPlc_Id
籍贯编码
Varchar
6
PK
2
NtvPlc_Name
籍贯名称
Varchar
20
8.治疗项目编码表Item
表8 治疗项目编码表tblItem
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Item_Id
项目编码
Varchar
10
PK
2
Item_Name
项目名称
Varchar
6
3
Item_Type
项目类别
Varchar
6
4
Item_Wbm
五笔码
Varchar
30
5
Item_Pym
拼音码
Varchar
10
6
Item_PerPrice
项目单价
float
2
7
Item_Mark
备注
Varchar
20
9.病人治疗项目费用表MedItem
表9 病人治疗项目费用表tblMedItem
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Mi_PatId
住院号
Varchar
10
PK
tblPatient / Pat_Id
2
Mi_ItemId
项目编码
Varchar
10
tblItem / Item_ID
3
Mi_Quantity
数量
float
4
Mi_Amount
金额
int
5
Mi_Date
使用日期
Varchar
10
6
Mi_Time
使用时间
Varchar
50
7
Mi_DocId
医生编码
Varchar
10
tblDoctor / Doct_Id
8
Mi_Advice
医嘱号
Varchar
10
10。药品编码表Medicine
表10 药品编码表tblMedicine
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Med_Id
药品编码
Varchar
17
PK
2
Med_Wbm
五笔编码
Varchar
6
3
Med_Pym
拼音编码
Varchar
6
4
Med_Name
药品名称
Varchar
30
5
Med_Spec
药品规格
Varchar
16
6
Med_Unit
计量单位
Varchar
6
7
Med_PerPrice
药品单价
float
2
8
Med_Expirydate
药品有效期
Varchar
11.病人药品费用表MedFee
表11 病人药品费用表tblMedFee
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Mf_PatId
住院号
Varchar
10
PK
tblPatient / Pat_Id
2
Mf_ItemId
药品编码
Varchar
17
tblMedicine / Med_Id
3
Mf_Unit
药品单位
Varchar
4
4
Mf_ Quantity
数量
float
5
Mf_Amount
金额
float
6
Mf_Date
使用日期
Varchar
10
7
Mf_Time
使用时间
Varchar
5
8
Mf_DocId
医生编码
Varchar
5
tblDoctor / Doct_Id
9
Mf_Advice
医嘱号
Varchar
10
12。医生编码表Doctor
序号
字段名
含义
类型
宽度
小数
主键
表12 医生编码表tblDoctor
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
Doct_ID
医生编码
Varchar
5
PK
2
Doct_Name
医生名称
Varchar
8
3
Doct_Spec
所属专科编码
Varchar
8
tblSpec / Spec_Id
4
Doct_Ward
所属病区编码
Varchar
10
tblWard / Ward_Id
13.用户表User
表13 用户表tblUser
序号
字段名
含义
类型
宽度
小数
主/外键
关联表/字段
1
User_ID
用户名
Varchar
10
PK
2
User_Psw
用户密码
Varchar
20
3
User_Flag
用户权限标志
Varchar
1
三、程序设计
1.系统登录(主)
图1 用户登录界面
在登录界面的设计中,我采用的是有连接访问数据库,这样数据并发性问题更容易控制,数据也是当前的和及时更新的;此外还设有用户权限,权限不同登录成功后呈现出的主界面也不同;并且使用DataReader组件来以只读和仅转发的方式从数据源检索数据;核心代码如下:
//有连接访问
static string str = ”Data Source=ASUS—PC\\SQLEXPRESS;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 cmd = 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();
//只读的方式从数据源检索数据
if (dr。Read())
{
//用户权限登录
Common.User_Flag = dr[”User_Flag"]。ToString();
//显示主窗体
Form_Main frm = new Form_Main();
frm.Show();
}
else
{
MessageBox.Show(”用户名或密码错误!");
}
//关闭连接
con.Close();
}
2。主界面(主)
图2 医院住院信息管理系统
在主界面设计,为了将所有界面以整体的方式全部实现出来,即执行一次就能看到全部效果,我在主界面添加了MenuStrip控件并且在MenuStrip控件上添加了MeauItem控件,双击MeauItem控件添加代码实现主/子窗体连接;而且把界面设计的漂亮、规范,我把Form窗体的IsMdiContainer属性设置为True,BackgroundImage属性导入一张图片,加入一个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;
}
//用户权限设置
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 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;
}
//单击主界面上批量复制时,将显示出批量复制的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_PatBb();
frm。MdiParent = this;
frm。Show();
slbl_window。Text = " 当前窗体:” + 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);//返回实际读取的字节数
//当图片大小大于或等于数组大小时,需分块写入到文件中
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 住院病人信息查询
从数据库中将病人信息和费用显示到前台,让病人及时了解自己的个人信息。代码:
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 = cbo_Cate。SelectedValue。ToString();
SqlDataAdapter dp = new SqlDataAdapter();
dp.SelectCommand = cmd;
DataSet ds = new DataSet();
dp。Fill(ds, "Spec”);
cbo_Spec.DataSource = ds。Tables["Spec”];
if (ds。Tables["Spec”]。Rows。Count == 0)
{
cbo_Spec。DisplayMember = "”;
cbo_Spec。ValueMember = ”";
}
else
{
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() != string.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_Spec.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。ExecuteReader();
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 SqlCommand(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();
}
treeView_Patient.Nodes。Add(node_Cate);
}
6。住院病人报表打印(主)
图6 病人信息报表打印
病人信息报表打印是我们组的重头戏,在HISDataSet内存数据集中添加一个内存表,相比其他内存数据表,这个内存数据表不是建立连接从外存数据库中拉入的,而是我用Select语句编写的即Patient;在解决方案资源管理器中新建Crystal报表并且从HISDataSet内存数据集中导入用Patient内存表的数据信息;另外在Form窗体上添加crystalReportViewer窗体,作用是在运行时,使From窗体上查询的信息显示在crystalReportViewer窗体上,形成报表的格式;此外在代码上也有做修改,当具体不知道病人的姓名时可采用模糊查询,当点击显示和预览两个按钮时出现的界面,这些都是通过代码实现的,具体代码如下:
//预览按钮
private void tsBtn_Preview_Click(object sender, EventArgs e)
{
//显示crystalReportViewer
crystalReportViewer1.Visible = true;
//定义一个CrystalReport_Patient对象cr
CrystalReport_Patient cr = new CrystalReport_Patient();
cr。SetDataSource(ds。Tables["Patient”]);
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.CommandTimeout = 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_NtvPlc,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。Tables["Patient"];
dataGridView1.DataSource = ds.Tables[”Patient"];
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.DataBindin
展开阅读全文