WCF医院管理系统技术解析 (二)体检登记(一)
体检登记模块
体检登记这个模块主要是记录需要体检的病人信息 ,如每次体检的项目、和相关现金价格,以及项目类型和体检状态等等体检信息。可以通过查询病人姓名和病人卡号进行筛选查询,还可以对“未登记”病人进行提交体检登记 以及新增体检病人、对新增的体检病人进行前台收费、关闭当前页面和进入上下页等。
界面效果图:
2.9.8(图1)
从界面上可以看到我们这里用到的控件有
控件 | 说明 从工具箱中找到对应的控件,可以设置控件的一些属性和事件。如显示的文本,命名是规范
|
文本框 (TextBox) | |
下拉框 (ComBobox) | |
数据表格 (DataGridView) | |
按钮(Button) | |
标签 (Label) |
查询功能实现:
第一步数据库:
2.9.8(图2)
2.9.8(图3)
2.9.8(图4)
2.9.8(图5)
表1:员工表BT_StaffTable
用于记录跟踪病人开单的信息
列名 | 数据类型 | 主键/外键 | 说明 |
StaffID | int | 主键 | 员工ID |
TechnicalOfficesID | int | 外键 | 科室ID |
StaffNumber | nchar (20) |
| 员工编号 |
StaffName | nchar (20) |
| 员工名称 |
WhetherOperator | bit |
| 操作员否 |
AlphabeticBrevityCode | nchar (20) |
| 拼音简码 |
WubiInCode | nchar (20) |
| 五笔简码 |
AS_StaffPositionID | int | 外键 | 员工职务ID |
AS_MedicalTitlesID | int | 外键 | 医务职称ID |
AS_WorkingStatusID | int | 外键 | 工作状态ID |
AS_SexID | int | 外键 | 性别ID |
ContactTelephone | nchar (50) |
| 联系电话 |
WhetherBuiltIn | bit |
| 内置否 |
RegisteredSum | decimal (18, 2) |
| 挂号金额 |
AS_IntoTheHobbyID | int | 外键 | 录入爱好ID |
StaffPhotos | char (200) |
| 员工照片 |
| nchar (70) |
| 电子邮件 |
IDCardNo | nchar (100) |
| 身份证号 |
ContactAddress | nchar (100) |
| 联系地址 |
Birthday | datetime |
| 出生日期 |
WhetherBirthdayRemind | bit |
| 生日提醒否 |
WorkDate | datetime |
| 工作日期 |
TerminationDate | datetime |
| 离职日期 |
AS_OfficialAcademicCredentialsID | int | 外键 | 最高学历ID |
StudySubject | nchar (70) |
| 学习专业 |
AS_PoliticsStatusID | int | 外键 | 政治面貌ID |
Remarks | nchar (100) |
| 员工备注 |
WhetherEffective | bit | ((1)) | 有效否 |
表 2 :收费单表( PW_ ChargeBillID)
用于对病人的处方单或者其他收费单进行收费的凭证
列名 | 数据类型 | 主键/外键 | 说明 |
ChargeBillID | int | 主键 | 收费单ID |
ReceiptNumber | nchar (30) |
| 收据号 |
BillNumber | nchar (30) |
| 发票号 |
AS_ChargeStatusID | int | 外键 | 收费状态ID |
OrdonnanceID | int | 外键 | 处方单ID |
Discount | decimal (18, 2) |
| 折扣 |
CashPaySum | decimal (18, 2) |
| 现金支付金额 |
MedicarePaySum | decimal (18, 2) |
| 医保支付金额 |
BlockPaySum | decimal (18, 2) |
| 卡付金额 |
TallyPaySum | decimal (18, 2) |
| 记账支付金额 |
Operator_StaffID | int | 外键 | 操作员_员工ID |
OperateTime | datetime |
| 操作时间 |
WhetherCancel | bit |
| 作废否 |
WhetherEffective | bit | ((1)) | 有效否 |
WhetherOrdonnance | Bit |
| 是否经过处方 |
表3:体检登记病人表(PW_PhysicalExaminationChargeBillPatientTable)
列名 | 数据类型 | 主键/外键 | 说明 |
PhysicalExaminationChargeBillPatientID | Int | 主键 | 体检登记病人ID |
PatientID | Int | 外键 | 病人ID |
ChargeBillID | Int | 外键 | 收费单ID |
AuxiliaryItemDetailID | Int | 外键 | 辅助项目明细ID |
WhetherChargeBill | Bit |
| 是否收费 |
表 4 辅助项目明细表 ( PW_AuxiliaryItemDetailTable)
用于对病人设置体检、化验项目或组合
列名 | 数据类型 | 主键/外键 | 说明 |
AuxiliaryItemDetailID | int | 主键 | 辅助明细项目ID |
RegisterID | int | 外键 | 挂号ID |
AllItemID | int | 外键 | 总项目ID |
ItemCategoryID | int | 外键 | 项目类别ID |
WhetherEffective | bit | ((1)) | 是否有效 |
AS_PhysicalExaminationRegisterID | int | 外键 | 体检登记ID |
OrdonnanceID | int | 外键 | 处方单ID |
表5:项目类别表 (PW_ItemCategoryTable)
用于判断病人的项目类别
列名 | 数据类型 | 主键/外键 | 说明 |
ItemCategoryID | int | 主键 | 项目类别ID |
ItemCategoryName | nchar (30) | 外键 | 项目类别名称 |
表 6 :病人表( BT_PatientTable)
用于新增病人
列名 | 数据类型 | 主键/外键 | 说明 |
PatientID | int | 主键 | 病人ID |
PatientCardNumber | nchar (50) |
| 病人卡号 |
PatientName | nchar (30) |
| 病人名称 |
RegisterCategoryID | int | 外键 | 挂号类别 ID |
AS_SexID | int | 外键 | 性别ID |
Birthday | datetime |
| 出生年月 |
IDCardNo | nchar (50) |
| 身份证号 |
AS_MaritalStatusID | int | 外键 | 婚姻情况ID |
Profession | nchar (50) |
| 所在职业 |
MemberTypeID | int | 外键 | 会员类型ID |
MedicareCardNumber | nchar (50) |
| 医保卡号 |
AS_InsuredTypeID | int | 外键 | 参保类型ID |
ContactTelephone | nchar (30) |
| 联系电话 |
ContactAddress | nchar (100) |
| 联系地址 |
DrugAllergyHistory | nchar (100) |
| 药物过敏史 |
PatientCategoryID | int | 外键 | 病人类别ID |
Age | nchar (30) |
| 年龄 |
AlphabeticBrevityCode | nchar (20) |
| 拼音简码 |
WubiInCode | nchar (20) |
| 五笔简码 |
ContactMobilePhone | nchar (30) |
| 联系手机 |
| nchar (30) |
| 电子邮件 |
Introducer | nchar (30) |
| 介绍人员 |
PersonalTaboo | nchar (70) |
| 个人忌讳 |
HighestReputation | nchar (70) |
| 信誉上限 |
NowIntegral | nchar (50) |
| 当前积分 |
Debt | decimal (18, 2) |
| 尚欠金额 |
ExpenseSum | decimal (18, 2) |
| 消费金额 |
LastTime | datetime |
| 上次时间 |
LastDoctor_StaffID | int | 外键 | 上次医生 |
Prescriptions | nchar (50) |
| 总处方数 |
PatientPhotos | char (200) |
| 病人照片 |
WhetherEffective | bit | ((1)) | 有效否 |
WhetherFromPhysicalExamination | Bit |
| 是否体检 |
表 7 :属性明细表( BT_AttributeDetailsTable)
用于普通常用字段录入
列名 | 数据类型 | 主键/外键 | 说明 |
AttributeDetailsID | int | 主键 | 属性明细ID |
AttributeDetailsID_F | int | 外键 | 属性明细ID_F |
AttributeSetID | int | 外键 | 属性明细ID |
AttributeDetailsName | nchar (30) |
| 属性明细名称 |
Number | nchar (30) |
| 编号 |
RetrievalInCode | nchar (30) |
| 检索简码 |
BuiltInIdentifiers | bit | ((0)) | 内置标识 |
Remarks | nchar (100) |
| 备注 |
WhetherEffective | bit | ((1)) | 有效否 |
表 8 :处方单表( PW_ OrdonnanceTable )
用于对体检病人进行开处方
列名 | 数据类型 | 主键/外键 | 说明 |
OrdonnanceID | int | 主键 | 处方单ID |
OrdonnanceNumber | nchar (30) |
| 处方单号 |
PatientID | int | 外键 | 病人ID |
PrescriptionDate | datetime |
| 处方时间 |
ClinicTechnicalOffices_TechnicalOfficesID | int | 外键 | 就诊科室_科室ID |
TreatmentDoctor_StaffID | int | 外键 | 就诊医生_员工ID |
AS_ChargeStatusID | int | 外键 | 收费状态ID |
ChargeForPersonnel_StaffID | int | 外键 | 收费人员_员工ID |
ChargeTime | datetime |
| 收费时间 |
AS_TakeMedicineStatusID | int | 外键 | 发药状态ID |
TakeMedicinePersonnel_StaffID | int | 外键 | 发药人员_员工ID |
TakeMedicineTime | datetime |
| 发药时间 |
BedID | int | 外键 | 床位ID |
WhetherEffective | bit | ((1)) | 有效否 |
控件使用方法:
以Labe为例(其他控件的使用方法大同小异)Label的使用方法如下:
点击工具箱,拖动Label到界面
2.9.8(图6)
右键设置该控件中的属性样式和事件等如图:
2.9.8(图7)
控件下拉框的数据绑定:下拉框主要绑定数据供用户选择合适需要的基础数据
2.9.8(图8)
数据库中的储存过程:(其他涉及到数据绑定的控件都需要用到对应的储存过程,方法和这个类似,下面就不截图了)
--绑定性别
IF @Type = 'FRM_TiJianDengJi_Main_cbo_AS_SexID'
BEGIN
SELECT RTRIM(AttributeDetailsID) AS AttributeDetailsID, RTRIM(AttributeDetailsName) AS AttributeDetailsName
FROM BT_AttributeDetailsTable
WHERE AttributeSetID = 2
END
BLL(逻辑层)中的方法:
与数据库对应的BLL,方法都是找到对应的BLL在里面写代码和这个类似,下面就不截图了
2.9.8(图10)
#region 绑定性别
[OperationContract]
public DataSet FRM_TiJianDengJi_Main_cbo_AS_SexID()
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
};
mySqlParameters[0].Value = "FRM_TiJianDengJi_Main_cbo_AS_SexID ";
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_TiJianDengJi_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
#endregion
UIL(界面层)中的代码:
cbo_AS_SexID.DataSource = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_cbo_AS_SexID().Tables[0];//绑定性别
cbo_AS_SexID.DisplayMember = "AttributeDetailsName";
cbo_AS_SexID.ValueMember = "AttributeDetailsID";
数据表格(DataGridView)的界面:
2.9.8(图11)
数据库中的储存过程(分页涉及到了该储存过程):
查询体检登记页面中的病人登记信息
IF @Type = 'FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu'
BEGIN
--不经处方的病人
SELECT RTRIM( BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber , RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,RTRIM(PW_AuxiliaryItemDetailTable.
AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID, RTRIM(BT_AttributeDetailsTable.AttributeDetailsID) AS AttributeDetailsID,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS 体检登记, RTRIM('无') AS OrdonnanceNumber,RTRIM( BT_PatientTable.PatientID) AS PatientID,
RTRIM(PW_ChargeBillTable.Operator_StaffID) AS TreatmentDoctor_StaffID, RTRIM(0) AS OrdonnanceID, PW_ChargeBillTable.OperateTime AS PrescriptionDate,
RTRIM(PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID) AS ChargeBillID
FROM PW_AuxiliaryItemDetailTable INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable_1.AttributeDetailsID ON
PW_AuxiliaryItemDetailTable.OrdonnanceID = BT_PatientTable.PatientID INNER JOIN
BT_AttributeDetailsTable ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID INNER JOIN
PW_PhysicalExaminationChargeBillPatientTable ON PW_AuxiliaryItemDetailTable.AuxiliaryItemDetailID = PW_PhysicalExaminationChargeBillPatientTable.AuxiliaryItemDetailID AND
BT_PatientTable.PatientID = PW_PhysicalExaminationChargeBillPatientTable.PatientID INNER JOIN
BT_StaffTable INNER JOIN
PW_ChargeBillTable ON BT_StaffTable.StaffID = PW_ChargeBillTable.Operator_StaffID ON PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID = PW_ChargeBillTable.ChargeBillID
WHERE (1 = 1) AND (PW_ItemCategoryTable.ItemCategoryID = 1) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) OR
(PW_ItemCategoryTable.ItemCategoryID = 4) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0)
UNION
--经过处方的病人
SELECT RTRIM(BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber, RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,RTRIM(PW_AuxiliaryItemDetailTable.
AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID,RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsID) AS AttributeDetailsID,
RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS 体检登记,RTRIM(PW_OrdonnanceTable.OrdonnanceNumber) AS OrdonnanceNumber,
RTRIM(PW_OrdonnanceTable.PatientID) AS PatientID, RTRIM(PW_OrdonnanceTable.TreatmentDoctor_StaffID) AS TreatmentDoctor_StaffID,
RTRIM(PW_AuxiliaryItemDetailTable.OrdonnanceID) AS OrdonnanceID,PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
PW_OrdonnanceTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_AttributeDetailsTable INNER JOIN
BT_PatientTable ON BT_AttributeDetailsTable.AttributeDetailsID = BT_PatientTable.AS_SexID ON BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON PW_OrdonnanceTable.PatientID = BT_PatientTable.PatientID INNER JOIN
PW_AuxiliaryItemDetailTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable_1.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID ON
PW_OrdonnanceTable.OrdonnanceID = PW_AuxiliaryItemDetailTable.OrdonnanceID ON BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) AND PW_ItemCategoryTable.ItemCategoryID = 1 and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1
union
SELECT RTRIM(BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber, RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,
RTRIM(PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID, RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsID)
AS AttributeDetailsID, RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS 体检登记, RTRIM(PW_OrdonnanceTable.OrdonnanceNumber) AS OrdonnanceNumber,
RTRIM(PW_OrdonnanceTable.PatientID) AS PatientID, RTRIM(PW_OrdonnanceTable.TreatmentDoctor_StaffID) AS TreatmentDoctor_StaffID,
RTRIM(PW_AuxiliaryItemDetailTable.OrdonnanceID) AS OrdonnanceID, PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON
BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
PW_ItemCategoryTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 INNER JOIN
PW_AuxiliaryItemDetailTable ON BT_AttributeDetailsTable_1.AttributeDetailsID = PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID ON
PW_ItemCategoryTable.ItemCategoryID = PW_AuxiliaryItemDetailTable.ItemCategoryID INNER JOIN
PW_OrdonnanceTable ON PW_AuxiliaryItemDetailTable.OrdonnanceID = PW_OrdonnanceTable.OrdonnanceID ON BT_PatientTable.PatientID = PW_OrdonnanceTable.PatientID ON
BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) and PW_ItemCategoryTable.ItemCategoryID = 4 and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 order by 体检登记
BLL(逻辑层)中的方法:
(分页也涉及了该BLL中的方法)
#region 体检病人登记信息表格绑定
[OperationContract]
public DataSet FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu()
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
};
mySqlParameters[0].Value = "FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu ";
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_TiJianDengJi_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
#endregion
UIL(界面层)中的代码:
//查询出来所有的病人信息
DataTable dtPhysicalExamination = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu().Tables[0];
dgv_PhysicalExaminationRegister.DataSource = dtPhysicalExamination;
UIL中涉及分页中的界面以及数据表格用到的界面:
2.9.8(图12)
按钮Button中界面:点击上一页,数据表格中的数据会显示出来的是前15条数据的内容,点击下一页,数据表格中出现的是下15条中的内容
2.9.8(图12)
注意全局变量以及调用BLL:
BLL医院管理系统.TiJianZhongXin.FRM_TiJianDengJi_Main.FRM_TiJianDengJi_MainClient myFRM_TiJianDengJi_MainClient =
new BLL医院管理系统.TiJianZhongXin.FRM_TiJianDengJi_Main.FRM_TiJianDengJi_MainClient();
int pageNum = 1;//默认页号
int pageSize =15;//默认页面大小
int pageMaxNum;//最大页号
int intPhysicalExaminationRegisterID = 0; int intOrdonnanceID = 0;
string strOrdonnanceNumber = ""; int intPatientID = 0;//该病人ID不经过挂号和处方
int intChargeBillID = 0;//体检登记病人中的收费单ID(病人ID不经过挂号和处方时用)
UIL中涉及分页的代码:
//点击上一页
private void btn_Next_Click(object sender, EventArgs e)
{
if (pageNum > 1)//若不为首页
{
//页号-1
pageNum--;
this.lblCurrentPage.Text = pageNum.ToString();//当前页数
//根据页号和页面大小获取数据
SkipPage(pageNum, pageSize);//自定义方法用于页面跳转
}
else
{
MessageBox.Show("已经是首页了!");
}
}
//点击下一页
private void btn_Last_Click(object sender, EventArgs e)
{
if (pageNum < pageMaxNum)//若不为尾页
{
//页号+1
pageNum++;
this.lblCurrentPage.Text = pageNum.ToString();//当前页数
//根据页号和页面大小获取数据
SkipPage(pageNum, pageSize);//自定义方法用于页面跳转
}
else
{
MessageBox.Show("已经是尾页了!");
}
}
void SkipPage(int YeMa,int YeDaXiao)//自定义方法用于页面跳转
{
//查询出来所有的病人信息
DataTable dtPhysicalExamination = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu().Tables[0];
dgv_PhysicalExaminationRegister.DataSource = dtPhysicalExamination;
DataTable dt = (DataTable)dgv_PhysicalExaminationRegister.DataSource;//把dgv_PhysicalExaminationRegister的数据源转化为表的格式赋值给空表
DataTable ALLPhysicalExaminationMessage = dt.Clone();
for (int i = (YeMa - 1) * YeDaXiao; i <= dtPhysicalExamination.Rows.Count - 1; i++)//根据传入页数的大小和页码 遍历获取dgv_PhysicalExaminationRegister中的数据,
{
if (i == (YeMa - 1) * YeDaXiao + YeDaXiao)//如果获取的是需要的页码和页大小
{
//就把获取的页码和页大小绑定到dgv中
dgv_PhysicalExaminationRegister.DataSource = ALLPhysicalExaminationMessage;
BangDingPriceAndItemCategoryName();//自定义方法绑定现金价格和项目类型的值
return;
}
DataRow dr = ALLPhysicalExaminationMessage.NewRow();//对空表添加空白行,并进行对应的赋值
dr["OrdonnanceID"] = dtPhysicalExamination.Rows[i]["OrdonnanceID"];
dr["OrdonnanceNumber"] = dtPhysicalExamination.Rows[i]["OrdonnanceNumber"];
dr["PatientID"] = dtPhysicalExamination.Rows[i]["PatientID"];
dr["TreatmentDoctor_StaffID"] = dtPhysicalExamination.Rows[i]["TreatmentDoctor_StaffID"];
dr["StaffName"] = dtPhysicalExamination.Rows[i]["StaffName"];
dr["PatientCardNumber"] = dtPhysicalExamination.Rows[i]["PatientCardNumber"];
dr["PatientName"] = dtPhysicalExamination.Rows[i]["PatientName"];
dr["AttributeDetailsName"] = dtPhysicalExamination.Rows[i]["AttributeDetailsName"];
dr["AS_SexID"] = dtPhysicalExamination.Rows[i]["AS_SexID"];
dr["AS_PhysicalExaminationRegisterID"] = dtPhysicalExamination.Rows[i]["AS_PhysicalExaminationRegisterID"];
dr["体检登记"] = dtPhysicalExamination.Rows[i]["体检登记"];
dr["PrescriptionDate"] = dtPhysicalExamination.Rows[i]["PrescriptionDate"];
dr["ChargeBillID"] = dtPhysicalExamination.Rows[i]["ChargeBillID"];
ALLPhysicalExaminationMessage.Rows.Add(dr);//把空白行添加到空表中去
}
//这里就把获取的最后页码和最后一个页大小绑定到dgv中
dgv_PhysicalExaminationRegister.DataSource = ALLPhysicalExaminationMessage;
BangDingPriceAndItemCategoryName();自定义方法绑定现金价格和项目类型的值
}
病人体检的项目价格进行累加以及病人体检的项目进行分类(该分类并没有在数据库中进行详细的分类)所以在界面上自定义方法进行分类:代码如下:
void BangDingPriceAndItemCategoryName()//自定义方法绑定现金价格个项目类型的值
{
DataTable dt = new DataTable();
for (int i = 0; i < dgv_PhysicalExaminationRegister.Rows.Count; i++)//遍历循环体检病人信息
{
int intSelect = 0; decimal decProjectPrice = 0; string strItemCategoryName = "";
int intChuFangID = Convert.ToInt32(dgv_PhysicalExaminationRegister.Rows[i].Cells["处方单ID"].Value);//获取每一个病人的处方ID
if (intChuFangID != 0)
{
dt = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_SetMealDetailMessageOnItemCategoryID(intChuFangID).Tables[0];//把每个病人的体检项目查询出来
}
else
{
int intBingRenID = Convert.ToInt32(dgv_PhysicalExaminationRegister.Rows[i].Cells["病人ID"].Value);
int intChargeBillID = Convert.ToInt32(dgv_PhysicalExaminationRegister.Rows[i].Cells["收费单ID"].Value);
dt = myFRM_TiJianDengJi_MainClient.FRM_QianTaoShouFei_dgv_SetMealDetailMessageOnItemCategoryID_OtherCharge(intBingRenID, intChargeBillID).Tables[0];//把每个病人的体检项目查询出来
}
for (int k = 0; k < dt.Rows.Count; k++)//遍历病人体检的项目表
{
if (Convert.ToInt32(dt.Rows[k]["ItemCategoryID"]) == 4)//如果病人体检项目类型ID = 4
{
intSelect++;//变量累加
strItemCategoryName = dt.Rows[k]["ItemCategoryName"].ToString().Trim();//获取体检项目类型
}
else if (Convert.ToInt32(dt.Rows[k]["ItemCategoryID"]) == 1)//如果病人体检项目类型ID = 1
{
strItemCategoryName = dt.Rows[k]["ItemCategoryName"].ToString().Trim();//获取体检项目类型
}
decProjectPrice += Convert.ToDecimal(dt.Rows[k]["ProjectPrice"]);//累加每一个项目的现金价格
}
dgv_PhysicalExaminationRegister.Rows[i].Cells["现金价格"].Value = decProjectPrice;//把某个病人总的项目的现金价格赋值给病人
if (intSelect == dt.Rows.Count)//如果体检项目类型ID = 4 的变量累加的结果等于该病人的体检项目的总数
{
dgv_PhysicalExaminationRegister.Rows[i].Cells["项目类型"].Value = strItemCategoryName;//那么这个病人的体检项目的类型全部堵是一样的
}
if (intSelect < dt.Rows.Count && intSelect > 0)//如果体检项目类型ID = 4 的变量累加的结果小于该病人的体检项目的总数,并且变量不等于0,说明体检项目中类型不一样
{
dgv_PhysicalExaminationRegister.Rows[i].Cells["项目类型"].Value = "项目+ 体检套餐";
}
else if (intSelect == 0)//如果体检项目类型ID = 4 的变量为0说明该病人的体检项目类型为全部为另一种情况
{
dgv_PhysicalExaminationRegister.Rows[i].Cells["项目类型"].Value = strItemCategoryName;
}
}
}
但是该方法有一个不足之处就是,必须在窗体第一次加载时才能运行正常,否则就算执行该代码,既不会提示报错,也不会正常运行。只有在这个事件上调用该方法,就能解决这个不足之处:
点击窗体,右键属性,点击下图中的闪电符号,选择窗体第一次显示时发生的事件,如下图:
点击进去后,在里面写调用的代码就可以了
//窗体第一次显示时发生
private void FRM_TiJianDengJi_Main_Shown(object sender, EventArgs e)
{
BangDingPriceAndItemCategoryName();//自定义方法绑定现金价格个项目类型的值
}
根据病人姓名或者病人卡号的文本框输入的值进行查询对应的病人信息 如下图:
2.9.8(图14)
数据库中的储存过程为:
--根据病人姓名或者病人卡号进行查询对应的病人信息
IF @Type = 'FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber'
BEGIN
--不经过处方
SELECT BT_StaffTable.StaffName, BT_PatientTable.PatientCardNumber, BT_PatientTable.PatientName, BT_AttributeDetailsTable_1.AttributeDetailsName, BT_PatientTable.AS_SexID,
PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID, BT_AttributeDetailsTable.AttributeDetailsID, RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS 体检登记, RTRIM('无')
AS OrdonnanceNumber, BT_PatientTable.PatientID, RTRIM(PW_ChargeBillTable.Operator_StaffID) AS TreatmentDoctor_StaffID, RTRIM(0) AS OrdonnanceID,
PW_ChargeBillTable.OperateTime AS PrescriptionDate, PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID
FROM PW_AuxiliaryItemDetailTable INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable_1.AttributeDetailsID ON
PW_AuxiliaryItemDetailTable.OrdonnanceID = BT_PatientTable.PatientID INNER JOIN
BT_AttributeDetailsTable ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID INNER JOIN
PW_PhysicalExaminationChargeBillPatientTable ON PW_AuxiliaryItemDetailTable.AuxiliaryItemDetailID = PW_PhysicalExaminationChargeBillPatientTable.AuxiliaryItemDetailID AND
BT_PatientTable.PatientID = PW_PhysicalExaminationChargeBillPatientTable.PatientID INNER JOIN
BT_StaffTable INNER JOIN
PW_ChargeBillTable ON BT_StaffTable.StaffID = PW_ChargeBillTable.Operator_StaffID ON PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID = PW_ChargeBillTable.ChargeBillID
WHERE (1 = 1) AND (PW_ItemCategoryTable.ItemCategoryID = 1) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) AND
BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%'OR (PW_ItemCategoryTable.ItemCategoryID = 1) AND (PW_ChargeBillTable.WhetherOrdonnance = 0)
AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%' OR
(PW_ItemCategoryTable.ItemCategoryID = 4) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0)
AND BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%'OR (PW_ItemCategoryTable.ItemCategoryID = 4) AND (PW_ChargeBillTable.WhetherOrdonnance = 0)
AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%'
--经过处方
UNION
SELECT BT_StaffTable.StaffName, BT_PatientTable.PatientCardNumber, BT_PatientTable.PatientName, BT_AttributeDetailsTable.AttributeDetailsName, BT_PatientTable.AS_SexID,
PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID, BT_AttributeDetailsTable_1.AttributeDetailsID, BT_AttributeDetailsTable_1.AttributeDetailsName AS 体检登记,
PW_OrdonnanceTable.OrdonnanceNumber, PW_OrdonnanceTable.PatientID, PW_OrdonnanceTable.TreatmentDoctor_StaffID, PW_AuxiliaryItemDetailTable.OrdonnanceID,
PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
PW_OrdonnanceTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_AttributeDetailsTable INNER JOIN
BT_PatientTable ON BT_AttributeDetailsTable.AttributeDetailsID = BT_PatientTable.AS_SexID ON BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON PW_OrdonnanceTable.PatientID = BT_PatientTable.PatientID INNER JOIN
PW_AuxiliaryItemDetailTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable_1.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID ON
PW_OrdonnanceTable.OrdonnanceID = PW_AuxiliaryItemDetailTable.OrdonnanceID ON BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) AND PW_ItemCategoryTable.ItemCategoryID = 1 AND BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%' and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 OR
PW_ItemCategoryTable.ItemCategoryID = 1 AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%' and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1
union
SELECT RTRIM(BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber, RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,
RTRIM(PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID, RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsID) AS AttributeDetailsID,
RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS 体检登记, PW_OrdonnanceTable.OrdonnanceNumber, PW_OrdonnanceTable.PatientID, PW_OrdonnanceTable.TreatmentDoctor_StaffID,
PW_AuxiliaryItemDetailTable.OrdonnanceID, PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON
BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
PW_ItemCategoryTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 INNER JOIN
PW_AuxiliaryItemDetailTable ON BT_AttributeDetailsTable_1.AttributeDetailsID = PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID ON
PW_ItemCategoryTable.ItemCategoryID = PW_AuxiliaryItemDetailTable.ItemCategoryID INNER JOIN
PW_OrdonnanceTable ON PW_AuxiliaryItemDetailTable.OrdonnanceID = PW_OrdonnanceTable.OrdonnanceID ON BT_PatientTable.PatientID = PW_OrdonnanceTable.PatientID ON
BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) AND PW_ItemCategoryTable.ItemCategoryID = 4 AND BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%' and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 OR
PW_ItemCategoryTable.ItemCategoryID = 4 AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%'and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 order by 体检登记 , PatientName
END
BLL中的方法:
//根据病人姓名或者病人卡号进行查询对应的病人信息
[OperationContract]
public DataSet FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber(string strPatientNameOrNumber)
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
new SqlParameter ("@PatientNameOrNumber",SqlDbType .Char ),
};
mySqlParameters[0].Value = "FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber ";
mySqlParameters[1].Value = strPatientNameOrNumber;
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_TiJianDengJi_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
UIL中的代码:
//点击查询
private void btn_Inqure_Click(object sender, EventArgs e)
{
string strPatientCardNumberOrName = txt_PatientCardNumberOrName.Text.ToString().Trim();
dgv_PhysicalExaminationRegister.AutoGenerateColumns = false ;//dgv列不可改变
dgv_PhysicalExaminationRegister.DataSource = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber(strPatientCardNumberOrName).Tables[0];
BangDingPriceAndItemCategoryName();//自定义方法绑定现金价格个项目类型的值
}
运行界面小功能解析:
2.9.8(图15)
DataGridView表格中的数据部分颜色改变以及dgv点击单元格显示数据:
第一步:点击dgv数据表格,右键数组属性, .找到DGV对应的点击任意单元格是发生、需要设置单元格内容显示格式时发生属性事件 如下图
第二步:编写代码
代码如下:
//dgv单元格点击显示数据
private void dgv_PhysicalExaminationRegister_CellClick(object sender, DataGridViewCellEventArgs e)
{
intPhysicalExaminationRegisterID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["体检登记ID"].Value);
txt_PatientName.Text = dgv_PhysicalExaminationRegister.CurrentRow.Cells["病人姓名"].Value.ToString().Trim();
txt_PatientCardNumber.Text = dgv_PhysicalExaminationRegister.CurrentRow.Cells["病人卡号"].Value.ToString().Trim();
intOrdonnanceID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["处方单ID"].Value);
strOrdonnanceNumber = dgv_PhysicalExaminationRegister.CurrentRow.Cells["处方单号"].Value.ToString().Trim();
intPatientID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["病人ID"].Value);
txt_RegisterNumber.Text = dgv_PhysicalExaminationRegister.CurrentRow.Cells["处方单号"].Value.ToString().Trim();
cbo_AS_SexID.SelectedValue = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["性别ID"].Value);
cbo_Doctor_StaffID.SelectedValue = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["医生ID"].Value);
intChargeBillID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["收费单ID"].Value);
if (intOrdonnanceID == 0)//如果处方ID为空,即说明该病人不经过处方,而只是体检(即在体检中心登记的) 查找该病人的体检项目
{
dgv_SetMealDetailMessage.DataSource = myFRM_TiJianDengJi_MainClient.FRM_QianTaoShouFei_dgv_SetMealDetailMessageOnItemCategoryID_OtherCharge(intPatientID, intChargeBillID).Tables[0];
}
else
{
//如果处方ID不为空,即说明该病人经过处方,单击处方单,获取该处方单下的体检项目
dgv_SetMealDetailMessage.DataSource = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_SetMealDetailMessageOnItemCategoryID(intOrdonnanceID).Tables[0];
}
}
#region dgv中单元格内容显示格式事件
private void dgv_PhysicalExaminationRegister_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//遍历dgv中的行
for (int i = 0; i < dgv_PhysicalExaminationRegister.Rows.Count; i++)
{
//如果dgv中的行的单元格体检状态的值为 == 为“未登记“
if (dgv_PhysicalExaminationRegister.Rows[i].Cells["体检状态"].Value.ToString().Trim() == "未登记")
{
//那么该单元格体检状态的前景色为红色
this.dgv_PhysicalExaminationRegister.Rows[i].Cells["体检状态"].Style.ForeColor = Color.Red;
}
//又如果dgv中的单元格体检状态的值为 == 为”登记未执行“
else if (dgv_PhysicalExaminationRegister.Rows[i].Cells["体检状态"].Value.ToString().Trim() == "登记未执行")
{
//那么该但单元格体检状态的前景色为蓝色
this.dgv_PhysicalExaminationRegister.Rows[i].Cells["体检状态"].Style.ForeColor = Color.Blue;
}
else
{
//那么该但单元格体检状态的前景色为棕红色
this.dgv_PhysicalExaminationRegister.Rows[i].Cells["体检状态"].Style.ForeColor = Color.DarkRed;
}
dgv_PhysicalExaminationRegister.Rows[i].Cells["现金价格"].Style.ForeColor = Color.Red;
}
}
#endregion
//设置单元格内容显示格式时发生
private void dgv_SetMealDetailMessage_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//体检套餐明细中的现金价格中的值的前景色为红色
for (int k = 0; k < dgv_SetMealDetailMessage.Rows.Count; k++)
{
dgv_SetMealDetailMessage.Rows[k].Cells["现金价格1"].Style.ForeColor = Color.Red;
}
}
仅供学习,禁止用于商业用途,否则后果自负