Exemple #1
0
        /// <summary>
        /// 床位费记账
        /// </summary>
        /// <param name="patListID">病人登记ID</param>
        /// <param name="endTime">记账截止时间</param>
        /// <param name="empID">记账人ID</param>
        /// <returns>true:记账成功</returns>
        public bool BedFeeAccounting(int patListID, DateTime endTime, int empID)
        {
            // 根据病人ID查询病人所有未停用的床位费用
            DataTable accountDateDt = NewDao <IIPManageDao>().GetAccountDate(string.Empty, endTime, true, patListID);

            if (accountDateDt != null && accountDateDt.Rows.Count > 0)
            {
                for (int i = 0; i < accountDateDt.Rows.Count; i++)
                {
                    // 取得记账天数
                    int days = Convert.ToInt32(accountDateDt.Rows[i]["Days"]);
                    if (days < 0)
                    {
                        continue;
                    }
                    // 保存费用明细表数据
                    // 费用生成ID
                    int generateID = Convert.ToInt32(accountDateDt.Rows[i]["GenerateID"]);
                    // 重新获取价格
                    DataTable        feeItemGenerateDt = NewDao <IIPManageDao>().GetFeeItemGenerateData(patListID, generateID);
                    IP_FeeItemRecord feeItemRecord     = NewObject <IP_FeeItemRecord>();
                    feeItemRecord = ConvertExtend.ToObject <IP_FeeItemRecord>(feeItemGenerateDt, 0);
                    // 床位费记账,根据开始日期以及记账天数记账
                    for (int j = 0; j <= days; j++)
                    {
                        feeItemRecord.FeeRecordID = 0;
                        if (j == 0)
                        {
                            // 直接取开始时间
                            feeItemRecord.PresDate = Convert.ToDateTime(accountDateDt.Rows[i]["ExecDate"]);
                        }
                        else
                        {
                            // 开始时间累加1
                            feeItemRecord.PresDate = Convert.ToDateTime(accountDateDt.Rows[i]["ExecDate"]).AddDays(j);
                        }
                        // 根据最新价格重新计算金额
                        feeItemRecord.TotalFee = Math.Round(feeItemRecord.Amount * feeItemRecord.SellPrice, 2);
                        // 保存费用明细数据
                        this.BindDb(feeItemRecord);
                        feeItemRecord.save();

                        // 保存处方明细关系数据
                        IP_FeeItemRelationship feeItemRelationship = NewObject <IP_FeeItemRelationship>();
                        feeItemRelationship.PatListID   = feeItemRecord.PatListID;
                        feeItemRelationship.OrderID     = 0;
                        feeItemRelationship.GenerateID  = feeItemRecord.GenerateID;
                        feeItemRelationship.FeeSource   = 0;
                        feeItemRelationship.ExecDate    = feeItemRecord.PresDate;
                        feeItemRelationship.ChargeDate  = DateTime.Now;
                        feeItemRelationship.ChargeEmpID = empID;
                        this.BindDb(feeItemRelationship);
                        feeItemRelationship.save();
                    }
                }
            }

            return(true);
        }
Exemple #2
0
        /// <summary>
        /// 做成账单明细数据
        /// </summary>
        /// <param name="feeItemRecord">账单明细</param>
        /// <param name="feeDr">费用数据</param>
        /// <param name="feeItem">费用生成</param>
        /// <param name="feeClass">费用类型</param>
        /// <param name="presDate">处方时间</param>
        /// <param name="amount">基本数</param>
        /// <param name="isBedFee">是否记床位费</param>
        private void SetFeeItemRecord(
            IP_FeeItemRecord feeItemRecord,
            DataRow feeDr,
            IP_FeeItemGenerate feeItem,
            int feeClass,
            DateTime presDate,
            int amount,
            bool isBedFee)
        {
            // 写入处方明细表数据
            feeItemRecord.GenerateID  = feeItem.GenerateID;                               // 费用生成ID
            feeItemRecord.PatListID   = feeItem.PatListID;                                // 病人ID
            feeItemRecord.PatName     = feeItem.PatName;                                  // 病人名
            feeItemRecord.PatDeptID   = feeItem.PatDeptID;                                // 病人入院科室
            feeItemRecord.PatDoctorID = feeItem.PatDoctorID;                              // 病人责任医生
            feeItemRecord.PatNurseID  = feeItem.PatNurseID;                               // 病人责任护士
            feeItemRecord.BabyID      = feeItem.BabyID;                                   // BabyID
            feeItemRecord.ItemID      = Convert.ToInt32(feeDr["ItemID"].ToString());      // 项目ID
            feeItemRecord.ItemName    = feeDr["ItemName"].ToString();                     // 项目名
            feeItemRecord.StatID      = Convert.ToInt32(feeDr["StatID"].ToString());      // StatID
            feeItemRecord.InPrice     = Convert.ToDecimal(feeDr["InPrice"].ToString());   // 批发价
            feeItemRecord.SellPrice   = Convert.ToDecimal(feeDr["SellPrice"].ToString()); // 销售价
            feeItemRecord.FeeClass    = feeClass;
            feeItemRecord.PackAmount  = feeItem.PackAmount;
            if (!isBedFee)
            {
                feeItemRecord.Amount    = feeItem.Amount; // 费用生成表的基本数
                feeItemRecord.Spec      = feeItem.Spec;   // 规格
                feeItemRecord.Unit      = feeItem.Unit;   // 单位
                feeItemRecord.FeeSource = 0;              // 0账单
                // 组合项目时,根据基本数计算=基本数*划价系数
                //feeItemRecord.TotalFee = Math.Round(feeItemRecord.Amount * Convert.ToDecimal(feeDr["PackAmount"].ToString()), 2);
            }
            else
            {
                feeItemRecord.Amount    = amount;                         // 费用生成表的基本数
                feeItemRecord.Spec      = feeDr["Standard"].ToString();   // 规格
                feeItemRecord.Unit      = feeDr["UnPickUnit"].ToString(); // 单位
                feeItemRecord.FeeSource = 2;                              // 2床位费
            }

            feeItemRecord.TotalFee       = Math.Round(feeItemRecord.Amount * feeItemRecord.SellPrice / feeItemRecord.PackAmount, 2);
            feeItemRecord.DoseAmount     = 0;                        // 默认0
            feeItemRecord.PresDeptID     = feeItem.PresDeptID;       // 划价科室ID
            feeItemRecord.PresDoctorID   = feeItem.PresDoctorID;     // 划价医生ID
            feeItemRecord.ExecDeptID     = feeItem.ExecDeptDoctorID; // 执行科室ID
            feeItemRecord.PresDate       = presDate;                 // 处方日期
            feeItemRecord.ChargeDate     = DateTime.Now;             // 记账日期
            feeItemRecord.DrugFlag       = 0;                        // 发药标识
            feeItemRecord.RecordFlag     = 0;                        // 记录状态
            feeItemRecord.OldFeeRecordID = 0;                        // 退费明细ID
            feeItemRecord.CostHeadID     = 0;
            feeItemRecord.CostType       = 0;
            feeItemRecord.UploadID       = 0;
            feeItemRecord.OrderType      = feeItem.OrderType;
        }
