/// <summary> /// 自动处理长期医嘱的状态,在病人状态由在病区变成转科或出区(以及撤销状态改变操作)时调用 /// </summary> /// <param name="ceaeReason">停医嘱的原因</param> /// <param name="isRollback">标记是否是撤销病人状态改变操作时调用</param> public void AutoHandleLongOrderState(string executorCode, OrderCeaseReason ceaseReason, bool isRollback) { if (!CoreBusinessLogic.BusinessLogic.EnableEmrOrderModul) { return; } LongOrder ltemp; DateTime rollbackTime = DateTime.Now; foreach (Order order in m_CoreLogic.GetCurrentOrderTable(false).Orders) { if ((order.State == OrderState.Audited) || (order.State == OrderState.New)) { break; } ltemp = order as LongOrder; if ((ltemp.State == OrderState.Executed) && (!isRollback)) { // 将执行状态直接改成停止状态 ltemp.SetStateToCeased(); } else if ((order.State == OrderState.Ceased) && (isRollback)) { // 如果停止原因和传入原因一致,且无停止时间或停止时间晚于当前日期,则将停止状态改成执行状态 ltemp.RollbackStateOfCeasedOrder(ceaseReason, rollbackTime); } } // 保存改变的数据(自动同步到HIS中) m_CoreLogic.SaveAllChangedOrderData(executorCode, MacAddress, true); }
/// <summary> /// 将医嘱状态设为已停止 /// </summary> /// <param name="ceaseReason">停止原因</param> public void SetStateToCeased(OrderCeaseReason ceaseReason) { if (InnerState == OrderState.Executed) { InnerState = OrderState.Ceased; EditState = OrderEditState.Modified; Memo = CeaseReason.ToString(); // 保留原始的停止原因,以便于恢复状态 _ceaseReason = ceaseReason; } }
/// <summary> /// 将符合指定条件的已停止医嘱的状态恢复到执行状态 /// </summary> /// <param name="ceaseReason">停止原因</param> /// <param name="rollbackTime">恢复状态的时间点</param> public void RollbackStateOfCeasedOrder(OrderCeaseReason ceaseReason, DateTime rollbackTime) { // 如果停止原因和传入原因一致,且无停止时间或停止时间晚于当前日期,则将停止状态改成执行状态 if ((InnerState == OrderState.Ceased) && (CeaseReason == ceaseReason)) { if ((_ceaseInfo == null) || (!_ceaseInfo.HadInitialized) || (_ceaseInfo.ExecuteTime > rollbackTime)) { InnerState = OrderState.Executed; Memo = ""; EditState = OrderEditState.Modified; _ceaseReason = (OrderCeaseReason)Enum.Parse(typeof(OrderCeaseReason), Memo); } } }
/// <summary> /// 停止医嘱(设置停止时间和停止者) /// </summary> /// <param name="employeeCode"></param> /// <param name="ceaseTime"></param> /// <param name="ceaseReason">停止原因</param> /// <returns></returns> public bool CeaseOrder(string employeeCode, DateTime ceaseTime, OrderCeaseReason ceaseReason) { if (ReadOnly) { throw new InvalidOperationException(MessageStringManager.GetString("ObjectIsReadOnly")); } if (_ceaseInfo == null) { _ceaseInfo = new OrderOperateInfo(employeeCode, ceaseTime); } else { _ceaseInfo.SetPropertyValue(employeeCode, ceaseTime); } _ceaseReason = ceaseReason; EditState = OrderEditState.Modified; FireOrderChanged(new OrderChangedEventArgs(SerialNo)); return(true); }
private void DoAfterPatientStateChanged(DataRow sourceRow, DataRow targetRow) { InpatientState oldState = (InpatientState)Enum.Parse(typeof(InpatientState) , targetRow[colPatientState].ToString()); InpatientState newState = (InpatientState)Enum.Parse(typeof(InpatientState) , sourceRow[colPatientState].ToString()); bool isRollback = false; OrderCeaseReason ceaseReason = OrderCeaseReason.None; bool needHandle = false; // 标记是否需要处理长期医嘱的状态 if (oldState == InpatientState.InWard) { switch (newState) { case InpatientState.ShiftDept: // 转科 isRollback = false; ceaseReason = OrderCeaseReason.ShiftDept; needHandle = true; // 发送转科消息 break; case InpatientState.OutWard: // 出区 isRollback = false; ceaseReason = OrderCeaseReason.LeaveHospital; needHandle = true; // 发送出院消息 break; } } else if (newState == InpatientState.InWard) { switch (oldState) { case InpatientState.ShiftDept: case InpatientState.InICU: case InpatientState.InDeliveryRoom: if ((targetRow[colFinalyWard].ToString() == sourceRow[colFinalyWard].ToString()) && (targetRow[colFinalyDept].ToString() == sourceRow[colFinalyDept].ToString())) { // 撤销转科 isRollback = true; ceaseReason = OrderCeaseReason.ShiftDept; needHandle = true; } else { // 如果是转科,则发送转入消息 } break; case InpatientState.OutWard: case InpatientState.CancleBalanced: // 出区召回 isRollback = true; ceaseReason = OrderCeaseReason.LeaveHospital; needHandle = true; break; } } }
private void DoAfterPatientStateChanged(DataRow sourceRow, DataRow targetRow) { InpatientState oldState = (InpatientState)Enum.Parse(typeof(InpatientState) , targetRow[colPatientState].ToString()); InpatientState newState = (InpatientState)Enum.Parse(typeof(InpatientState) , sourceRow[colPatientState].ToString()); OrderCeaseReason ceaseReason = OrderCeaseReason.None; if (oldState == InpatientState.InWard) { switch (newState) { case InpatientState.ShiftDept: // 转科 ceaseReason = OrderCeaseReason.ShiftDept; // 发送转科消息 SendQCMessage(targetRow, targetRow[colBedDoctor].ToString(), oldState , Convert.ToDateTime(sourceRow[colTimeOfLeaveWard])); break; case InpatientState.OutWard: // 出区 ceaseReason = OrderCeaseReason.LeaveHospital; // 发送出院消息 SendQCMessage(targetRow, targetRow[colBedDoctor].ToString(), oldState , Convert.ToDateTime(sourceRow[colTimeOfLeaveWard])); break; } } else if (newState == InpatientState.InWard) { switch (oldState) { case InpatientState.ShiftDept: case InpatientState.InICU: case InpatientState.InDeliveryRoom: if ((targetRow[colFinalyWard].ToString() == sourceRow[colFinalyWard].ToString()) && (targetRow[colFinalyDept].ToString() == sourceRow[colFinalyDept].ToString())) { // 撤销转科 ceaseReason = OrderCeaseReason.ShiftDept; } else { // 如果是转科,则发送转入消息 SendQCMessage(targetRow, targetRow[colBedDoctor].ToString(), oldState, DateTime.Now); } break; case InpatientState.OutWard: case InpatientState.CancleBalanced: // 出区召回 ceaseReason = OrderCeaseReason.LeaveHospital; break; } } else if (newState == InpatientState.Balanced) { if (oldState != InpatientState.Balanced) // 发送出院消息 { SendQCMessage(targetRow, targetRow[colBedDoctor].ToString(), InpatientState.OutWard, DateTime.Parse(sourceRow["OutWardDate"].ToString())); } } }