WCF医院管理系统技术解析 (二)体检登记(一)

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)

 

员工照片

Email

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)

 

联系手机

Email

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)

数据库中的储存过程:(其他涉及到数据绑定的控件都需要用到对应的储存过程,方法和这个类似,下面就不截图了)


2.9.8(9)


--绑定性别
	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;
                }
            }
        }

 

但是该方法有一个不足之处就是,必须在窗体第一次加载时才能运行正常,否则就算执行该代码,既不会提示报错,也不会正常运行。只有在这个事件上调用该方法,就能解决这个不足之处:

点击窗体,右键属性,点击下图中的闪电符号,选择窗体第一次显示时发生的事件,如下图:


2.9.8(13)

点击进去后,在里面写调用的代码就可以了

//窗体第一次显示时发生
        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对应的点击任意单元格是发生、需要设置单元格内容显示格式时发生属性事件 如下图


2.9.8(16)

第二步:编写代码

代码如下:

//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;
            }
        }

仅供学习,禁止用于商业用途,否则后果自负







    





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章