Exemple #3
0
        /// <summary>
        /// 账单记账
        /// </summary>
        /// <param name="feeItemAccDt">待记账数据集合</param>
        /// <param name="empID">操作员ID</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="isBedFee">是否记床位费</param>
        /// <param name="isLongFee">是否记长期账单</param>
        /// <param name="msgList">错误消息</param>
        /// <returns>true:记账成功</returns>
        public bool FeeItemAccounting(
            DataTable feeItemAccDt,
            int empID,
            DateTime startTime,
            DateTime endTime,
            bool isBedFee,
            bool isLongFee,
            List <string> msgList)
        {
            // 获取需要记账的天数
            int interval = new TimeSpan(Convert.ToDateTime(endTime.ToString("yyyy-MM-dd")).Ticks -
                                        Convert.ToDateTime(startTime.ToString("yyyy-MM-dd")).Ticks).Days + 1;

            // 是否勾选了账单
            if (isLongFee)
            {
                if (feeItemAccDt != null && feeItemAccDt.Rows.Count > 0)
                {
                    IP_FeeItemGenerate feeItem = null;
                    for (int i = 0; i < feeItemAccDt.Rows.Count; i++)
                    {
                        feeItem = NewObject <IP_FeeItemGenerate>();
                        feeItem = ConvertExtend.ToObject <IP_FeeItemGenerate>(feeItemAccDt, i);
                        // 如果当前记录在费用生成表中不存在,则先记录保存到费用生成表中,然后在进行记账操作
                        if (feeItem.GenerateID == 0)
                        {
                            // 查询病人登记信息
                            DataTable  patDt = NewDao <IIPManageDao>().GetPatListInfo(Convert.ToInt32(feeItemAccDt.Rows[0]["PatListID"]));
                            IP_PatList pat   = ConvertExtend.ToObject <IP_PatList>(patDt, 0);
                            feeItem.PatListID    = pat.PatListID;
                            feeItem.PatName      = pat.PatName;
                            feeItem.PatDeptID    = pat.CurrDeptID;
                            feeItem.PatDoctorID  = pat.CurrDoctorID;
                            feeItem.PatNurseID   = pat.CurrNurseID;
                            feeItem.MarkEmpID    = empID;
                            feeItem.PresDoctorID = pat.CurrDoctorID;
                            feeItem.PresDeptID   = feeItem.PatDeptID;
                        }

                        this.BindDb(feeItem);
                        feeItem.save();
                        // 保存费用数据
                        bool result = SaveFeeItemAccountingData(feeItem, feeItemAccDt, i, interval, startTime, msgList);
                    }
                }
            }
            // 是否需要记床位费
            if (isBedFee)
            {
                DateTime presDate = startTime;
                for (int s = 0; s < interval; s++)
                {
                    if (s > 0)
                    {
                        // 每循环一次处方日期加1
                        presDate = Convert.ToDateTime(presDate.AddDays(1).ToString("yyyy-MM-dd"));
                    }
                    else
                    {
                        presDate = Convert.ToDateTime(presDate.ToString("yyyy-MM-dd"));
                    }

                    // 检查当日是否已记床位费
                    if (NewDao <IIPManageDao>().IsExistenceBedFeeData(Convert.ToInt32(feeItemAccDt.Rows[0]["PatListID"].ToString()), presDate))
                    {
                        IP_FeeItemGenerate feeItem = ConvertExtend.ToObject <IP_FeeItemGenerate>(feeItemAccDt, 0);
                        // 取得病人关联的所有床位
                        DataTable bedList  = NewDao <IIPManageDao>().GetPatientBedList(Convert.ToInt32(feeItemAccDt.Rows[0]["PatListID"].ToString()));
                        DataTable bedFeeDt = new DataTable();
                        for (int i = 0; i < bedList.Rows.Count; i++)
                        {
                            DataTable tempDt = null;
                            if (Convert.ToInt32(bedList.Rows[i]["IsPack"]) == 0)
                            {
                                // 根据床位ID查询床位费用
                                tempDt = NewDao <IIPManageDao>().GetBedFeeItemList(Convert.ToInt32(bedList.Rows[i]["BedID"].ToString()), 0);
                            }
                            else
                            {
                                // 根据床位ID查询床位费用
                                tempDt = NewDao <IIPManageDao>().GetBedFeeItemList(Convert.ToInt32(bedList.Rows[i]["BedID"].ToString()), 1);
                            }

                            if (i == 0)
                            {
                                bedFeeDt = tempDt.Clone();
                            }

                            bedFeeDt.Merge(tempDt);
                        }
                        // 记床位费账单
                        if (bedFeeDt != null && bedFeeDt.Rows.Count > 0)
                        {
                            for (int i = 0; i < bedFeeDt.Rows.Count; i++)
                            {
                                // 保存处方明细关系数据
                                IP_FeeItemRelationship feeItemRelationship = NewObject <IP_FeeItemRelationship>();
                                feeItemRelationship.GenerateID  = 0;
                                feeItemRelationship.ChargeDate  = presDate;
                                feeItemRelationship.ChargeEmpID = empID;
                                feeItemRelationship.PatListID   = Convert.ToInt32(feeItemAccDt.Rows[0]["PatListID"].ToString());
                                feeItemRelationship.FeeSource   = 2;
                                this.BindDb(feeItemRelationship);
                                feeItemRelationship.save();

                                // 写入处方明细表数据
                                IP_FeeItemRecord feeItemRecord = NewObject <IP_FeeItemRecord>();
                                SetFeeItemRecord(
                                    feeItemRecord,
                                    bedFeeDt.Rows[i],
                                    feeItem,
                                    Convert.ToInt32(bedFeeDt.Rows[i]["ItemClass"].ToString()),
                                    presDate,
                                    Convert.ToInt32(bedFeeDt.Rows[i]["ItemAmount"].ToString()),
                                    true);
                                feeItemRecord.TotalFee     = Math.Round(feeItemRecord.Amount * Convert.ToDecimal(bedFeeDt.Rows[i]["UnitPrice"].ToString()), 2);
                                feeItemRecord.PackAmount   = Convert.ToDecimal(bedFeeDt.Rows[i]["UnitPrice"].ToString()); // 划价系数
                                feeItemRecord.GenerateID   = 0;                                                           // 费用生成ID
                                feeItemRecord.PresDeptID   = feeItem.PatDeptID;
                                feeItemRecord.ExecDeptID   = feeItem.PatDeptID;
                                feeItemRecord.PresDoctorID = empID;
                                feeItemRecord.ExecDeptID   = Convert.ToInt32(bedFeeDt.Rows[i]["ExecDeptId"].ToString()); // 执行科室ID
                                feeItemRecord.OrderType    = 4;
                                this.BindDb(feeItemRecord);
                                feeItemRecord.save();
                            }
                        }
                    }
                }
            }

            return(true);
        }
