/// <summary> /// 预算 /// </summary> /// <param name="prescriptions">要预算的处方</param> /// <returns>预算信息,供正式结算用</returns> public override ChargeInfo[] Budget(Prescription[] prescriptions) { //单张处方明细转化为大项目明细合并后累加在取舍。 //保存每张处方的大项目明细 List <List <Item> > lstStatItems = new List <List <Item> >( ); //本次结算总金额(等于每张处方舍入后的金额的合计) decimal chargeTotalCost = 0; #region 合并大类并计算舍入金额 try { for (int i = 0; i < prescriptions.Length; i++) { List <Item> lstTemp = new List <Item>( ); lstTemp = MergePrescriptionByStatItemCode(ref prescriptions[i]); chargeTotalCost = chargeTotalCost + prescriptions[i].Total_Fee; lstStatItems.Add(lstTemp); } } catch (Exception err) { ErrorWriter.WriteLog(err.Message + "\r\n" + err.StackTrace); throw new OperatorException("合并项目发生错误!"); } #endregion //保存合并后的所有大项目明细,类型MZ_CostOrder Hashtable htCostOrder = new Hashtable(); #region 合并所有结算明细(不需要再舍入) try { foreach (List <Item> lstTemp in lstStatItems) { foreach (object obj in lstTemp) { if (htCostOrder.ContainsKey(((Item)obj).Text.Trim( ))) { Item item = (Item)obj; Model.MZ_CostOrder mz_costorder = (Model.MZ_CostOrder)htCostOrder[item.Text.Trim( )]; mz_costorder.Total_Fee = mz_costorder.Total_Fee + Convert.ToDecimal(item.Value); } else { Model.MZ_CostOrder mz_costorder = new HIS.Model.MZ_CostOrder( ); mz_costorder.ItemType = ((Item)obj).Text.Trim( ); mz_costorder.Total_Fee = Convert.ToDecimal(((Item)obj).Value); htCostOrder.Add(mz_costorder.ItemType, mz_costorder); } } } } catch (Exception err) { ErrorWriter.WriteLog(err.Message); throw new OperatorException("合并明细大类发生错误!"); } #endregion int costmasterid = 0; //本次结算ID #region 数据库操作,得到结算号 try { oleDb.BeginTransaction( ); #region 赋值结算头表并保存 HIS.Model.MZ_CostMaster mz_costmaster = new HIS.Model.MZ_CostMaster( ); mz_costmaster.PatID = Patient.PatID; mz_costmaster.PatListID = Patient.PatListID; mz_costmaster.PresMasterID = 0; mz_costmaster.TicketNum = ""; mz_costmaster.TicketCode = ""; mz_costmaster.ChargeCode = OperatorId.ToString( ); //mz_costmaster.ChargeName = PublicDataReader.GetEmployeeNameById( OperatorId ); mz_costmaster.ChargeName = BaseDataController.GetName(BaseDataCatalog.人员列表, OperatorId); mz_costmaster.Total_Fee = chargeTotalCost;//结算表的总金额 mz_costmaster.Self_Fee = 0; mz_costmaster.Village_Fee = 0; mz_costmaster.Favor_Fee = 0; mz_costmaster.Pos_Fee = 0; mz_costmaster.Money_Fee = 0; mz_costmaster.Ticket_Flag = 0; mz_costmaster.Record_Flag = 9;//预结算记录状态置为9 mz_costmaster.OldID = 0; mz_costmaster.AccountID = 0; mz_costmaster.Hang_Flag = (int)OPDOperationType.门诊收费; mz_costmaster.Hurried_Flag = Patient.IsEmergency ? 1 : 0; mz_costmaster.CostMasterID = BindEntity <Model.MZ_CostMaster> .CreateInstanceDAL(oleDb).Add(mz_costmaster); #endregion costmasterid = mz_costmaster.CostMasterID; #region 更新处方表的结算号和总金额,舍入金额 for (int prescCount = 0; prescCount < prescriptions.Length; prescCount++) { string strWhere = Tables.mz_presmaster.PRESMASTERID + oleDb.EuqalTo( ) + prescriptions[prescCount].PrescriptionID; Model.MZ_PresMaster mz_presmaster = BindEntity <Model.MZ_PresMaster> .CreateInstanceDAL(oleDb).GetModel(strWhere); if (mz_presmaster.Charge_Flag == 1) { throw new OperatorException("处方已被别的收费员收费,请确认!"); } if (prescriptions[prescCount].DocPresId != 0) { if (HIS.Interface.InstanceFactory.CreatMZ_ClinicDataInstance().CheckPresStatus(prescriptions[prescCount].DocPresId) == false) { throw new OperatorException("处方已经收费,请重新刷新病人信息以获取最新未收费处方!\r\n(建议不要同时打开多个收费界面)"); } } //更新处方表的结算号和总金额,舍入金额 BindEntity <Model.MZ_PresMaster> .CreateInstanceDAL(oleDb).Update(strWhere, Tables.mz_presmaster.COSTMASTERID + oleDb.EuqalTo( ) + mz_costmaster.CostMasterID, Tables.mz_presmaster.TOTAL_FEE + oleDb.EuqalTo( ) + prescriptions[prescCount].Total_Fee, Tables.mz_presmaster.ROUNGINGMONEY + oleDb.EuqalTo( ) + prescriptions[prescCount].RoundingMoney); } #endregion #region 保存结算明细到数据库(按大项目保存) foreach (object obj in htCostOrder) { HIS.Model.MZ_CostOrder mz_costorder = (HIS.Model.MZ_CostOrder)((System.Collections.DictionaryEntry)obj).Value; mz_costorder.CostID = mz_costmaster.CostMasterID; //保存到数据库 mz_costorder.CostOrderID = BindEntity <Model.MZ_CostOrder> .CreateInstanceDAL(oleDb).Add(mz_costorder); } #endregion oleDb.CommitTransaction( ); } catch (OperatorException oe) { oleDb.RollbackTransaction( ); throw oe; } catch (Exception err) { oleDb.RollbackTransaction( ); ErrorWriter.WriteLog(err.Message + "\r\n" + err.StackTrace); throw new OperatorException("保存预算结果到数据库发生错误!"); } #endregion //回填处方的结算号 for (int prescCount = 0; prescCount < prescriptions.Length; prescCount++) { prescriptions[prescCount].ChargeID = costmasterid; } #region 返回预算结果 try { Hashtable htInvoiceItem = new Hashtable( ); foreach (object obj in htCostOrder) { HIS.Model.MZ_CostOrder mz_costorder = (HIS.Model.MZ_CostOrder)((System.Collections.DictionaryEntry)obj).Value; InvoiceItem invoice = GetInvoiceByStatCode(mz_costorder.ItemType.Trim( )); invoice.Cost = mz_costorder.Total_Fee; if (htInvoiceItem.ContainsKey(invoice.ItemCode.Trim( ))) { InvoiceItem _invoice = (InvoiceItem)htInvoiceItem[invoice.ItemCode]; _invoice.Cost = _invoice.Cost + invoice.Cost; htInvoiceItem.Remove(invoice.ItemCode); htInvoiceItem.Add(_invoice.ItemCode, _invoice); } else { htInvoiceItem.Add(invoice.ItemCode, invoice); } } List <InvoiceItem> chargeItems = new List <InvoiceItem>( ); foreach (object item in htInvoiceItem) { chargeItems.Add((InvoiceItem)((DictionaryEntry)item).Value); } ChargeInfo chargeInfos = new ChargeInfo( ); chargeInfos.Items = chargeItems.ToArray( ); chargeInfos.ChargeID = costmasterid; chargeInfos.TotalFee = chargeTotalCost; ChargeInfo[] chargeInfo = new ChargeInfo[1]; chargeInfo[0].TotalFee = chargeTotalCost; chargeInfo[0] = chargeInfos; //计算本次的优惠金额 chargeInfo[0].FavorFee = GetFavorCost(Patient.MediType, chargeInfo[0], prescriptions); return(chargeInfo); } catch (Exception err) { ErrorWriter.WriteLog(err); throw new OperatorException("返回预算结果发生错误!"); } #endregion }
/// <summary> /// 挂号的预处理 /// </summary> /// <param name="Patient"></param> /// <returns></returns> public override ChargeInfo Budget(RegPatient Patient) { //保存就诊记录 Model.MZ_PatList mz_patlist = SavePatList(Patient); Patient.PatListID = mz_patlist.PatListID; //查找所需费用项目 List <Model.MZ_REG_ITEM_FEE> listRegFee = BindEntity <Model.MZ_REG_ITEM_FEE> .CreateInstanceDAL(oleDb).GetListArray(BLL.Tables.mz_reg_item_fee.TYPE_CODE + "='" + Patient.RegTypeCode.Trim() + "'"); //写入处方表 Model.MZ_PresMaster mz_presmaster = SavePresMaster(Patient); Hashtable htCostOrder = new Hashtable(); Model.MZ_CostOrder mz_costorder = null; foreach (Model.MZ_REG_ITEM_FEE mz_reg_item_fee in listRegFee) { Model.BASE_SERVICE_ITEMS base_service_item = BindEntity <Model.BASE_SERVICE_ITEMS> .CreateInstanceDAL(oleDb).GetModel(mz_reg_item_fee.ITEM_ID); if (base_service_item == null) { throw new OperatorException("找不到项目编号为" + mz_reg_item_fee.ITEM_ID.ToString() + "的项目"); } //保存明细 Model.MZ_PresOrder mz_presorder = SavePresOrder(Patient, mz_presmaster, base_service_item); mz_presmaster.Total_Fee += mz_presorder.Tolal_Fee; if (htCostOrder.Contains(base_service_item.STATITEM_CODE)) { ((Model.MZ_CostOrder)htCostOrder[base_service_item.STATITEM_CODE]).Total_Fee += mz_presorder.Tolal_Fee; } else { mz_costorder = new HIS.Model.MZ_CostOrder(); mz_costorder.ItemType = base_service_item.STATITEM_CODE; mz_costorder.Total_Fee = mz_presorder.Tolal_Fee; htCostOrder.Add(base_service_item.STATITEM_CODE, mz_costorder); } } //写结算记录 Model.MZ_CostMaster mz_costmaster = SaveCostMaster(Patient, mz_presmaster); InvoiceItem[] invoiceItems = new InvoiceItem[htCostOrder.Count]; int count = 0; foreach (object item in htCostOrder) { mz_costorder = (Model.MZ_CostOrder)((DictionaryEntry)item).Value; mz_costorder.CostID = mz_costmaster.CostMasterID; BindEntity <Model.MZ_CostOrder> .CreateInstanceDAL(oleDb).Add(mz_costorder); Model.BASE_STAT_ITEM base_stat_item = BindEntity <Model.BASE_STAT_ITEM> .CreateInstanceDAL(oleDb).GetModel(BLL.Tables.base_stat_item.CODE + "='" + mz_costorder.ItemType.Trim() + "'"); Model.BASE_STAT_MZFP base_stat_mzfp = BindEntity <Model.BASE_STAT_MZFP> .CreateInstanceDAL(oleDb).GetModel(BLL.Tables.base_stat_mzfp.CODE + "='" + base_stat_item.MZFP_CODE.Trim() + "'"); invoiceItems[count].ItemName = base_stat_mzfp.ITEM_NAME; invoiceItems[count].ItemCode = base_stat_mzfp.CODE; invoiceItems[count].Cost = mz_costorder.Total_Fee; count++; } //回写处方的总金额和结算号 BindEntity <Model.MZ_PresMaster> .CreateInstanceDAL(oleDb).Update(BLL.Tables.mz_presmaster.PRESMASTERID + "=" + mz_presmaster.PresMasterID, BLL.Tables.mz_presmaster.TOTAL_FEE + "=" + mz_presmaster.Total_Fee, BLL.Tables.mz_presmaster.COSTMASTERID + "=" + mz_costmaster.CostMasterID); ChargeInfo regInfo = new ChargeInfo(); regInfo.ChargeID = mz_costmaster.CostMasterID; regInfo.ChargeDate = mz_costmaster.CostDate; regInfo.TotalFee = mz_costmaster.Total_Fee; regInfo.PrescriptionID = mz_presmaster.PresMasterID; regInfo.Items = invoiceItems; return(regInfo); }