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; namespace DrawGraph { public class PhysioDataConfig : EventObj { private int id; 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; /// /// /// public int Id { get { return id; } set { id = value; } } /// /// /// public string Name { get { return name; } set { name = value; } } /// /// /// public string Enname { get { return enname; } set { enname = value; } } /// /// /// public string Color { get { return color; } set { color = value; } } /// /// /// public string ImgPath { get { return imgPath; } set { imgPath = value; } } /// /// /// public int HighLimit { get { return highLimit; } set { highLimit = value; } } /// /// /// public int LowLimit { get { return lowLimit; } set { lowLimit = value; } } /// /// /// public bool IsValid { get { return isValid; } set { isValid = value; } } /// /// /// public string OperatorNo { get { return operatorNo; } set { operatorNo = value; } } /// /// /// public string OperatorName { get { return operatorName; } set { operatorName = value; } } /// /// /// public DateTime OperateDate { get { return operateDate; } set { operateDate = value; } } /// /// /// public string ConfigType { get { return configType; } set { configType = value; } } /// /// /// public bool ShowImg { get { return showImg; } set { showImg = value; } } /// /// /// public bool ShowText { get { return showText; } set { showText = value; } } /// /// /// public int WarningHighLimit { get { return warningHighLimit; } set { warningHighLimit = value; } } /// /// /// public int WarningLowLimit { get { return warningLowLimit; } set { warningLowLimit = value; } } /// /// /// public bool IsSplit { get { return isSplit; } set { isSplit = value; } } /// /// /// public bool IsDefalultShow { get { return isDefalultShow; } set { isDefalultShow = value; } } /// /// /// public string Unit { get { return unit; } set { unit = value; } } /// /// /// public int PhysioOrder { get { return physioOrder; } set { physioOrder = value; } } #region 私有变量 private int yAisx = 0; private int patientId; private Color conveColor; public string showStyle { get; set; } private int curPDIndex = -1; public double X_MINOR_GRID_STEP = 5.0; //步长 private PointPairList aPhysioDatas; PhysioData pdTrue = null; public double showValue { get; set; } public string className = ""; [XmlIgnore] private LineItem curve1; [XmlIgnore] private bool isClick = false; #endregion #region 属性 [XmlIgnore] public LineItem curve { get { return curve1; } set { curve1 = value; } } [XmlIgnore] public bool IsClick { get { return isClick; } set { isClick = value; } } /// /// 当前选择点的Index /// public int CurPDIndex { get { return curPDIndex; } set { curPDIndex = value; } } /// /// 生理数据集合 /// public PointPairList APhysioParams { get { return aPhysioDatas; } set { aPhysioDatas = value; } } /// /// 此曲线的值以Y的第几个轴匹配 /// public int YAisx { get { return yAisx; } set { yAisx = value; } } /// /// 手术ID /// public int PatientId { get { return patientId; } set { patientId = value; } } /// /// 线的着色 /// public Color ConveColor { get { return conveColor; } set { conveColor = value; } } #endregion #region 事件 public delegate void ClickEventHandler(object sender, EventArgs e); public event ClickEventHandler Click; public void onClick(EventArgs e) { if (Click != null) { Click(this, e); } } #endregion public PhysioDataConfig() { APhysioParams = new PointPairList(); className = this.GetType().Name.ToString(); } /// /// 包含增加和删除,当插入位置已有生理数据时,执行删除 /// /// public void AddOrDelItem(PhysioData pd, int collectInterval) { bool isHave = false; PhysioData curPd = null; foreach (PointPair pptemp in APhysioParams) { PhysioData temp1 = PointPairToPhysioData(pptemp); if (pd.isEquert(temp1) && temp1.Value != Double.MaxValue) { isHave = true; curPd = temp1; break; } } if (isHave) { //DelItem(curPd); } else { AddMultipleItem(pd, pd.RecordTime, collectInterval); //AddItem(pd, true); } } public void AddFillItem(PhysioData pd) { bool isHave = false; foreach (PointPair pptemp in APhysioParams) { PhysioData temp1 = PointPairToPhysioData(pptemp); double yDiff = pd.Value - temp1.Value; TimeSpan ts1 = new TimeSpan(pd.RecordTime.Ticks); TimeSpan ts2 = new TimeSpan(temp1.RecordTime.Ticks); double minDiff = (ts1.Subtract(ts2).TotalMinutes); if (-2 < minDiff && minDiff < 2 && temp1.Value != Double.MaxValue) { isHave = true; break; } } if (!isHave) { //如果是负数则不执行操作 if (pd.Value < 0) return; //pd = reCnterValue(pd); //增加点时如果当前有点且是隐藏的则直接改值 Sort(); 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(); curve.Points = APhysioParams; PhysioDataService.AddPhysioData(pd); if (showStyle == "显示数值")//|| pd.Value > HighLimit { DrawTextPhysioData(pd); } } } /// /// 增加一点生理数据,往数据库中写入数据 /// /// public void AddItem(PhysioData pd, bool isShouDong = true, bool isFillMissPoint = true) { try { //如果是负数则不执行操作 if (pd.Value < 0) return; if (pdTrue == null) pdTrue = pd.Clone(); if (APhysioParams.Count > 0) { 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(); curve.Points = APhysioParams; PhysioDataService.AddPhysioData(pd); if (showStyle == "显示数值") { 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; } } } catch (Exception) { throw new Exception("插入生理数据结点时出错"); } } /// /// 动态填写对象 /// public AbleEditPackObj phListPack = null; public void setPositionText(PhysioData pdTemp, bool IsNull = false) { if (phListPack != null) { Panel pan3 = phListPack.CControl as Panel; if (pan3 != null) { Control[] cs = pan3.Controls.Find(pdTemp.PhysioDataConfigId + "" + pdTemp.RecordTime.ToString("HHmm"), true); if (cs != null && cs.Length > 0) { TextBox c = cs[0] as TextBox; if (c != null) { if (IsNull == true) { pdTemp.Value = -1; c.Tag = pdTemp; c.Text = ""; } else { string viewValue = ((int)pdTemp.Value).ToString(); if (pdTemp.PhysioDataConfigId == 4) viewValue = Math.Round(pdTemp.Value, 1).ToString(); c.Tag = pdTemp; c.Text = viewValue.ToString(); } } } } } } /// /// 增加一点生理数据,往数据库中写入数据 /// /// public void AddItemByTime(PhysioData pd) { try { //如果是负数则不执行操作 if (pd.Value <= 0) return; bool isHave = false; PhysioData curPd = null; foreach (PointPair pptemp in APhysioParams) { PhysioData temp1 = PointPairToPhysioData(pptemp); if (pd.isEquert(temp1) && temp1.Value != Double.MaxValue) { isHave = true; curPd = temp1; break; } } if (isHave) return; this.APhysioParams.Add(pd); Sort(); curve.Points = APhysioParams; PhysioDataService.AddPhysioData(pd); if (showStyle == "显示数值") { DrawTextPhysioData(pd); } } catch (Exception) { //throw new Exception("插入生理数据结点时出错"); } } /// /// 增加一点生理数据,往数据库中写入数据 /// /// public void AddMultipleItem(PhysioData pd, DateTime endtime, int collectInterval) { try { //如果是负数则不执行操作 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); } } catch (Exception) { throw; } } /// /// 返回当前曲线上最大且不为空的点 /// /// 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; } public void delAddObj(PhysioData newPd) { delAddObj(this.Enname + newPd.RecordTime.ToString()); } public void DrawTextPhysioData(PhysioData pd) { delAddObj(pd); if (pd.RecordTime <= pageEnd && pd.RecordTime >= pageBegin) { //考虑非数字加载 string viewValue = ((int)pd.Y).ToString(); if (Enname == "Temp") viewValue = Math.Round(pd.Y, 1).ToString(); //如果值有效,则写文本 if (pd.Value != Double.MaxValue) { ZUtil.DrawText(viewValue, getXPositinByXDate(pd.RecordTime), showValue, zgcAnas, this.Enname + pd.RecordTime.ToString(), 5f, true); } setPositionText(pd); } } /// /// 仅修改值不修改数据库 /// /// /// /// public PhysioData onlyModItem(PhysioData newPd, PhysioData oldPd = null) { //如果是负数则不执行操作 if (newPd.Value < 0) { //MessageBox.Show("输入的值不能小于0"); return null; } if (curPDIndex != -1) { newPd = reCnterValue(newPd); this.APhysioParams[CurPDIndex].Y = newPd.Y; Sort(); curve.Points = APhysioParams; if (showStyle == "显示数值") { onlyMoveText(newPd, oldPd); } return newPd; } return null; } private void onlyMoveText(PhysioData newPd, PhysioData oldPd = null) { TextObj text = (TextObj)zgcAnas.MasterPane.GraphObjList[this.Enname + ((oldPd == null) ? newPd.RecordTime.ToString() : oldPd.RecordTime.ToString())]; text.Location.Y = showValue; text.Text = ((int)newPd.Value).ToString(); } public void ModItem(PhysioData oldPd, PhysioData newPd) { //如果是负数则不执行操作 if (newPd.Value < 0 && oldPd.PhysioDataConfigId != newPd.PhysioDataConfigId) return; if (curPDIndex != -1) { newPd.RecordTime = oldPd.RecordTime; newPd = reCnterValue(newPd, false); this.APhysioParams[CurPDIndex].Y = newPd.Y; Sort(); curve.Points = APhysioParams; PhysioDataService.UpdatePhysioData(oldPd, newPd, PublicMethod.OperatorName); if (showStyle == "显示数值") { delAddObj(oldPd); DrawTextPhysioData(newPd); } } } public int indexOf(PhysioData pd) { for (int i = 0; i < APhysioParams.Count; i++) { if (pd.isEquert(PointPairToPhysioData(APhysioParams[i]))) { return i; } } return -1; } /// /// 仅画点,不操作数据库 /// /// public void AddPoition(PhysioData pd) { //如果是负数则不执行操作 if (pd.Value < 0) return; //pd.Tag = pd.Id; if (APhysioParams.Count > 0) { 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); } } pd = reCnterValue(pd, false); this.APhysioParams.Add(pd); Sort(); curve.Points = APhysioParams; if (showStyle == "显示数值") { DrawTextPhysioData(pd); } } public void AddText(PhysioData pd) { //如果是负数则不执行操作 if (pd.Value < 0) return; DrawTextPhysioData(pd); } /// /// 控制画点的范围 /// /// 物理点 /// 是否采集 /// 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; } /// /// 返回小于传入点里小于且最接近的点 /// /// 传入点 /// 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; } /// /// 删除一点生理数据 /// /// public void DelItem(PhysioData pd) { try { 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 (showStyle == "显示数值" || pd.Value == HighLimit) { delAddObj(pd); setPositionText(pd, true); } 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; } } } catch (Exception) { throw new Exception("删除生理数据结点时出错"); } } public void DelItems(DateTime RecordTime, DateTime EndTime) { try { PhysioDataService.DelPhysioasDataParameterID(RecordTime, EndTime, this.Id, this.PatientId); } catch (Exception) { throw new Exception("删除生理数据结点时出错"); } } /// /// 为生理数据集合排序 /// public void Sort() { aPhysioDatas.Sort(); } /// /// 画生理曲线,即初始化 /// public void draw(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()); 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; } public PhysioData PointPairToPhysioData(PointPair pp) { if (pp == null) return null; PhysioData pd = new PhysioData(); pd.Value = pp.Y; pd.RecordTime = new XDate(pp.X); pd.PatientId = PatientId; pd.PhysioDataConfigId = Id; return pd; } /// /// 删除麻醉单上的曲线本身,不包含数据删除 /// /// public override void clearAddObj(ZedGraphControl zgc) { if (zgcAnas == null || zgcAnas != zgc) zgcAnas = zgc; if (showStyle == "显示数值") { foreach (PointPair pp in APhysioParams) { PhysioData pd = PointPairToPhysioData(pp); if (pd != null) delAddObj(pd); } } if (APhysioParams == null || curve == null) return; APhysioParams.Clear(); curve.Points = APhysioParams; } /// /// 重新设置曲线属性 /// 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 (showStyle != "显示数值") { foreach (PointPair pp in APhysioParams) { PhysioData pd = PointPairToPhysioData(pp); if (pd != null) delAddObj(pd); } } else { foreach (PointPair pp in APhysioParams) { PhysioData pd = PointPairToPhysioData(pp); if (pd != null) DrawTextPhysioData(pd); } } } /// /// 重新设置曲线属性 /// 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 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 static IList GetLifeList() { string sql = "Select * FROM PhysioDataConfig where ConfigType='生命体征' order by PhysioOrder asc"; return GetListBySql(sql); } public static IList GetAnesList() { string sql = "Select * FROM PhysioDataConfig where ConfigType='麻醉体征' order by PhysioOrder asc"; return GetListBySql(sql); } private static IList GetListBySql(string sql, params SqlParameter[] para) { IList list = new List(); 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"]); list.Add(temp); } reader.Close(); return list; } } 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 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) }; return DBHelper.ExecNonQuery(sql, para); } } }