Exemple #4
0
        /// <summary>
        /// 保存记账数据
        /// </summary>
        /// <param name="feeItem">处方生成对象</param>
        /// <param name="feeItemAccDt">处方生成列表</param>
        /// <param name="rowIndex">处方生成Index</param>
        /// <param name="interval">处方天数</param>
        /// <param name="presDate">处方开始日期</param>
        /// <param name="msgList">错误消息</param>
        /// <returns>true:记账成功</returns>
        private bool SaveFeeItemAccountingData(
            IP_FeeItemGenerate feeItem,
            DataTable feeItemAccDt,
            int rowIndex,
            int interval,
            DateTime presDate,
            List <string> msgList)
        {
            // 根据选择的时间区间记录账单
            for (int s = 0; s < interval; s++)
            {
                if (s > 0)
                {
                    // 每循环一次处方日期加1
                    presDate = Convert.ToDateTime(presDate.AddDays(1).ToString("yyyy-MM-dd"));
                }
                else
                {
                    presDate = Convert.ToDateTime(presDate.ToString("yyyy-MM-dd"));
                }
                // 检查是否存在重复记账
                if (!NewDao <IIPManageDao>().IsExistenceItemAccountingData(feeItem.GenerateID, feeItem.PatListID, presDate))
                {
                    continue;
                }

                // 1.对药品记账时,记账成功后要减去有效库存。
                // ItemClass=1为药品,需要减去有效库存
                if (feeItem.FeeClass == 1)
                {
                    try
                    {
                        // 减去有效库存
                        NewObject <DrugStoreManagement>().UpdateStorage(feeItem.ItemID, feeItem.ExecDeptDoctorID, feeItem.Amount - (feeItem.Amount * 2));
                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.Contains("库存数不够"))
                        {
                            msgList.Add("[" + feeItem.ItemName + "]");
                            continue;
                        }
                    }
                }
                // 写入关系表数据
                // 判断是否为组合项目,如果为组合项目需先拆成明细在写入
                if (feeItem.FeeClass == 4)
                {
                    // 根据组合项目ItemID获取组合项目明细列表
                    DataTable combinationProjectDt = NewDao <IIPManageDao>().CombinationProjectDetails(feeItem.ItemID);
                    for (int j = 0; j < combinationProjectDt.Rows.Count; j++)
                    {
                        // 保存处方明细关系数据
                        IP_FeeItemRelationship feeItemRelationship = NewObject <IP_FeeItemRelationship>();
                        feeItemRelationship.GenerateID  = feeItem.GenerateID;
                        feeItemRelationship.ChargeDate  = presDate;
                        feeItemRelationship.ChargeEmpID = feeItem.MarkEmpID;
                        feeItemRelationship.PatListID   = feeItem.PatListID;
                        feeItemRelationship.FeeSource   = 0;
                        this.BindDb(feeItemRelationship);
                        feeItemRelationship.save();

                        // 写入处方明细表数据
                        IP_FeeItemRecord feeItemRecord = NewObject <IP_FeeItemRecord>();
                        SetFeeItemRecord(
                            feeItemRecord,
                            combinationProjectDt.Rows[j],
                            feeItem,
                            Convert.ToInt32(combinationProjectDt.Rows[j]["ItemClass"].ToString()),
                            presDate,
                            0,
                            false);
                        this.BindDb(feeItemRecord);
                        feeItemRecord.save();
                    }
                }
                else
                {
                    // 不是组合项目直接写入账单
                    // 保存处方明细关系数据
                    IP_FeeItemRelationship feeItemRelationship = NewObject <IP_FeeItemRelationship>();
                    feeItemRelationship.GenerateID  = feeItem.GenerateID;
                    feeItemRelationship.ChargeDate  = presDate;
                    feeItemRelationship.ChargeEmpID = feeItem.MarkEmpID;
                    feeItemRelationship.PatListID   = feeItem.PatListID;
                    feeItemRelationship.FeeSource   = 0;
                    this.BindDb(feeItemRelationship);
                    feeItemRelationship.save();

                    // 写入处方明细表数据
                    IP_FeeItemRecord feeItemRecord = NewObject <IP_FeeItemRecord>();
                    SetFeeItemRecord(feeItemRecord, feeItemAccDt.Rows[rowIndex], feeItem, feeItem.FeeClass, presDate, 0, false);
                    //feeItemRecord.TotalFee = Math.Round(feeItemRecord.Amount * Convert.ToDecimal(FeeItemAccDt.Rows[rowIndex]["PackAmount"].ToString()), 2);
                    //feeItemRecord.PackAmount = Convert.ToDecimal(FeeItemAccDt.Rows[rowIndex]["PackAmount"].ToString());  // 划价系数
                    this.BindDb(feeItemRecord);
                    feeItemRecord.save();
                }
            }

            return(true);
        }
