1083 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1083 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using DrawGraph;
 | |
| using System.Drawing;
 | |
| using System.Xml.Serialization;
 | |
| using System.Data.SqlClient;
 | |
| using HelperDB;
 | |
| using System.Resources;
 | |
| using AIMSExtension;
 | |
| using System.Windows.Forms;
 | |
| using System.Reflection;
 | |
| 
 | |
| namespace DrawGraph
 | |
| {
 | |
|     public class PhysioDataConfig : EventObj
 | |
|     {
 | |
|         #region 属性
 | |
|         private int id;
 | |
|         private int patientId;
 | |
|         private string name;
 | |
|         private string enname;
 | |
|         private string color;
 | |
|         private string imgPath;
 | |
|         private int highLimit;
 | |
|         private int lowLimit;
 | |
|         private bool isValid;
 | |
|         private string operatorNo;
 | |
|         private string operatorName;
 | |
|         private DateTime operateDate;
 | |
|         private string configType;
 | |
|         private bool showImg;
 | |
|         private bool showText;
 | |
|         private int warningHighLimit;
 | |
|         private int warningLowLimit;
 | |
|         private bool isSplit;
 | |
|         private bool isDefalultShow;
 | |
|         private string unit;
 | |
|         private int physioOrder;
 | |
|         private float symbolSize;
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int Id
 | |
|         {
 | |
|             get { return id; }
 | |
|             set { id = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 手术ID
 | |
|         /// </summary>
 | |
|         public int PatientId
 | |
|         {
 | |
|             get { return patientId; }
 | |
|             set { patientId = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string Name
 | |
|         {
 | |
|             get { return name; }
 | |
|             set { name = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string Enname
 | |
|         {
 | |
|             get { return enname; }
 | |
|             set { enname = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string Color
 | |
|         {
 | |
|             get { return color; }
 | |
|             set { color = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string ImgPath
 | |
|         {
 | |
|             get { return imgPath; }
 | |
|             set { imgPath = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int HighLimit
 | |
|         {
 | |
|             get { return highLimit; }
 | |
|             set { highLimit = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int LowLimit
 | |
|         {
 | |
|             get { return lowLimit; }
 | |
|             set { lowLimit = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public bool IsValid
 | |
|         {
 | |
|             get { return isValid; }
 | |
|             set { isValid = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string OperatorNo
 | |
|         {
 | |
|             get { return operatorNo; }
 | |
|             set { operatorNo = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string OperatorName
 | |
|         {
 | |
|             get { return operatorName; }
 | |
|             set { operatorName = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public DateTime OperateDate
 | |
|         {
 | |
|             get { return operateDate; }
 | |
|             set { operateDate = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string ConfigType
 | |
|         {
 | |
|             get { return configType; }
 | |
|             set { configType = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public bool ShowImg
 | |
|         {
 | |
|             get { return showImg; }
 | |
|             set { showImg = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public bool ShowText
 | |
|         {
 | |
|             get { return showText; }
 | |
|             set { showText = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int WarningHighLimit
 | |
|         {
 | |
|             get { return warningHighLimit; }
 | |
|             set { warningHighLimit = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int WarningLowLimit
 | |
|         {
 | |
|             get { return warningLowLimit; }
 | |
|             set { warningLowLimit = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public bool IsSplit
 | |
|         {
 | |
|             get { return isSplit; }
 | |
|             set { isSplit = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public bool IsDefalultShow
 | |
|         {
 | |
|             get { return isDefalultShow; }
 | |
|             set { isDefalultShow = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public string Unit
 | |
|         {
 | |
|             get { return unit; }
 | |
|             set { unit = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int PhysioOrder
 | |
|         {
 | |
|             get { return physioOrder; }
 | |
|             set { physioOrder = value; }
 | |
|         }
 | |
|         public float SymbolSize
 | |
|         {
 | |
|             get { return symbolSize; }
 | |
|             set { symbolSize = value; }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region 私有变量 
 | |
|         private int yAisx = 0;
 | |
|         private Color conveColor;
 | |
|         public double X_MINOR_GRID_STEP = 5.0; //步长
 | |
|         private PointPairList aPhysioDatas;
 | |
|         PhysioData pdTrue = null;
 | |
|         public double YLocation { get; set; }
 | |
|         [XmlIgnore]
 | |
|         private LineItem curve1;
 | |
|         [XmlIgnore]
 | |
|         private bool isClick = false;
 | |
|         [XmlIgnore]
 | |
|         public LineItem curve
 | |
|         {
 | |
|             get { return curve1; }
 | |
|             set { curve1 = value; }
 | |
|         }
 | |
|         [XmlIgnore]
 | |
|         public bool IsClick
 | |
|         {
 | |
|             get { return isClick; }
 | |
|             set { isClick = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 生理数据集合
 | |
|         /// </summary>
 | |
|         public PointPairList APhysioParams
 | |
|         {
 | |
|             get { return aPhysioDatas; }
 | |
|             set { aPhysioDatas = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 此曲线的Y轴
 | |
|         /// </summary>
 | |
|         public int YAisx
 | |
|         {
 | |
|             get { return yAisx; }
 | |
|             set { yAisx = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 线的着色
 | |
|         /// </summary>
 | |
|         public Color ConveColor
 | |
|         {
 | |
|             get { return conveColor; }
 | |
|             set { conveColor = value; }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Panel动态填写对象
 | |
|         /// </summary>
 | |
|         public AbleEditPackObj phListPack = null;
 | |
| 
 | |
|         public delegate void ClickEventHandler(object sender, EventArgs e);
 | |
|         public event ClickEventHandler Click;
 | |
|         public void onClick(EventArgs e)
 | |
|         {
 | |
|             if (Click != null)
 | |
|             {
 | |
|                 Click(this, e);
 | |
|             }
 | |
|         }
 | |
|         public PhysioDataConfig()
 | |
|         {
 | |
|             APhysioParams = new PointPairList();
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region 初始化
 | |
|         /// <summary>
 | |
|         /// 画生理曲线,即初始化
 | |
|         /// </summary>
 | |
|         public void initCurve(bool isValidLine = true)
 | |
|         {
 | |
|             if (zgcAnas == null)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             PointPairList ppl = new PointPairList();
 | |
| 
 | |
|             curve = ZUtil.AddCurve(Name, ppl, conveColor, imgPath, true, zgcAnas, TextPrefix.PI + Name + Id.ToString(), SymbolSize);
 | |
| 
 | |
|             curve.YAxisIndex = this.YAisx;
 | |
|             curve.Label.IsVisible = this.isValid;
 | |
|             curve.Symbol.IsVisible = this.isValid;
 | |
|             curve.Line.IsVisible = isValidLine;
 | |
| 
 | |
|             curve.Label.FontSpec = new FontSpec("微软雅黑", 5.9f, System.Drawing.Color.Black, false, false, false);
 | |
|             curve.Label.FontSpec.Border.IsVisible = false;
 | |
|             curve.Label.FontSpec.Fill.IsVisible = false;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 重新设置曲线属性
 | |
|         /// </summary>
 | |
|         public void reSetCurve()
 | |
|         {
 | |
|             this.curve.Color = this.ConveColor;
 | |
|             this.curve.Symbol.Fill = new Fill(new ZUtil().getImage(this.imgPath), System.Drawing.Drawing2D.WrapMode.Clamp);
 | |
|             this.curve.IsVisible = this.isValid;
 | |
|             this.curve.YAxisIndex = this.YAisx;
 | |
|             curve.Label.IsVisible = this.isValid;
 | |
|             curve.Line.IsVisible = this.isValid;
 | |
|             curve.Symbol.IsVisible = this.isValid;
 | |
| 
 | |
|             if (!ShowText)
 | |
|             {
 | |
|                 foreach (PointPair pp in APhysioParams)
 | |
|                 {
 | |
|                     PhysioData pd = PointPairToPhysioData(pp);
 | |
|                     if (pd != null)
 | |
|                     {
 | |
|                         delAddObj(pd);
 | |
|                         SetPositionText(pd, "-1");
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 foreach (PointPair pp in APhysioParams)
 | |
|                 {
 | |
|                     PhysioData pd = PointPairToPhysioData(pp);
 | |
|                     if (pd != null) DrawTextPhysioData(pd);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 重新设置曲线属性
 | |
|         /// </summary>
 | |
|         public void reSetCurveSpo2()
 | |
|         {
 | |
|             this.curve.Color = this.ConveColor;
 | |
|             this.curve.Symbol.Fill = new Fill(new ZUtil().getImage(this.imgPath), System.Drawing.Drawing2D.WrapMode.Clamp);
 | |
|             this.curve.IsVisible = this.isValid;
 | |
|             this.curve.YAxisIndex = this.YAisx;
 | |
|             curve.Label.IsVisible = this.isValid;
 | |
|             curve.Line.IsVisible = this.isValid;
 | |
|             curve.Symbol.IsVisible = this.isValid;
 | |
|         }
 | |
|         public static IList<PhysioDataConfig> GetLifeList()
 | |
|         {
 | |
|             string sql = "Select * FROM PhysioDataConfig where ConfigType='生命体征' order by PhysioOrder asc";
 | |
|             return GetListBySql(sql);
 | |
|         }
 | |
|         public static IList<PhysioDataConfig> GetAnesList()
 | |
|         {
 | |
|             string sql = "Select * FROM PhysioDataConfig where ConfigType='麻醉体征' order by PhysioOrder asc";
 | |
|             return GetListBySql(sql);
 | |
|         }
 | |
|         public static IList<PhysioDataConfig> GetEventList()
 | |
|         {
 | |
|             string sql = "Select * FROM PhysioDataConfig where ConfigType='事件' order by PhysioOrder asc";
 | |
|             return GetListBySql(sql);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region 数据操作
 | |
|         public void AddPointItem(PhysioData pd, bool isInsertDB = true)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (pd.Value <= 0) return;
 | |
|             bool isHave = false;
 | |
|             foreach (PointPair pptemp in APhysioParams)
 | |
|             {
 | |
|                 PhysioData temp1 = PointPairToPhysioData(pptemp);
 | |
|                 if (pd.isEquert(temp1) && temp1.Value != Double.MaxValue)
 | |
|                 {
 | |
|                     isHave = true;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             if (isHave) return;
 | |
|             if (APhysioParams.Count > 0 && IsSplit == true)
 | |
|             {
 | |
|                 PhysioData pdTemp = pd.Clone();
 | |
| 
 | |
|                 //当前点的前一个点加步长时间的结点
 | |
|                 PhysioData pdQD = reMPhysioData(pdTemp);
 | |
|                 //插入的点大于之前点5分钟以上
 | |
|                 if (DateTime.Compare(pd.RecordTime, pdQD.RecordTime.AddMinutes(1)) > 0)
 | |
|                 {
 | |
|                     pdTemp.Value = Double.MaxValue;
 | |
|                     this.APhysioParams.Add(pdTemp);
 | |
|                 }
 | |
|             }
 | |
|             this.APhysioParams.Add(pd);
 | |
|             Sort();
 | |
|             if (curve != null)
 | |
|                 curve.Points = APhysioParams;
 | |
|             if (isInsertDB == true)
 | |
|                 PhysioDataService.AddPhysioData(pd);
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 DrawTextPhysioData(pd);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void UpdatePointItem(PhysioData pd, bool isInsertDB = true)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (pd.Value <= 0) return;
 | |
|             bool isHave = false;
 | |
|             foreach (PointPair pptemp in APhysioParams)
 | |
|             {
 | |
|                 PhysioData temp1 = PointPairToPhysioData(pptemp);
 | |
|                 if (pd.isEquert(temp1) && temp1.Value != Double.MaxValue)
 | |
|                 {
 | |
|                     isHave = true;
 | |
| 
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             if (!isHave)  
 | |
|             this.APhysioParams.Add(pd);
 | |
|             Sort();
 | |
|             if (curve != null)
 | |
|                 curve.Points = APhysioParams;
 | |
|             if (isInsertDB == true)
 | |
|                 PhysioDataService.AddPhysioData(pd);
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 DrawTextPhysioData(pd);
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 增加一点生理数据,往数据库中写入数据
 | |
|         /// </summary>
 | |
|         /// <param name="pd"></param>
 | |
|         public void AddItem(PhysioData pd, bool isShouDong = true, bool isFillMissPoint = true)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (pd.Value < 0) return;
 | |
|             if (pdTrue == null)
 | |
|                 pdTrue = pd.Clone();
 | |
| 
 | |
|             if (APhysioParams.Count > 0 && IsSplit == true)
 | |
|             {
 | |
|                 PhysioData pdTemp = pd.Clone();
 | |
| 
 | |
|                 //当前点的前一个点加步长时间的结点
 | |
|                 PhysioData pdQD = reMPhysioData(pdTemp);
 | |
|                 //插入的点大于之前点5分钟以上
 | |
|                 if (DateTime.Compare(pd.RecordTime, pdQD.RecordTime.AddMinutes(1)) > 0)
 | |
|                 {
 | |
|                     pdTemp.Value = Double.MaxValue;
 | |
|                     this.APhysioParams.Add(pdTemp);
 | |
|                 }
 | |
|             }
 | |
|             if (isShouDong)
 | |
|                 pd = reCnterValue(pd);
 | |
|             //增加点时如果当前有点且是隐藏的则直接改值
 | |
|             Sort();
 | |
|             bool isHave = false;
 | |
|             foreach (PointPair pptemp in APhysioParams)
 | |
|             {
 | |
|                 PhysioData pdTemp = PointPairToPhysioData(pptemp);
 | |
|                 if (pdTemp.isEquert(pd) && pdTemp.Value == Double.MaxValue)
 | |
|                 {
 | |
|                     pptemp.Y = pd.Value;
 | |
|                     isHave = true;
 | |
|                     break;
 | |
|                 }
 | |
|                 else if (pdTemp.isEquert(pd))
 | |
|                 {
 | |
|                     isHave = true;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             if (!isHave)
 | |
|             {
 | |
|                 this.APhysioParams.Add(pd);
 | |
|             }
 | |
|             Sort();
 | |
|             pd.ValueString = pd.Value.ToString();
 | |
|             curve.Points = APhysioParams;
 | |
|             PhysioDataService.AddPhysioData(pd);
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 DrawTextPhysioData(pd);
 | |
|             }
 | |
|             if (isShouDong == true)
 | |
|             {
 | |
|                 for (int i = APhysioParams.Count - 1; i > -1; i--)
 | |
|                 {
 | |
|                     PhysioData maxPhysioData = PointPairToPhysioData(APhysioParams[i]);
 | |
|                     if (i != 0 && i != APhysioParams.Count - 1)
 | |
|                     {
 | |
|                         if (maxPhysioData.Y == Double.MaxValue)
 | |
|                         {
 | |
|                             bool b = false;
 | |
|                             for (int j = 0; j < APhysioParams.Count; j++)
 | |
|                             {
 | |
|                                 PhysioData pdt = PointPairToPhysioData(APhysioParams[j]);
 | |
|                                 if (pdt.RecordTime == maxPhysioData.RecordTime && pdt.Value <= HighLimit)
 | |
|                                 {
 | |
|                                     b = true;
 | |
|                                     break;
 | |
|                                 }
 | |
|                             }
 | |
|                             if (b == true)
 | |
|                                 this.APhysioParams.Remove(maxPhysioData);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             if (isFillMissPoint == true && pdTrue != null)
 | |
|             {
 | |
|                 //返回当前曲线上最大且不为空的点
 | |
|                 PhysioData maxPd = ReMaxAndGoodPhysioData();
 | |
|                 if (maxPd != null && pdTrue.RecordTime > maxPd.RecordTime)
 | |
|                 {
 | |
|                     int timeDiff = DateTime.Compare(pdTrue.RecordTime, maxPd.RecordTime);
 | |
|                     //因为插入的真实点大于曲线上最后一个点,则指增加生理数据
 | |
|                     if (timeDiff > 0)
 | |
|                     {
 | |
|                         //如果新增加的点还小于真实的点,则批量增加生理数据
 | |
|                         if (DateTime.Compare(pd.RecordTime, pdTrue.RecordTime) < 0 && pd.RecordTime.ToString("HH:mm") != pdTrue.RecordTime.ToString("HH:mm"))
 | |
|                         {
 | |
|                             pd.RecordTime = pd.RecordTime.AddMinutes(this.X_MINOR_GRID_STEP);
 | |
| 
 | |
|                             bool isHavechild = false;
 | |
|                             foreach (PointPair pptemp in APhysioParams)
 | |
|                             {
 | |
|                                 PhysioData pdTemp = PointPairToPhysioData(pptemp);
 | |
|                                 if (pdTemp.isEquert(pd) && pdTemp.Value != Double.MaxValue)
 | |
|                                 {
 | |
|                                     isHavechild = true;
 | |
|                                     break;
 | |
|                                 }
 | |
|                             }
 | |
|                             if (isHavechild == false)
 | |
|                                 AddItem(pd, isShouDong, isFillMissPoint);
 | |
|                         }
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         pdTrue = null;
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     pdTrue = null;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 增加一点生理数据,往数据库中写入数据
 | |
|         /// </summary>
 | |
|         /// <param name="pd"></param>
 | |
|         public void AddMultipleItem(PhysioData pd, DateTime endtime, int collectInterval)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             pd = reCnterValue(pd);
 | |
|             TimeSpan tsp = endtime - pd.RecordTime;
 | |
|             if (tsp.TotalMinutes >= 20 && this.IsSplit == true)
 | |
|             {
 | |
|                 pd.RecordTime = endtime;
 | |
|                 pd = reCnterValue(pd, false);
 | |
|                 AddItem(pd, false);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 pd.RecordTime = endtime;
 | |
|                 AddItem(pd);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 仅修改值不修改数据库
 | |
|         /// </summary>
 | |
|         /// <param name="oldPd"></param>
 | |
|         /// <param name="newPd"></param>
 | |
|         /// <param name="index"></param>
 | |
|         public PhysioData MoveItem(PhysioData newPd)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (newPd.Value < 0) return null;
 | |
|             newPd = reCnterValue(newPd);
 | |
| 
 | |
|             int index = indexOf(newPd);
 | |
|             if (index == -1) return null;
 | |
|             this.APhysioParams[index].Y = newPd.Y;
 | |
| 
 | |
|             Sort();
 | |
|             curve.Points = APhysioParams;
 | |
| 
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 MoveText(newPd);
 | |
|             }
 | |
|             return newPd;
 | |
|         }
 | |
|         private void MoveText(PhysioData newPd)
 | |
|         {
 | |
|             TextObj text = (TextObj)zgcAnas.MasterPane.GraphObjList[this.Enname + newPd.RecordTime.ToString()];
 | |
|             if (text != null)
 | |
|             {
 | |
|                 text.Location.Y = YLocation;
 | |
|                 text.Text = ((int)newPd.Value).ToString();
 | |
|             }
 | |
|         }
 | |
|         public void ModifyItem(PhysioData oldPd, PhysioData newPd)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (newPd.Value < 0 && oldPd.PhysioDataConfigId != newPd.PhysioDataConfigId)
 | |
|                 return;
 | |
|             int index = indexOf(newPd);
 | |
|             if (index == -1) return;
 | |
|             //newPd = reCnterValue(newPd, false);
 | |
|             newPd.ValueString = newPd.Value.ToString();
 | |
|             this.APhysioParams[index].Y = newPd.Y;
 | |
|             Sort();
 | |
|             curve.Points = APhysioParams;
 | |
|             PhysioDataService.UpdatePhysioData(oldPd, newPd, PublicMethod.OperatorName);
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 delAddObj(oldPd);
 | |
|                 DrawTextPhysioData(newPd);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void ModifyAddItem(PhysioData oldPd, PhysioData newPd)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (newPd.Value < 0 && oldPd.PhysioDataConfigId != newPd.PhysioDataConfigId)
 | |
|                 return;
 | |
|             if (newPd.Value < lowLimit)
 | |
|             {
 | |
|                 newPd.ValueString = lowLimit.ToString();
 | |
|             }
 | |
|             if (newPd.Value > highLimit && newPd.Value < double.MaxValue)
 | |
|             {
 | |
|                 newPd.ValueString = highLimit.ToString();
 | |
|             }
 | |
|             int index = indexOf(newPd);
 | |
|             if (index == -1)
 | |
|             {
 | |
|                 if (APhysioParams.Count > 0)
 | |
|                 {
 | |
|                     PhysioData pdTemp = newPd.Clone();
 | |
|                     //当前点的前一个点加步长时间的结点
 | |
|                     PhysioData pdQD = reMPhysioData(pdTemp);
 | |
|                     //插入的点大于之前点5分钟以上
 | |
|                     if (DateTime.Compare(newPd.RecordTime, pdQD.RecordTime.AddMinutes(1)) > 0)
 | |
|                     {
 | |
|                         this.APhysioParams.Add(pdTemp);
 | |
|                         PhysioDataService.UpdatePhysioData(pdTemp, pdTemp, PublicMethod.OperatorName);
 | |
|                         if (ShowText == true)
 | |
|                         {
 | |
|                             DrawTextPhysioData(pdTemp);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 this.APhysioParams.Add(newPd);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 newPd.ValueString = newPd.Value.ToString();
 | |
|                 this.APhysioParams[index].Y = newPd.Y;
 | |
|             }
 | |
|             Sort();
 | |
|             curve.Points = APhysioParams;
 | |
|             PhysioDataService.UpdatePhysioData(oldPd, newPd, PublicMethod.OperatorName);
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 delAddObj(oldPd);
 | |
|                 DrawTextPhysioData(newPd);
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 删除一点生理数据
 | |
|         /// </summary>
 | |
|         /// <param name="pd"></param>
 | |
|         public void DelItem(PhysioData pd)
 | |
|         {
 | |
|             Sort();
 | |
|             //如果是两头的点就删除,如果是中间的点就设置为无效
 | |
|             bool isModmaxValue = false;
 | |
|             for (int i = APhysioParams.Count - 1; i > -1; i--)
 | |
|             {
 | |
|                 PhysioData maxPhysioData = PointPairToPhysioData(APhysioParams[i]);
 | |
|                 if (maxPhysioData.isEquert(pd) && i != 0 && i != APhysioParams.Count - 1)
 | |
|                 {
 | |
|                     APhysioParams[i].Y = Double.MaxValue;
 | |
|                     isModmaxValue = true;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             if (!isModmaxValue)
 | |
|                 this.APhysioParams.Remove(pd);
 | |
|             curve.Points = APhysioParams;
 | |
| 
 | |
|             Sort();
 | |
| 
 | |
|             if (ShowText == true || pd.Value == HighLimit)
 | |
|             {
 | |
|                 delAddObj(pd);
 | |
|                 SetPositionText(pd, "-1");
 | |
|             }
 | |
|             PhysioDataService.DelPhysioByValueData(pd);
 | |
|             for (int i = APhysioParams.Count - 1; i > -1; i--)
 | |
|             {
 | |
|                 PhysioData maxPhysioData = PointPairToPhysioData(APhysioParams[i]);
 | |
|                 if (maxPhysioData.isEquert(pd) && maxPhysioData.Y != Double.MaxValue)
 | |
|                 {
 | |
|                     this.APhysioParams.Remove(APhysioParams[i]);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         public void DelItems(DateTime RecordTime, DateTime EndTime)
 | |
|         {
 | |
|             PhysioDataService.DelPhysioasDataParameterID(RecordTime, EndTime, this.Id, this.PatientId);
 | |
|         }
 | |
|         public void DrawTextPhysioData(PhysioData pd)
 | |
|         {
 | |
|             delAddObj(pd);
 | |
|             if (pd.RecordTime <= pageEnd && pd.RecordTime >= pageBegin)
 | |
|             {
 | |
|                 string viewValue = "";
 | |
| 
 | |
|                 if (ConfigType == "生命体征" || ShowText == true)
 | |
|                 {
 | |
|                     if (pd.Value != Double.MaxValue && pd.Value > 0)
 | |
|                     {
 | |
|                         viewValue = ((double)pd.Value).ToString();
 | |
|                         if (Enname == "Temp")
 | |
|                             viewValue = Math.Round(pd.Y, 1).ToString();
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         viewValue = pd.ValueString;
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     viewValue = pd.ValueString;
 | |
|                 }
 | |
|                 if (viewValue != "")
 | |
|                 {
 | |
|                     //取这个时间点的偏移量
 | |
|                     DateTime pylTime = GetpylTime(pd.RecordTime);
 | |
|                     if (pylTime > pageBegin && pylTime < pageEnd)
 | |
|                     {
 | |
|                         ZUtil.DrawText(viewValue, getXPositinByXDate(pylTime), YLocation, zgcAnas, this.Enname + pd.RecordTime.ToString(), 5f, true);
 | |
|                         SetPositionText(pd, viewValue);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         public DateTime GetpylTime(DateTime RecordTime, int YAisx = 5)
 | |
|         {
 | |
|             DateTime resultTime = RecordTime;
 | |
|             for (int i = (240 / 5); i >= 0; i--)
 | |
|             {
 | |
|                 DateTime spanTime = pageBegin.AddMinutes(i * 5);
 | |
|                 if (spanTime >= resultTime && spanTime < resultTime.AddMinutes(5))
 | |
|                 {
 | |
|                     resultTime = spanTime.AddMinutes(2).AddSeconds(30);
 | |
|                     break;
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|             return resultTime;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region 通用方法
 | |
|         /// <summary>
 | |
|         /// 为生理数据集合排序
 | |
|         /// </summary>
 | |
|         public void Sort()
 | |
|         {
 | |
|             aPhysioDatas.Sort();
 | |
|         }
 | |
|         public int indexOf(PhysioData pd)
 | |
|         {
 | |
|             for (int i = 0; i < APhysioParams.Count; i++)
 | |
|             {
 | |
|                 if (pd.isEquert(PointPairToPhysioData(APhysioParams[i])))
 | |
|                 {
 | |
|                     return i;
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|             return -1;
 | |
|         }
 | |
|         public PhysioData PointPairToPhysioData(PointPair pp)
 | |
|         {
 | |
|             if (pp == null) return null;
 | |
|             PhysioData pd = new PhysioData();
 | |
|             pd.ValueString = pp.Y.ToString();
 | |
|             pd.Value = pp.Y;
 | |
|             pd.RecordTime = new XDate(pp.X);
 | |
|             pd.PatientId = PatientId;
 | |
|             pd.PhysioDataConfigId = Id;
 | |
|             pd.config = this;
 | |
|             return pd;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 删除麻醉单上的曲线本身,不包含数据删除
 | |
|         /// </summary>
 | |
|         /// <param name="DrugsRecord"></param>
 | |
|         public override void clearAddObj(ZedGraphControl zgc)
 | |
|         {
 | |
|             if (zgcAnas == null || zgcAnas != zgc) zgcAnas = zgc;
 | |
| 
 | |
|             if (ShowText == true)
 | |
|             {
 | |
|                 foreach (PointPair pp in APhysioParams)
 | |
|                 {
 | |
|                     PhysioData pd = PointPairToPhysioData(pp);
 | |
|                     if (pd != null)
 | |
|                     {
 | |
|                         delAddObj(pd);
 | |
|                         SetPositionText(pd, "-1");
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             if (APhysioParams == null || curve == null) return;
 | |
|             APhysioParams.Clear();
 | |
|             curve.Points = APhysioParams;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 清除各种对象数据
 | |
|         /// </summary>
 | |
|         /// <param name="frm"></param>
 | |
|         public void ClearTagstr(ZedGraphControl zgc)
 | |
|         {
 | |
|             if (zgcAnas == null || zgcAnas != zgc) zgcAnas = zgc;
 | |
|             delAddObj("PP" + Enname);
 | |
|             delAddObj("PP" + Enname + "unit");
 | |
|             delAddObj("PP" + Enname + Id);
 | |
|             delAddObj("PPP" + Enname);
 | |
|             delAddObj("PPP" + Enname + "unit");
 | |
|         }
 | |
|         public void delAddObj(PhysioData newPd)
 | |
|         {
 | |
|             delAddObj(this.Enname + newPd.RecordTime.ToString());
 | |
| 
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 控制画点的范围
 | |
|         /// </summary>
 | |
|         /// <param name="pd">物理点</param>
 | |
|         /// <param name="isCaiji">是否采集</param>
 | |
|         /// <returns></returns>
 | |
|         private PhysioData reCnterValue(PhysioData pd, bool isShouDong = true)
 | |
|         {
 | |
|             if (pd != null)
 | |
|             {
 | |
|                 //因为物理数据的值小于下标值或大于上标值中,取上下中间的值
 | |
|                 if (pd.Value < lowLimit)
 | |
|                 {
 | |
|                     pd.Value = lowLimit;
 | |
|                 }
 | |
|                 if (pd.Value > highLimit && pd.Value < double.MaxValue)
 | |
|                 {
 | |
|                     pd.Value = highLimit;
 | |
| 
 | |
|                 }
 | |
|                 if (APhysioParams.Count > 0 && isShouDong)
 | |
|                 {
 | |
|                     Sort();
 | |
|                     pd = reMPhysioData(pd);
 | |
|                 }
 | |
|             }
 | |
|             return pd;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 返回小于传入点里小于且最接近的点
 | |
|         /// </summary>
 | |
|         /// <param name="pd">传入点</param>
 | |
|         /// <returns></returns>
 | |
|         private PhysioData reMPhysioData(PhysioData pd)
 | |
|         {
 | |
|             PhysioData maxPhysioData = null;
 | |
|             for (int i = APhysioParams.Count - 1; i > -1; i--)
 | |
|             {
 | |
|                 maxPhysioData = PointPairToPhysioData(APhysioParams[i]);
 | |
|                 int inTime = DateTime.Compare(pd.RecordTime, maxPhysioData.RecordTime);
 | |
|                 //且被大于的值的点不空隐藏
 | |
|                 if (inTime > 0 && maxPhysioData.Value != Double.MaxValue)
 | |
|                 {
 | |
|                     pd.RecordTime = maxPhysioData.RecordTime.AddMinutes(this.X_MINOR_GRID_STEP);
 | |
|                     return pd;
 | |
|                 }
 | |
|             }
 | |
|             return pd;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 返回当前曲线上最大且不为空的点
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         private PhysioData ReMaxAndGoodPhysioData()
 | |
|         {
 | |
|             PhysioData rePd = null;
 | |
|             for (int i = APhysioParams.Count - 1; i > -1; i--)
 | |
|             {
 | |
|                 rePd = PointPairToPhysioData(APhysioParams[i]);
 | |
|                 //且被大于的值的点不空隐藏
 | |
|                 if (rePd.Value != Double.MaxValue)
 | |
|                 {
 | |
|                     return rePd;
 | |
|                 }
 | |
|             }
 | |
|             return rePd;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region 动态体征方法 
 | |
|         public static int UpdatePhysioDataConfig(PhysioDataConfig physioDataConfig)
 | |
|         {
 | |
|             string sql = "Update PhysioDataConfig set HighLimit=@HighLimit, LowLimit=@LowLimit,ShowImg=@ShowImg, ShowText=@ShowText, WarningHighLimit=@WarningHighLimit, WarningLowLimit=@WarningLowLimit, IsSplit=@IsSplit, IsDefalultShow=@IsDefalultShow, Unit=@Unit, PhysioOrder=@PhysioOrder, YAisx=@YAisx, SymbolSize=@SymbolSize where Id=@Id";
 | |
| 
 | |
|             SqlParameter[] para = new SqlParameter[]
 | |
|                                      {
 | |
|                                         new SqlParameter("@Id",physioDataConfig.Id), new SqlParameter("@HighLimit",physioDataConfig.HighLimit), new SqlParameter("@LowLimit",physioDataConfig.LowLimit),  new SqlParameter("@ShowImg",physioDataConfig.ShowImg), new SqlParameter("@ShowText",physioDataConfig.ShowText), new SqlParameter("@WarningHighLimit",physioDataConfig.WarningHighLimit), new SqlParameter("@WarningLowLimit",physioDataConfig.WarningLowLimit), new SqlParameter("@IsSplit",physioDataConfig.IsSplit), new SqlParameter("@IsDefalultShow",physioDataConfig.IsDefalultShow), new SqlParameter("@Unit",physioDataConfig.Unit), new SqlParameter("@PhysioOrder",physioDataConfig.PhysioOrder), new SqlParameter("@YAisx",physioDataConfig.YAisx), new SqlParameter("@SymbolSize",physioDataConfig.SymbolSize)
 | |
|                                   };
 | |
|             return DBHelper.ExecNonQuery(sql, para);
 | |
|         }
 | |
|         private static IList<PhysioDataConfig> GetListBySql(string sql, params SqlParameter[] para)
 | |
|         {
 | |
|             IList<PhysioDataConfig> list = new List<PhysioDataConfig>();
 | |
|             using (SqlDataReader reader = DBHelper.GetReader(sql, para))
 | |
|             {
 | |
|                 while (reader.Read())
 | |
|                 {
 | |
|                     PhysioDataConfig temp = new PhysioDataConfig();
 | |
| 
 | |
|                     temp.Id = DBHelper.GetInt(reader["Id"]);
 | |
|                     temp.Name = DBHelper.GetString(reader["Name"]);
 | |
|                     temp.Enname = DBHelper.GetString(reader["Enname"]);
 | |
|                     temp.Color = DBHelper.GetString(reader["Color"]);
 | |
|                     temp.ImgPath = DBHelper.GetString(reader["imgPath"]);
 | |
|                     temp.IsValid = DBHelper.GetInt(reader["IsValid"]) == 1 ? true : false;
 | |
|                     temp.OperatorNo = DBHelper.GetString(reader["OperatorNo"]);
 | |
|                     temp.OperatorName = DBHelper.GetString(reader["OperatorName"]);
 | |
|                     temp.OperateDate = DBHelper.GetDateTime(reader["OperateDate"]);
 | |
|                     temp.ConfigType = DBHelper.GetString(reader["ConfigType"]);
 | |
|                     temp.ShowImg = DBHelper.GetInt(reader["ShowImg"]) == 1 ? true : false;
 | |
|                     temp.ShowText = DBHelper.GetInt(reader["ShowText"]) == 1 ? true : false;
 | |
|                     temp.HighLimit = DBHelper.GetInt(reader["HighLimit"]);
 | |
|                     temp.LowLimit = DBHelper.GetInt(reader["LowLimit"]);
 | |
|                     temp.WarningHighLimit = DBHelper.GetInt(reader["WarningHighLimit"]);
 | |
|                     temp.WarningLowLimit = DBHelper.GetInt(reader["WarningLowLimit"]);
 | |
|                     temp.IsSplit = DBHelper.GetInt(reader["IsSplit"]) == 1 ? true : false;
 | |
|                     temp.IsDefalultShow = DBHelper.GetInt(reader["IsDefalultShow"]) == 1 ? true : false;
 | |
|                     temp.Unit = DBHelper.GetString(reader["Unit"]);
 | |
|                     temp.PhysioOrder = DBHelper.GetInt(reader["PhysioOrder"]);
 | |
|                     temp.YAisx = DBHelper.GetInt(reader["YAisx"]);
 | |
|                     temp.SymbolSize = DBHelper.GetInt(reader["SymbolSize"]);
 | |
| 
 | |
|                     list.Add(temp);
 | |
|                 }
 | |
|                 reader.Close();
 | |
|                 return list;
 | |
|             }
 | |
|         }
 | |
|         public static PhysioData newPhysioData(PhysioDataConfig dataConfig, int Id, DateTime RecordTime, string Value)
 | |
|         {
 | |
|             PhysioData pdTemp = new PhysioData();
 | |
|             pdTemp.RecordTime = RecordTime;
 | |
|             pdTemp.ValueString = Value;
 | |
|             pdTemp.PhysioDataConfigId = dataConfig.Id;
 | |
|             pdTemp.PatientId = Id;
 | |
|             pdTemp.config = dataConfig;
 | |
|             return pdTemp;
 | |
|         }
 | |
|         public static PhysioData newPhysioData(PhysioDataConfig dataConfig, int Id, DateTime RecordTime, double Value)
 | |
|         {
 | |
|             PhysioData pdTemp = new PhysioData();
 | |
|             pdTemp.RecordTime = RecordTime;
 | |
|             pdTemp.ValueString = Value.ToString();
 | |
|             pdTemp.PhysioDataConfigId = dataConfig.Id;
 | |
|             pdTemp.PatientId = Id;
 | |
|             pdTemp.config = dataConfig;
 | |
|             return pdTemp;
 | |
|         }
 | |
|         public void EditAddItem(PhysioData pd)
 | |
|         {
 | |
|             this.APhysioParams.Add(pd);
 | |
|             PhysioDataService.AddPhysioData(pd);
 | |
|             DrawTextPhysioData(pd);
 | |
|         }
 | |
|         public void EditModifyItem(PhysioData oldPd, PhysioData newPd)
 | |
|         {
 | |
|             //如果是负数则不执行操作
 | |
|             if (oldPd.PhysioDataConfigId != newPd.PhysioDataConfigId)
 | |
|                 return;
 | |
|             PhysioDataService.UpdatePhysioData(oldPd, newPd, PublicMethod.OperatorName);
 | |
| 
 | |
|             delAddObj(oldPd);
 | |
|             DrawTextPhysioData(newPd);
 | |
|             this.APhysioParams.Remove(oldPd);
 | |
|             this.APhysioParams.Add(newPd);
 | |
|         }
 | |
|         public void EditDelItem(PhysioData pd)
 | |
|         {
 | |
|             delAddObj(pd);
 | |
|             SetPositionText(pd, "-1");
 | |
|             this.APhysioParams.Remove(pd);
 | |
|             PhysioDataService.DelPhysioByValueData(pd);
 | |
|         }
 | |
|         public void SetPositionText(PhysioData pdTemp, string viewValue)
 | |
|         {
 | |
|             if (phListPack != null)
 | |
|             {
 | |
|                 Panel pan3 = phListPack.CControl as Panel;
 | |
|                 if (pan3 != null)
 | |
|                 {
 | |
|                     Control[] cs = pan3.Controls.Find(pdTemp.PhysioDataConfigId + "" + GetRecordTime(pdTemp.RecordTime).ToString("HHmm"), true);
 | |
|                     if (cs != null && cs.Length > 0)
 | |
|                     {
 | |
|                         Control c = cs[0];
 | |
|                         if (c != null)
 | |
|                         {
 | |
|                             if (viewValue == "-1")
 | |
|                             {
 | |
|                                 pdTemp.Value = -1;
 | |
|                                 pdTemp.ValueString = "";
 | |
|                                 c.Tag = pdTemp;
 | |
|                                 c.Text = "";
 | |
| 
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 c.Tag = pdTemp;
 | |
|                                 c.Text = viewValue.ToString();
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         public void AddText(PhysioData pd)
 | |
|         {
 | |
|             if (pd.ValueString == null || pd.ValueString == "") return;
 | |
|             DrawTextPhysioData(pd);
 | |
|         }
 | |
|         public DateTime GetRecordTime(DateTime pdTemp, int collectInterval = 5)
 | |
|         {
 | |
|             DateTime result = Convert.ToDateTime(pdTemp.ToString("yyyy-MM-dd HH:mm:00.000"));
 | |
|             //小于入室时间默认不画 
 | |
|             for (int i = 0; i < (480 / 5); i++)
 | |
|             {//InRoomTime.Value
 | |
|                 DateTime tempTime = pageBegin.AddMinutes(i * 5);
 | |
|                 if (tempTime >= result && result < tempTime.AddMinutes(5))
 | |
|                 {
 | |
|                     result = tempTime;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             //if (result < myOpeRecord.InRoomTime.Value)
 | |
|             //{
 | |
|             //    result = myOpeRecord.InRoomTime.Value;
 | |
|             //}
 | |
|             return result;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|     }
 | |
| }
 |