Exemple #5
0
        /// <summary>
        /// 取消冲账
        /// </summary>
        /// <param name="strikeABalanceDt">取消冲账的数据</param>
        /// <param name="msgList">错误消息</param>
        /// <returns>true:取消冲账成功</returns>
        public bool CancelStrikeABalance(DataTable strikeABalanceDt, List <string> msgList)
        {
            // 项目已做不能冲账提示消息。
            StringBuilder strMsg           = new StringBuilder();
            bool          isStrikeABalance = true;

            if (strikeABalanceDt != null && strikeABalanceDt.Rows.Count > 0)
            {
                for (int i = 0; i < strikeABalanceDt.Rows.Count; i++)
                {
                    int              feeRecordID     = Convert.ToInt32(strikeABalanceDt.Rows[i]["FeeRecordID"].ToString());
                    DataTable        feeItemRecordDt = NewDao <IIPManageDao>().GetIPFeeItemRecordInfo(feeRecordID);
                    IP_FeeItemRecord feeItemRecord   = ConvertExtend.ToObject <IP_FeeItemRecord>(feeItemRecordDt, 0);
                    // 检查药品是否已发药、检查项目是否已做检查
                    bool result = NewDao <IIPManageDao>().CheckIsMedicine(Convert.ToInt32(strikeABalanceDt.Rows[i]["FeeRecordID"].ToString()));
                    // 取得账单类型
                    int feeClass = Convert.ToInt32(strikeABalanceDt.Rows[i]["FeeClass"].ToString());
                    // 未发药
                    if (result)
                    {
                        switch (feeClass)
                        {
                        // 药品
                        case 1:
                            // 处方明细取消冲正
                            try
                            {
                                // 减去有效库存
                                NewObject <DrugStoreManagement>().UpdateStorage(feeItemRecord.ItemID, feeItemRecord.ExecDeptID, feeItemRecord.Amount);
                            }
                            catch (Exception ex)
                            {
                                if (ex.Message.Contains("库存数不够"))
                                {
                                    strMsg.Append("[" + feeItemRecord.ItemName + "]、");
                                    continue;
                                }
                            }
                            // 将选中记录改成9,(9=已取消冲账)
                            feeItemRecord.RecordFlag = 9;
                            feeItemRecord.ChargeDate = DateTime.Now;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            // 重新走记账流程重新生成费用数据
                            feeItemRecord = feeItemRecord.Clone() as IP_FeeItemRecord;
                            feeItemRecord.OldFeeRecordID = 0;
                            feeItemRecord.FeeRecordID    = 0;
                            feeItemRecord.RecordFlag     = 0;
                            feeItemRecord.ChargeDate     = DateTime.Now;
                            feeItemRecord.Amount         = Math.Abs(feeItemRecord.Amount);
                            feeItemRecord.TotalFee       = Math.Abs(feeItemRecord.TotalFee);
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            break;

                        // 材料/项目
                        case 2:
                        case 3:
                            // 处方明细取消冲账
                            // 将选中记录改成9,(9=已取消冲账)
                            feeItemRecord.RecordFlag = 9;
                            feeItemRecord.ChargeDate = DateTime.Now;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            // 重新走记账流程重新生成费用数据
                            feeItemRecord = feeItemRecord.Clone() as IP_FeeItemRecord;
                            feeItemRecord.OldFeeRecordID = 0;
                            feeItemRecord.FeeRecordID    = 0;
                            feeItemRecord.RecordFlag     = 0;
                            feeItemRecord.ChargeDate     = DateTime.Now;
                            if (feeItemRecord.Amount < 0)
                            {
                                feeItemRecord.Amount = Math.Abs(feeItemRecord.Amount);
                            }

                            feeItemRecord.TotalFee = Math.Abs(feeItemRecord.TotalFee);
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            break;

                        // 组合项目/医嘱
                        case 4:
                        case 5:
                        default:
                            break;
                        }
                    }
                    else
                    {
                        // 已发药
                        switch (feeClass)
                        {
                        // 药品
                        case 1:
                            // 处方明细取消冲正
                            try
                            {
                                // 减去有效库存
                                NewObject <DrugStoreManagement>().UpdateStorage(feeItemRecord.ItemID, feeItemRecord.ExecDeptID, feeItemRecord.Amount);
                            }
                            catch (Exception ex)
                            {
                                if (ex.Message.Contains("库存数不够"))
                                {
                                    strMsg.Append("[" + feeItemRecord.ItemName + "]、");
                                    continue;
                                }
                            }
                            // 将选中记录改成9,(9=已取消冲账)
                            feeItemRecord.RecordFlag = 9;
                            feeItemRecord.ChargeDate = DateTime.Now;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            feeItemRecord = feeItemRecord.Clone() as IP_FeeItemRecord;
                            feeItemRecord.OldFeeRecordID = 0;
                            feeItemRecord.FeeRecordID    = 0;
                            feeItemRecord.RecordFlag     = 0;
                            feeItemRecord.DrugFlag       = 0;
                            feeItemRecord.ChargeDate     = DateTime.Now;
                            feeItemRecord.Amount         = Math.Abs(feeItemRecord.Amount);
                            feeItemRecord.TotalFee       = Math.Abs(feeItemRecord.TotalFee);
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            break;

                        // 材料/项目
                        case 2:
                        case 3:
                            // 项目已做不能冲账
                            // 提示消息
                            strMsg.Append("[" + strikeABalanceDt.Rows[i]["ItemName"].ToString() + "]、");
                            break;

                        // 组合项目/医嘱
                        case 4:
                        case 5:
                        default:
                            break;
                        }
                    }
                }
            }

            if (!string.IsNullOrEmpty(strMsg.ToString()))
            {
                msgList.Add(strMsg.ToString());
                isStrikeABalance = false;
            }

            return(isStrikeABalance);
        }
Exemple #6
0
        /// <summary>
        /// 费用冲账
        /// </summary>
        /// <param name="strikeABalanceDt">冲账数据</param>
        /// <param name="msgList">错误消息</param>
        /// <returns>true:冲账成功</returns>
        public bool StrikeABalance(DataTable strikeABalanceDt, List <string> msgList)
        {
            // 项目已做不能冲账提示消息。
            StringBuilder strMsg           = new StringBuilder();
            bool          isStrikeABalance = true;

            if (strikeABalanceDt != null && strikeABalanceDt.Rows.Count > 0)
            {
                for (int i = 0; i < strikeABalanceDt.Rows.Count; i++)
                {
                    int              feeRecordID     = Convert.ToInt32(strikeABalanceDt.Rows[i]["FeeRecordID"].ToString());
                    DataTable        feeItemRecordDt = NewDao <IIPManageDao>().GetIPFeeItemRecordInfo(feeRecordID);
                    IP_FeeItemRecord feeItemRecord   = ConvertExtend.ToObject <IP_FeeItemRecord>(feeItemRecordDt, 0);
                    // 检查药品是否已发药、检查项目是否已做检查
                    bool result = NewDao <IIPManageDao>().CheckIsMedicine(Convert.ToInt32(strikeABalanceDt.Rows[i]["FeeRecordID"].ToString()));
                    // 取得账单类型
                    int feeClass = Convert.ToInt32(strikeABalanceDt.Rows[i]["FeeClass"].ToString());
                    // 未发药
                    if (result)
                    {
                        switch (feeClass)
                        {
                        // 药品
                        case 1:
                            // 检查是否已生成统领单,如果已生成统领单,则需要删除统领单对应的信息
                            bool isDrugBillDetail = NewDao <IIPManageDao>().CheckIsGenerateDrugBillDetail(feeRecordID);
                            if (isDrugBillDetail)
                            {
                                // 删除统领单明细数据
                                NewDao <IIPManageDao>().DelDrugBillDetail(feeRecordID);
                            }

                            feeItemRecord.RecordFlag = 1;
                            feeItemRecord.ChargeDate = DateTime.Now;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();

                            // 冲账时产生负数记录
                            feeItemRecord = feeItemRecord.Clone() as IP_FeeItemRecord;
                            feeItemRecord.OldFeeRecordID = feeRecordID;
                            feeItemRecord.FeeRecordID    = 0;
                            feeItemRecord.RecordFlag     = 2;
                            feeItemRecord.ChargeDate     = DateTime.Now;
                            feeItemRecord.Amount         = 0 - feeItemRecord.Amount;
                            feeItemRecord.TotalFee       = 0 - feeItemRecord.TotalFee;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            // 追加有效库存
                            NewObject <DrugStoreManagement>().UpdateStorage(
                                feeItemRecord.ItemID,
                                feeItemRecord.ExecDeptID,
                                Math.Abs(feeItemRecord.Amount));
                            break;

                        // 材料/项目
                        case 2:
                        case 3:
                            // 处方明细冲正
                            feeItemRecord.RecordFlag = 1;
                            feeItemRecord.ChargeDate = DateTime.Now;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();

                            // 冲账时产生负数记录
                            feeItemRecord = feeItemRecord.Clone() as IP_FeeItemRecord;
                            feeItemRecord.OldFeeRecordID = feeRecordID;
                            feeItemRecord.FeeRecordID    = 0;
                            feeItemRecord.RecordFlag     = 2;
                            feeItemRecord.ChargeDate     = DateTime.Now;
                            feeItemRecord.Amount         = 0 - feeItemRecord.Amount;
                            feeItemRecord.TotalFee       = 0 - feeItemRecord.TotalFee;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            break;

                        // 组合项目/医嘱
                        case 4:
                        case 5:
                        default:
                            break;
                        }
                    }
                    else
                    {
                        // 已发药
                        switch (feeClass)
                        {
                        // 药品
                        case 1:
                            // 处方明细冲正
                            feeItemRecord.RecordFlag = 1;
                            feeItemRecord.ChargeDate = DateTime.Now;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();

                            // 冲账时产生负数记录
                            feeItemRecord = feeItemRecord.Clone() as IP_FeeItemRecord;
                            feeItemRecord.OldFeeRecordID = feeRecordID;
                            feeItemRecord.FeeRecordID    = 0;
                            feeItemRecord.RecordFlag     = 2;
                            feeItemRecord.ChargeDate     = DateTime.Now;
                            feeItemRecord.Amount         = 0 - feeItemRecord.Amount;
                            feeItemRecord.TotalFee       = 0 - feeItemRecord.TotalFee;
                            this.BindDb(feeItemRecord);
                            feeItemRecord.save();
                            break;

                        // 材料/项目
                        case 2:
                        case 3:
                            // 项目已做不能冲账
                            strMsg.Append("[" + strikeABalanceDt.Rows[i]["ItemName"].ToString() + "]、");
                            break;

                        // 组合项目/医嘱
                        case 4:
                        case 5:
                        default:
                            break;
                        }
                    }
                }
            }

            if (!string.IsNullOrEmpty(strMsg.ToString()))
            {
                msgList.Add(strMsg.ToString());
                isStrikeABalance = false;
            }

            return(isStrikeABalance);
        }
Exemple #7
0
        /// <summary>
        /// 保存费用明细数据
        /// </summary>
        /// <param name="generateIdList">费用生成ID集合</param>
        /// <param name="endTime">记账结束时间</param>
        /// <param name="empID">操作员ID</param>
        /// <returns>true:保存成功</returns>
        public bool FeeItemAccounting(List <int> generateIdList, DateTime endTime, int empID)
        {
            // 不存在需要记账的数据
            if (generateIdList.Count <= 0)
            {
                return(true);
            }
            // 获取账单记账开始时间以及记账天数
            // 取得费用生成ID列表
            string    strGenerateIdList = string.Join(",", generateIdList.ToArray());
            DataTable accountDateDt     = NewDao <IIPManageDao>().GetAccountDate(strGenerateIdList, endTime, false, -1);

            if (accountDateDt != null && accountDateDt.Rows.Count > 0)
            {
                int patListId = Convert.ToInt32(accountDateDt.Rows[0]["PatListID"]);
                for (int i = 0; i < accountDateDt.Rows.Count; i++)
                {
                    // 取得记账天数
                    int days = Convert.ToInt32(accountDateDt.Rows[i]["Days"]);
                    if (days < 0)
                    {
                        continue;
                    }
                    // 保存费用明细表数据
                    // 费用生成ID
                    int generateID = Convert.ToInt32(accountDateDt.Rows[i]["GenerateID"]);
                    // 重新获取价格
                    DataTable        feeItemGenerateDt = NewDao <IIPManageDao>().GetFeeItemGenerateData(patListId, generateID);
                    IP_FeeItemRecord feeItemRecord     = NewObject <IP_FeeItemRecord>();
                    feeItemRecord = ConvertExtend.ToObject <IP_FeeItemRecord>(feeItemGenerateDt, 0);
                    // 临时账单只记账一次,执行时间为费用生成时间
                    if (Convert.ToInt32(accountDateDt.Rows[i]["OrderType"]) == 3)
                    {
                        // 根据最新价格重新计算金额
                        feeItemRecord.TotalFee = Math.Round(feeItemRecord.Amount * feeItemRecord.SellPrice / feeItemRecord.PackAmount, 2);
                        // 保存费用明细数据
                        this.BindDb(feeItemRecord);
                        feeItemRecord.save();
                        // 临时账单记账后直接停用账单
                        NewDao <IIPManageDao>().StopTempFeeItemGenerate(feeItemRecord.GenerateID);
                        continue;
                    }
                    // 临时账单记账,根据开始日期以及记账天数记账
                    for (int j = 0; j <= days; j++)
                    {
                        #region "组合项目拆分明细注释代码"
                        //// 取得费用明细类型
                        //int feeClass = Convert.ToInt32(accountDateDt.Rows[i]["FeeClass"]);
                        //// 如果为组合项目,则先拆分成明细再保存数据
                        //if (feeClass == 4)
                        //{
                        //    // 根据组合项目ItemID获取组合项目明细列表
                        //    DataTable CombinationProjectDt = NewDao<IIPManageDao>().CombinationProjectDetails(feeItemRecord.ItemID);
                        //    for (int k = 0; k < CombinationProjectDt.Rows.Count; k++)
                        //    {
                        //        // 保存费用明细数据
                        //        feeItemRecord.FeeRecordID = 0;
                        //        // 项目ID
                        //        feeItemRecord.ItemID = Convert.ToInt32(CombinationProjectDt.Rows[k]["ItemID"]);
                        //        // 项目名
                        //        feeItemRecord.ItemName = CombinationProjectDt.Rows[k]["ItemName"].ToString();
                        //        // 项目类型
                        //        feeItemRecord.FeeClass = Convert.ToInt32(CombinationProjectDt.Rows[k]["ItemClass"]);
                        //        // 大项目ID
                        //        feeItemRecord.StatID = Convert.ToInt32(CombinationProjectDt.Rows[k]["StatID"]);
                        //        // 规格
                        //        feeItemRecord.Spec = CombinationProjectDt.Rows[k]["Standard"].ToString();
                        //        // 单位
                        //        feeItemRecord.Unit = CombinationProjectDt.Rows[k]["MiniUnitName"].ToString();
                        //        // 划价系数
                        //        feeItemRecord.PackAmount = Convert.ToDecimal(CombinationProjectDt.Rows[k]["MiniConvertNum"]);
                        //        // 批发价
                        //        feeItemRecord.InPrice = Convert.ToDecimal(CombinationProjectDt.Rows[k]["InPrice"]);
                        //        // 销售价
                        //        feeItemRecord.SellPrice = Convert.ToDecimal(CombinationProjectDt.Rows[k]["SellPrice"]);
                        //        // 执行科室
                        //        feeItemRecord.ExecDeptID = Convert.ToInt32(CombinationProjectDt.Rows[k]["ExecDeptId"]);
                        //    }
                        //}
                        #endregion
                        feeItemRecord.FeeRecordID = 0;
                        if (j == 0)
                        {
                            // 直接取开始时间
                            feeItemRecord.PresDate = Convert.ToDateTime(accountDateDt.Rows[i]["ExecDate"]);
                        }
                        else
                        {
                            // 开始时间累加1
                            feeItemRecord.PresDate = Convert.ToDateTime(accountDateDt.Rows[i]["ExecDate"]).AddDays(j);
                        }
                        // 根据最新价格重新计算金额
                        feeItemRecord.TotalFee = Math.Round(feeItemRecord.Amount * feeItemRecord.SellPrice / feeItemRecord.PackAmount, 2);
                        // 保存费用明细数据
                        this.BindDb(feeItemRecord);
                        feeItemRecord.save();

                        // 保存处方明细关系数据
                        IP_FeeItemRelationship feeItemRelationship = NewObject <IP_FeeItemRelationship>();
                        feeItemRelationship.PatListID   = feeItemRecord.PatListID;
                        feeItemRelationship.OrderID     = 0;
                        feeItemRelationship.GenerateID  = feeItemRecord.GenerateID;
                        feeItemRelationship.FeeSource   = 0;
                        feeItemRelationship.ExecDate    = feeItemRecord.PresDate;
                        feeItemRelationship.ChargeDate  = DateTime.Now;
                        feeItemRelationship.ChargeEmpID = empID;
                        this.BindDb(feeItemRelationship);
                        feeItemRelationship.save();
                    }
                }
            }

            return(true);
        }
Exemple #8
0
        /// <summary>
        /// 住院统领发药
        /// </summary>
        /// <param name="dispHead">发药单表头</param>
        /// <param name="dispDetail">发药单明细</param>
        /// <returns>返回结果对象</returns>
        public DGBillResult IPDisp(DS_IPDispHead dispHead, List <DS_IPDispDetail> dispDetail)
        {
            //药品单据处理结果
            DGBillResult result = new DGBillResult();

            if (dispHead != null)
            {
                //1.判断药房是否处于盘点状态中
                if (NewObject <DrugStoreManagement>().IsCheckStatus(dispHead.ExecDeptID, 0))
                {
                    throw new Exception("药房当前正在盘点中,不能发药");
                }

                //生成单据号
                string serialNO = NewObject <SerialNumberSource>().GetSerialNumber(SnType.药品, dispHead.ExecDeptID, DGConstant.OP_DS_IPDISPENSE);
                dispHead.BillNO   = Convert.ToInt64(serialNO);
                dispHead.DispTime = System.DateTime.Now;
                BindDb(dispHead);
                dispHead.save();

                //发药如果跨批次的化,台账需要记录差额调整记录
                foreach (DS_IPDispDetail ispDetailModel in dispDetail)
                {
                    decimal dispRetailPrice = ispDetailModel.RetailPrice;

                    //5发药明细设置发药头表ID,保存数据在库存处理方法中
                    ispDetailModel.DispHeadID = dispHead.DispHeadID;

                    //6减库存处理
                    StoreParam storeParam = new StoreParam();
                    storeParam.Amount      = ispDetailModel.DispAmount;
                    storeParam.BatchNO     = ispDetailModel.BatchNO;
                    storeParam.DeptID      = ispDetailModel.DeptID;
                    storeParam.DrugID      = ispDetailModel.DrugID;
                    storeParam.RetailPrice = ispDetailModel.RetailPrice;
                    storeParam.StockPrice  = ispDetailModel.StockPrice;
                    storeParam.UnitID      = ispDetailModel.UnitID;
                    storeParam.UnitName    = ispDetailModel.UnitName;
                    if (storeParam.Amount > 0)
                    {
                        DGStoreResult storeRtn = NewObject <DSStore>().ReduceStoreAuto(storeParam, true);
                        if (storeRtn.Result != 0)
                        {
                            result.Result = 1;
                            if (storeRtn.Result == 1)
                            {
                                result.LstNotEnough = new List <DGNotEnough>();
                                DGNotEnough notEnough = new DGNotEnough();
                                notEnough.DeptID     = ispDetailModel.DeptID;
                                notEnough.DrugID     = ispDetailModel.DrugID;
                                notEnough.LackAmount = ispDetailModel.DispAmount - storeRtn.StoreAmount;
                                notEnough.DrugInfo   = "药品批次号:" + ispDetailModel.BatchNO.ToString();
                                result.LstNotEnough.Add(notEnough);
                                result.ErrMsg = "【" + notEnough.DrugInfo + "】库存不足";
                            }
                            else
                            {
                                result.ErrMsg = "药品更新库存出错";
                            }

                            return(result);
                        }
                        else
                        {
                            //NewObject<DSStore>().UpdateValidStore(ispDetailModel.DrugID, ispDetailModel.DeptID,  - Math.Abs(ispDetailModel.DispAmount));
                            foreach (DGBatchAllot batchAllot in storeRtn.BatchAllotList)
                            {
                                //保存发药明细数据
                                ispDetailModel.DispDetailID = 0;
                                ispDetailModel.DispAmount   = batchAllot.DispAmount;
                                if (batchAllot.DispAmount == 0)
                                {
                                    continue;
                                }

                                ispDetailModel.RetailPrice = batchAllot.RetailPrice;
                                ispDetailModel.StockPrice  = batchAllot.StockPrice;
                                ispDetailModel.RetailFee   = batchAllot.DispRetailFee;
                                ispDetailModel.StockFee    = batchAllot.DispStockFee;
                                ispDetailModel.BatchNO     = batchAllot.BatchNO;
                                ispDetailModel.RetFlag     = 0;
                                BindDb(ispDetailModel);
                                ispDetailModel.save();
                                if (ispDetailModel.RetailPrice != dispRetailPrice)
                                {
                                    //零售价不一致,调整金额差额台账
                                    WriteAccount(dispHead, ispDetailModel, storeParam, batchAllot);
                                }

                                //写减批次库存台账
                                WriteAccount(dispHead, ispDetailModel, batchAllot, 0, storeParam);
                            }
                        }
                    }
                    else
                    {
                        //退药
                        DGStoreResult storeRtn = NewObject <DSStore>().AddStoreAuto(storeParam, false);
                        if (storeRtn.Result != 0)
                        {
                            result.Result = 1;
                            if (storeRtn.Result == 1)
                            {
                                result.ErrMsg = "药品更新库存出错";
                            }

                            return(result);
                        }

                        //更新有效库存
                        NewObject <DSStore>().UpdateValidStore(ispDetailModel.DrugID, ispDetailModel.DeptID, Math.Abs(ispDetailModel.DispAmount));
                        foreach (DGBatchAllot batchAllot in storeRtn.BatchAllotList)
                        {
                            //保存发药明细数据
                            ispDetailModel.DispDetailID = 0;
                            ispDetailModel.DispAmount   = -Math.Abs(batchAllot.DispAmount);
                            ispDetailModel.RetailPrice  = batchAllot.RetailPrice;
                            ispDetailModel.StockPrice   = batchAllot.StockPrice;
                            ispDetailModel.RetailFee    = batchAllot.DispRetailFee;
                            ispDetailModel.StockFee     = batchAllot.DispStockFee;
                            ispDetailModel.BatchNO      = batchAllot.BatchNO;
                            ispDetailModel.RetFlag      = 1;
                            BindDb(ispDetailModel);
                            ispDetailModel.save();
                            ispDetailModel.DispAmount = Math.Abs(ispDetailModel.DispAmount);
                            if (ispDetailModel.RetailPrice != dispRetailPrice)
                            {
                                //零售价不一致,调整金额差额台账
                                WriteAccountRefund(dispHead, ispDetailModel, storeParam, batchAllot);
                            }

                            //写减批次库存台账
                            WriteAccount(dispHead, ispDetailModel, batchAllot, 1, storeParam);
                        }
                    }

                    //回写住院统领单状态
                    IP_DrugBillDetail ipDrugBillDetail = (IP_DrugBillDetail)NewObject <IP_DrugBillDetail>().getmodel(ispDetailModel.MsgDetaillID);
                    ipDrugBillDetail.DispDrugFlag = 1;
                    ipDrugBillDetail.DispHeadID   = dispHead.DispHeadID;
                    ipDrugBillDetail.save();

                    //回写住院费用明细单
                    IP_FeeItemRecord feeItemRecord = (IP_FeeItemRecord)NewObject <IP_FeeItemRecord>().getmodel(ipDrugBillDetail.FeeRecordID);
                    feeItemRecord.DrugFlag = 1;
                    feeItemRecord.save();
                }
            }

            //发药成功
            result.Result     = 0;
            result.DispHeadID = dispHead.DispHeadID;
            return(result);
        }