968 lines
41 KiB
C#
968 lines
41 KiB
C#
using HelperDB;
|
||
using Newtonsoft.Json;
|
||
using AIMSExtension;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Windows.Forms;
|
||
using DevComponents.DotNetBar;
|
||
using System.Xml.Linq;
|
||
|
||
|
||
namespace DrawGraph
|
||
{
|
||
[Serializable, JsonObject(MemberSerialization.OptOut)]
|
||
public class PhysioDataManage : AreaManageBase
|
||
{
|
||
/// <summary>
|
||
/// 监测文本的对象
|
||
/// </summary>
|
||
TextPackObj janCePack = null;
|
||
/// <summary>
|
||
/// 图表的对象
|
||
/// </summary>
|
||
ChartPackObj chartPack = null;
|
||
/// <summary>
|
||
/// 动态填写对象
|
||
/// </summary>
|
||
AbleEditPackObj phListPack = null;
|
||
/// <summary>
|
||
/// 当前选中的生命体征对象 未改变前
|
||
/// </summary>
|
||
private PhysioData CurPhysioData = null;
|
||
/// <summary>
|
||
/// 悬浮选中的生命体征
|
||
/// </summary>
|
||
private PhysioData selPhysioData = null;
|
||
/// <summary>
|
||
/// 当前手术对象
|
||
/// </summary>
|
||
private OperationRecord myOpeRecord = null;
|
||
/// <summary>
|
||
/// 单例悬浮显示 公用
|
||
/// </summary>
|
||
private TipBox aSyncTip = null;
|
||
|
||
|
||
#region 初始化生命体征区域
|
||
public PhysioDataManage()
|
||
{
|
||
init();
|
||
}
|
||
public PhysioDataManage(object _operationRecor, DrawGraph.ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
|
||
{
|
||
init();
|
||
}
|
||
|
||
public void init()
|
||
{
|
||
//监测文本的对象
|
||
janCePack = GetPackObjectOTag("PhysioDataManage_TextPackObj_17") as TextPackObj;
|
||
//图表的对象
|
||
chartPack = GetPackObjectOTag("PhysioDataManage_ChartPackObj_6") as ChartPackObj;
|
||
//动态生命体征填写对象
|
||
phListPack = template.GetPackObjectOTag<AbleEditPackObj>("MonitorManage_AbleEditPackObj_20_OperationRecord_SpareSeven");
|
||
|
||
//自己要用的手术对象
|
||
myOpeRecord = OpeRecord as OperationRecord;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始画的前置方法
|
||
/// </summary>
|
||
public override void PrepositiveMethod()
|
||
{
|
||
//在这里可以初始化时间軕
|
||
List<PackObjBase> AxisList = PackManage.ListPob.Where<PackObjBase>(s => s is XhAxisPackObj || s is Xd2AxisPackObj).ToList<PackObjBase>();
|
||
foreach (PackObjBase pack in AxisList)
|
||
{
|
||
AkxisPackObj axis = pack as AkxisPackObj;
|
||
if (axis != null)
|
||
{
|
||
DateTime dt = DateTime.Now.AddMinutes(-DateTime.Now.Minute).AddMinutes(15).AddSeconds(-DateTime.Now.Second).AddMilliseconds(-DateTime.Now.Millisecond);
|
||
axis.BeginTime = dt;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始画的后置方法
|
||
/// </summary>
|
||
public override void FollowUpMethod()
|
||
{
|
||
init();
|
||
initLegend(ZedControl.GraphPane);
|
||
initChart(ZedControl.GraphPane);
|
||
}
|
||
|
||
public override void clearSelectCouve_Click()
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig != null && myOpeRecord.SelPhysioConfig.IsClick == true)
|
||
{
|
||
System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show("是否删除当前选项的所有数据?", "系统提示", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information);
|
||
if (dr == System.Windows.Forms.DialogResult.Yes)
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig.ShowText == true)
|
||
{
|
||
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
|
||
{
|
||
PhysioData pd = myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp);
|
||
if (pd != null)
|
||
myOpeRecord.SelPhysioConfig.delAddObj(pd);
|
||
}
|
||
}
|
||
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
|
||
{
|
||
PhysioData pd = myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp);
|
||
if (pd != null && pd.Value == myOpeRecord.SelPhysioConfig.HighLimit)
|
||
myOpeRecord.SelPhysioConfig.delAddObj(pd);
|
||
}
|
||
|
||
myOpeRecord.SelPhysioConfig.DelItems(myOpeRecord.pageBegin, myOpeRecord.lastPageBegin);
|
||
myOpeRecord.SelPhysioConfig.clearAddObj(ZedControl);
|
||
|
||
|
||
ZedControl.Refresh();
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 重写的事件
|
||
/// <summary>
|
||
/// 鼠标点击画板
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
|
||
{
|
||
if (myOpeRecord != null)
|
||
{
|
||
if (e.Button != System.Windows.Forms.MouseButtons.Left) return;
|
||
//清空选中框
|
||
myOpeRecord.SAreaObj.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
|
||
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
|
||
myOpeRecord.SAreaObj.Clear();
|
||
|
||
//触发可编辑区域的事件
|
||
double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(ZedControl.Height));
|
||
double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(ZedControl.Width));
|
||
ZedGraphControl sender1 = sender as ZedGraphControl;
|
||
|
||
PointF mousePt = new PointF(e.X, e.Y);
|
||
GraphPane pane = sender1.MasterPane.FindChartRect(mousePt);
|
||
//如果在图例范围内
|
||
if (isLegendArea(sender1, mousePt))
|
||
{
|
||
//取得点击位置图例的中文
|
||
PhysioDataConfig appTemp = reClickParamName(sender1, mousePt);
|
||
if (appTemp != null)
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig == null)
|
||
{
|
||
appTemp.IsClick = true;
|
||
myOpeRecord.SelPhysioConfig = appTemp;
|
||
myOpeRecord.SelPhysioConfig.PatientId = myOpeRecord.Id.Value;
|
||
myOpeRecord.SelPhysioConfig.onClick(e);
|
||
}
|
||
else
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig.Name == appTemp.Name)
|
||
{
|
||
myOpeRecord.SelPhysioConfig.IsClick = false;
|
||
myOpeRecord.SelPhysioConfig.onClick(e);
|
||
myOpeRecord.SelPhysioConfig = null;
|
||
}
|
||
else
|
||
{
|
||
myOpeRecord.SelPhysioConfig.IsClick = false;
|
||
myOpeRecord.SelPhysioConfig.onClick(e);
|
||
appTemp.IsClick = true;
|
||
myOpeRecord.SelPhysioConfig = appTemp;
|
||
myOpeRecord.SelPhysioConfig.PatientId = myOpeRecord.Id.Value;
|
||
myOpeRecord.SelPhysioConfig.onClick(e);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//如果点击在麻醉单子范围内
|
||
if (pane != null)
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig != null && myOpeRecord.SelPhysioConfig.IsClick)
|
||
{
|
||
bool isHave = false;
|
||
|
||
PhysioData pdTemp = rePD(sender, e);
|
||
if (pdTemp == null) return;
|
||
|
||
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
|
||
{
|
||
if (pdTemp.isEquert(myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp)) && myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp).Value != Double.MaxValue)
|
||
{
|
||
isHave = true;
|
||
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
|
||
{
|
||
CurPhysioData = myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp);
|
||
|
||
AnesOpeStatue = DoAnesOpeStatus.MOVEPD;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (!isHave)
|
||
{
|
||
AnesOpeStatue = DoAnesOpeStatus.ADDPD;
|
||
DateTime insTime = GetRecordTime(pdTemp.RecordTime);
|
||
myOpeRecord.SelPhysioConfig.AddMultipleItem(pdTemp, insTime, collectInterval);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
|
||
{
|
||
PhysioData pdTemp = rePD(sender, e);
|
||
if (pdTemp == null) return;
|
||
AnesOpeStatue = DoAnesOpeStatus.SelectArea;
|
||
myOpeRecord.SAreaObj.StartPD = pdTemp;
|
||
myOpeRecord.SAreaObj.StartPDs = rePDs(sender, e);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!isLegendArea(sender1, mousePt) && pane == null)
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig != null)
|
||
{
|
||
myOpeRecord.SelPhysioConfig.IsClick = false;
|
||
myOpeRecord.SelPhysioConfig.onClick(e);
|
||
myOpeRecord.SelPhysioConfig = null;
|
||
}
|
||
}
|
||
}
|
||
ZedControl.AxisChange();
|
||
ZedControl.Refresh();
|
||
}
|
||
public override void MouseMove(ZedGraphControl sender, MouseEventArgs e)
|
||
{
|
||
double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(sender.Width));
|
||
double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(sender.Height));
|
||
double yP = 18 / Convert.ToDouble(sender.Height);
|
||
string viewStr = "";
|
||
PointF mousePt = new PointF(e.X, e.Y);
|
||
GraphPane pane = sender.MasterPane.FindChartRect(mousePt);
|
||
if (pane != null && aSyncTip != null)
|
||
{
|
||
List<PhysioData> pdNew = rePDs(sender, e);
|
||
|
||
if (pdNew != null && myOpeRecord != null)
|
||
{
|
||
PhysioData pdTrue = null;
|
||
foreach (var item in pdNew)
|
||
{
|
||
pdTrue = GetPDOfPhysioParams(item);
|
||
if (pdTrue != null)
|
||
{
|
||
string Name = pdTrue.config.Name;
|
||
if (pdTrue.config.Unit != null && pdTrue.config.Unit != "") Name += "(" + pdTrue.config.Unit + ")";
|
||
string value = pdTrue.config.Name == "体温" ? ((float)pdTrue.Value).ToString() : Math.Round(pdNew[0].Value, 0).ToString();
|
||
viewStr = Name + ":" + value + "\n时间:" + pdTrue.RecordTime.ToShortTimeString();
|
||
break;
|
||
}
|
||
}
|
||
if (viewStr == "" && pdNew.Count > 0)
|
||
{
|
||
viewStr = "值:" + Math.Round(pdNew[0].Value, 0).ToString() + "\n时间:" + pdNew[0].RecordTime.ToShortTimeString();
|
||
}
|
||
}
|
||
aSyncTip.ViewStr = viewStr;
|
||
aSyncTip.Show(x, (y + yP));
|
||
}
|
||
//考虑客户端拖拽数据库处理不及时 可以采用批量缓存新增修改的数据点集中处理
|
||
if (AnesOpeStatue == DoAnesOpeStatus.MOVEPD || AnesOpeStatue == DoAnesOpeStatus.ADDPD)
|
||
{
|
||
if (myOpeRecord.SelPhysioConfig != null)
|
||
{
|
||
PhysioData pdTemp = rePD(sender, e);
|
||
if (pdTemp == null) return;
|
||
bool isHave = false;
|
||
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
|
||
{
|
||
if (pdTemp.isEquert(myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp)) && myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp).Value != Double.MaxValue)
|
||
{
|
||
isHave = true;
|
||
}
|
||
}
|
||
if (!isHave)
|
||
{
|
||
AnesOpeStatue = DoAnesOpeStatus.ADDPD;
|
||
DateTime insTime = GetRecordTime(pdTemp.RecordTime);
|
||
pdTemp.RecordTime = insTime;
|
||
myOpeRecord.SelPhysioConfig.AddPointItem(pdTemp);
|
||
ZedControl.AxisChange();
|
||
ZedControl.Refresh();
|
||
}
|
||
else
|
||
{
|
||
PhysioData newPd = myOpeRecord.SelPhysioConfig.MoveItem(pdTemp);
|
||
if (newPd != null)//&& CurPhysioData.Value != newPd.Value
|
||
{
|
||
CurPhysioData = newPd;
|
||
myOpeRecord.SelPhysioConfig.ModifyItem(CurPhysioData, CurPhysioData);
|
||
ZedControl.AxisChange();
|
||
ZedControl.Refresh();
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (AnesOpeStatue == DoAnesOpeStatus.SelectArea)
|
||
{
|
||
try
|
||
{
|
||
PhysioData pdNew = rePD(sender, e);
|
||
if (pdNew == null) return;
|
||
if (AnesOpeStatue == DoAnesOpeStatus.SelectArea)
|
||
{
|
||
myOpeRecord.SAreaObj.EndPd = pdNew;
|
||
myOpeRecord.SAreaObj.EndPds = rePDs(sender, e);
|
||
myOpeRecord.SAreaObj.Draw();
|
||
}
|
||
}
|
||
catch { return; }
|
||
finally
|
||
{
|
||
ZedControl.AxisChange();
|
||
ZedControl.Refresh();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
public override void MouseUp(ZedGraphControl sender, MouseEventArgs e)
|
||
{
|
||
if (OpeRecord == null) return;
|
||
double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(ZedControl.Height));
|
||
double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(ZedControl.Width));
|
||
|
||
if (myOpeRecord.SelPhysioConfig != null && myOpeRecord.SelPhysioConfig.IsClick == true)
|
||
{
|
||
PhysioData pdNew = rePD(sender, e);
|
||
if (pdNew == null) return;
|
||
if (AnesOpeStatue == DoAnesOpeStatus.MOVEPD)
|
||
{
|
||
if (CurPhysioData.RecordTime == pdNew.RecordTime)
|
||
myOpeRecord.SelPhysioConfig.ModifyItem(CurPhysioData, pdNew);
|
||
CurPhysioData = null;
|
||
}
|
||
|
||
AnesOpeStatue = DoAnesOpeStatus.VIEW;
|
||
ZedControl.AxisChange();
|
||
ZedControl.Refresh();
|
||
}
|
||
else
|
||
{
|
||
if (AnesOpeStatue == DoAnesOpeStatus.SelectArea)
|
||
{
|
||
AnesOpeStatue = DoAnesOpeStatus.VIEW;
|
||
}
|
||
}
|
||
|
||
return;
|
||
}
|
||
public override void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
|
||
{
|
||
if (myOpeRecord == null) return;//|| IsReadOnly == true
|
||
//只有鼠标左键双击才有效
|
||
if (e.Button == System.Windows.Forms.MouseButtons.Left && e.Clicks == 2)
|
||
{
|
||
if ((AnesOpeStatue == DoAnesOpeStatus.VIEW || AnesOpeStatue == DoAnesOpeStatus.SelectArea) && myOpeRecord.SelPhysioConfig == null)
|
||
{
|
||
List<PhysioData> pdTemps = rePDs(sender as ZedGraphControl, e);
|
||
if (pdTemps != null)
|
||
{
|
||
foreach (var pdTemp in pdTemps)
|
||
{
|
||
PhysioData pdTrue = GetPDOfPhysioParams(pdTemp);
|
||
if (pdTrue != null)
|
||
{
|
||
pdTrue.config.DelItem(pdTrue);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
|
||
{
|
||
if (e.KeyCode == Keys.Delete)
|
||
{
|
||
if (myOpeRecord != null)
|
||
{
|
||
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
|
||
{
|
||
if (myOpeRecord.SAreaObj.Selected)
|
||
{
|
||
double startValue = myOpeRecord.SAreaObj.EndPd.Value;
|
||
double endValue = myOpeRecord.SAreaObj.StartPD.Value;
|
||
foreach (var item in myOpeRecord.SAreaObj.EndPds)
|
||
{
|
||
if (item.Value < startValue)
|
||
{
|
||
startValue = item.Value;
|
||
}
|
||
}
|
||
foreach (var item in myOpeRecord.SAreaObj.StartPDs)
|
||
{
|
||
if (item.Value > endValue)
|
||
{
|
||
endValue = item.Value;
|
||
}
|
||
}
|
||
|
||
List<int> pdTemps = SelectPhysioDataByID(myOpeRecord.Id.Value,
|
||
myOpeRecord.SAreaObj.StartPD.RecordTime,
|
||
myOpeRecord.SAreaObj.EndPd.RecordTime,
|
||
startValue, endValue);
|
||
|
||
List<PhysioDataConfig> selparameters = new List<PhysioDataConfig>();
|
||
foreach (PhysioDataConfig addPP in myOpeRecord.PhysioConfigList)
|
||
{
|
||
bool istrue = false;
|
||
foreach (int item in pdTemps)
|
||
{
|
||
if (item == addPP.Id)
|
||
{
|
||
istrue = true;
|
||
break;
|
||
}
|
||
}
|
||
if (istrue == true)
|
||
selparameters.Add(addPP);
|
||
}
|
||
if (selparameters.Count <= 0) return;
|
||
|
||
DeletePhysios frm = new DeletePhysios(myOpeRecord.Id.Value,
|
||
myOpeRecord.SAreaObj.StartPD.RecordTime,
|
||
myOpeRecord.SAreaObj.EndPd.RecordTime,
|
||
startValue, endValue);
|
||
frm.selparameters = selparameters;
|
||
frm.FormClosed += (a, b) =>
|
||
{
|
||
if (frm.isDelete == true)
|
||
{
|
||
myOpeRecord.SAreaObj.Clear();
|
||
|
||
template.Bind("MonitorManage");
|
||
ZedControl.Refresh();
|
||
}
|
||
else
|
||
{
|
||
myOpeRecord.SAreaObj.Clear();
|
||
}
|
||
};
|
||
frm.ShowDialog();
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endregion 重写的事件结束
|
||
|
||
#region 绑定区域数据
|
||
public override void initChart()
|
||
{
|
||
initChart(ZedControl.GraphPane);
|
||
}
|
||
public override void Bind()
|
||
{
|
||
init();
|
||
InitPhysioDataConfigList(myOpeRecord.PhysioConfigList);
|
||
//悬浮tip初始化
|
||
aSyncTip = TipBox.CreateInstance("async");
|
||
aSyncTip.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin, myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
|
||
|
||
myOpeRecord.SAreaObj.maxnumber = ZedControl.GraphPane.YAxis.Scale.Max;
|
||
myOpeRecord.SAreaObj.minnumber = ZedControl.GraphPane.YAxis.Scale.Min;
|
||
|
||
//DrawPhysioData();
|
||
|
||
myOpeRecord.SelPhysioConfig = null;
|
||
CurPhysioData = null;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 初始化标题,图注和图表
|
||
/// <summary>
|
||
/// 定义图注释位置
|
||
/// </summary>
|
||
/// <param name="myPane"></param>
|
||
private void initLegend(GraphPane myPane)
|
||
{
|
||
Legend legend = myPane.Legend;
|
||
legend.IsVisible = true;
|
||
legend.Position = LegendPos.Float;//定位图标位置
|
||
legend.Location = new Location(janCePack.RealX, janCePack.RealEndY - 0.02, CoordType.PaneFraction);
|
||
legend.Border.Width = 0;
|
||
legend.Border.IsVisible = false; //不显示图标外边框
|
||
legend.Gap = 2.0f;
|
||
legend.IsHStack = false;
|
||
legend.FontSpec.Size = 7f;
|
||
legend.FontSpec.Fill.IsVisible = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将坐标数值对加到相应的曲线上,从而初始化曲线Chart
|
||
/// </summary>
|
||
/// <param name="addPhysioList"></param>
|
||
private void InitPhysioDataConfigList(List<PhysioDataConfig> addPhysioList)
|
||
{
|
||
try
|
||
{
|
||
if (janCePack == null) return;
|
||
int YRows = 0;
|
||
addPhysioList.Clear();
|
||
ZedControl.GraphPane.CurveList.Clear();
|
||
//监测区域里的第1根竖线,显示数值时用
|
||
LinesPackObj pack = template.GetPackObjectOTag<LinesPackObj>("MonitorManage_LinesPackObj_9");
|
||
int RowsCount = 0;
|
||
if (pack != null)
|
||
RowsCount = Convert.ToInt32(pack.XPageSpan / pack.XMajorGridStep);
|
||
|
||
//加载生命体征图标
|
||
IList<PhysioDataConfig> dt = PhysioDataConfig.GetLifeList();
|
||
int rowNum = 1;
|
||
for (int i = 0; i < dt.Count; i++)
|
||
{
|
||
PhysioDataConfig pp = dt[i];
|
||
pp.ConfigType = "生命体征";
|
||
pp.Click += new PhysioDataConfig.ClickEventHandler(pp_Click);
|
||
string[] str = pp.Color.Split('.');
|
||
int A = int.Parse(str[0].ToString());
|
||
int R = int.Parse(str[1].ToString());
|
||
int G = int.Parse(str[2].ToString());
|
||
int B = int.Parse(str[3].ToString());
|
||
pp.ConveColor = System.Drawing.Color.FromArgb(A, R, G, B);
|
||
|
||
pp.IsValid = true;
|
||
if (pp.IsDefalultShow == false || (pp.ShowImg == false && pp.ShowText == false))
|
||
{
|
||
pp.IsValid = false;
|
||
}
|
||
pp.ClearTagstr(ZedControl);
|
||
//如果模板管理不为空
|
||
if (pack != null && rowNum < 5 && pp.ShowText == true)
|
||
{
|
||
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
|
||
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname, 5.5f);
|
||
pp.YLocation = y + 0.002;
|
||
YRows++;
|
||
rowNum++;
|
||
}
|
||
pp.phListPack = phListPack;
|
||
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
|
||
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
|
||
bool isHave = false;
|
||
foreach (PhysioDataConfig appTemp in addPhysioList)
|
||
{
|
||
if (appTemp.Name.Equals(pp.Name))
|
||
{
|
||
isHave = true;
|
||
}
|
||
}
|
||
if (!isHave)
|
||
{
|
||
addPhysioList.Add(pp);
|
||
pp.initCurve();
|
||
pp_Click(pp, null);
|
||
}
|
||
}
|
||
if (pack != null)
|
||
{
|
||
myOpeRecord.PhysioAnesConfigList.Clear();
|
||
IList<PhysioDataConfig> dt2 = PhysioDataConfig.GetAnesList();
|
||
for (int i = 0; i < dt2.Count; i++)
|
||
{
|
||
PhysioDataConfig pp = dt2[i];
|
||
pp.ConfigType = "麻醉体征";
|
||
if (pp.IsDefalultShow == false)
|
||
{
|
||
pp.IsValid = false;
|
||
}
|
||
else
|
||
{
|
||
pp.IsValid = true;
|
||
}
|
||
pp.phListPack = phListPack;
|
||
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
|
||
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
|
||
pp.ClearTagstr(ZedControl);
|
||
if (rowNum < 5)
|
||
{
|
||
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
|
||
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname + pp.Id, 5.5f);
|
||
pp.YLocation = y + 0.002;
|
||
YRows++;
|
||
rowNum++;
|
||
}
|
||
myOpeRecord.PhysioAnesConfigList.Add(pp);
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
//异常处理保存
|
||
throw ex;
|
||
}
|
||
}
|
||
public void pp_Click(object sender, EventArgs e)
|
||
{
|
||
PhysioDataConfig app = (PhysioDataConfig)sender;
|
||
if (app.IsClick)
|
||
{
|
||
app.curve.Label.FontSpec = new FontSpec("微软雅黑", 5.9f, Color.Red, true, false, true);
|
||
app.curve.Label.FontSpec.Border.IsVisible = false;
|
||
app.curve.Label.FontSpec.Fill.IsVisible = false;
|
||
}
|
||
else
|
||
{
|
||
app.curve.Label.FontSpec = new FontSpec("微软雅黑", 5.8f, Color.Black, false, false, false);
|
||
app.curve.Label.FontSpec.Border.IsVisible = false;
|
||
app.curve.Label.FontSpec.Fill.IsVisible = false;
|
||
}
|
||
}
|
||
|
||
public override void frmInstance_ConfigParam()
|
||
{
|
||
//既然是全局变量,并且在初始化的时候已经定义过了,为什么在此还要重新定义呢?
|
||
//原因:正是因为xmlOpe是全局变量,因此,在整个窗体生命周期都没有发生改变。
|
||
//即在该段时间内驻留内存,及时其他窗体将其信息改变,其操作的XML内容仍然不变。
|
||
//解决办法:重新定义,使XML操作对象发生变化。
|
||
int YRows = 0;
|
||
//监测区域里的第1根竖线,显示数值时用
|
||
LinesPackObj pack = template.GetPackObjectOTag<LinesPackObj>("MonitorManage_LinesPackObj_9");
|
||
|
||
int RowsCount = Convert.ToInt32(pack.XPageSpan / pack.XMajorGridStep);
|
||
int rowNum = 1;
|
||
foreach (var pp in myOpeRecord.PhysioConfigList)
|
||
{
|
||
pp.ConfigType = "生命体征";
|
||
string[] str = pp.Color.Split('.');
|
||
int A = int.Parse(str[0].ToString());
|
||
int R = int.Parse(str[1].ToString());
|
||
int G = int.Parse(str[2].ToString());
|
||
int B = int.Parse(str[3].ToString());
|
||
pp.ConveColor = System.Drawing.Color.FromArgb(A, R, G, B);
|
||
|
||
pp.IsValid = true;
|
||
if (pp.IsDefalultShow == false || (pp.ShowImg == false && pp.ShowText == false))
|
||
{
|
||
pp.IsValid = false;
|
||
}
|
||
|
||
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
|
||
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
|
||
pp.ClearTagstr(ZedControl);
|
||
//如果模板管理不为空
|
||
if (pack != null && rowNum < 5 && pp.ShowText == true)
|
||
{
|
||
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
|
||
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname, 5.5f);
|
||
pp.YLocation = y + 0.002;
|
||
YRows++;
|
||
rowNum++;
|
||
}
|
||
|
||
//重新设置曲线属性
|
||
pp.reSetCurve();
|
||
break;
|
||
}
|
||
if (pack != null)
|
||
{
|
||
foreach (var pp in myOpeRecord.PhysioConfigList)
|
||
{
|
||
pp.ConfigType = "麻醉体征";
|
||
pp.IsValid = true;
|
||
if (pp.IsDefalultShow == false)
|
||
{
|
||
pp.IsValid = false;
|
||
}
|
||
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
|
||
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
|
||
pp.ClearTagstr(ZedControl);
|
||
if (pp.ShowText == true && rowNum < 5)
|
||
{
|
||
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
|
||
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname + pp.Id, 5.5f);
|
||
pp.YLocation = y + 0.002;
|
||
YRows++;
|
||
rowNum++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 设置采集Chart区域的位置
|
||
/// <summary>
|
||
/// 设置采集Chart区域的位置
|
||
/// </summary>
|
||
/// <param name="myPane"></param>
|
||
private void initChart(GraphPane myPane)
|
||
{
|
||
Chart chart = myPane.Chart;
|
||
chart.Fill = new Fill(System.Drawing.Color.White);
|
||
chart.Border.Width = 0.0f;
|
||
chart.IsRectAuto = true;
|
||
float cLeft = (float)(myPane.Rect.Width * chartPack.RealX);
|
||
float cTop = (float)(myPane.Rect.Height * (chartPack.RealY));
|
||
float cWidth = (float)(myPane.Rect.Width * (chartPack.RealEndX - chartPack.RealX));
|
||
float cHeight = (float)(myPane.Rect.Height * (chartPack.RealEndY - chartPack.RealY));
|
||
chart.Rect = new System.Drawing.RectangleF(cLeft, cTop, cWidth, cHeight); //设定中间的图像显示区域chart.Rect = {X = 120.0 Y = 304.5 Width = 576.0 Height = 375.55}
|
||
|
||
myPane.XAxis.MajorGrid.Color = System.Drawing.Color.Black; //大跨度网格颜色
|
||
}
|
||
#endregion
|
||
|
||
#region 点击编辑区域后的事件方法
|
||
/// <summary>
|
||
/// 响应可编辑区域的点击事件
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
public override void editAr_Click(object sender, EventArgs e)
|
||
{
|
||
}
|
||
#endregion
|
||
|
||
#region 当前区域公用事件方法
|
||
|
||
/// <summary>
|
||
/// 从所有曲线里得到相应的点
|
||
/// </summary>
|
||
/// <param name="pdTemp">要查找的物理点</param>
|
||
private PhysioData GetPDOfPhysioParams(PhysioData pdTemp)
|
||
{
|
||
selPhysioData = null;
|
||
foreach (PhysioDataConfig ppter in myOpeRecord.PhysioConfigList)
|
||
{
|
||
if (pdTemp.config.YAisx != ppter.YAisx) continue;
|
||
foreach (PointPair pp in ppter.APhysioParams)
|
||
{
|
||
selPhysioData = ppter.PointPairToPhysioData(pp);
|
||
if (pdTemp.isEquertTrue(selPhysioData, collectInterval.ToString()))
|
||
{
|
||
selPhysioData.config = ppter;
|
||
selPhysioData.PatientId = myOpeRecord.Id.Value;
|
||
selPhysioData.PhysioDataConfigId = ppter.Id;
|
||
return selPhysioData;
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
/// <summary>
|
||
/// 得到生命特征泛型集合
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
/// <returns></returns>
|
||
private List<PhysioData> rePDs(ZedGraphControl sender, MouseEventArgs e)
|
||
{
|
||
List<PhysioData> pdNews = new List<PhysioData>();
|
||
try
|
||
{
|
||
double x, x2;
|
||
double[] y;
|
||
double[] y2;
|
||
|
||
PointF mousePt = new PointF(e.X, e.Y);
|
||
|
||
ZedGraphControl sender1 = sender as ZedGraphControl;
|
||
GraphPane pane = sender1.MasterPane.FindChartRect(mousePt);
|
||
if (pane != null)
|
||
{
|
||
pane.ReverseTransform(mousePt, out x, out x2, out y, out y2);
|
||
XDate xd = new XDate(x);
|
||
|
||
PhysioDataConfig physioParam = null;
|
||
if (myOpeRecord.SelPhysioConfig == null)
|
||
physioParam = myOpeRecord.PhysioConfigList[1];
|
||
else
|
||
physioParam = myOpeRecord.SelPhysioConfig;
|
||
double value = Math.Round(y[physioParam.YAisx], 0);
|
||
pdNews.Add(PhysioDataConfig.newPhysioData(physioParam, myOpeRecord.Id.Value, xd.DateTime, value));
|
||
|
||
if (y[1].ToString() != "")
|
||
{
|
||
value = Math.Round(y[physioParam.YAisx], 0);
|
||
pdNews.Add(PhysioDataConfig.newPhysioData(myOpeRecord.PhysioConfigList.Where(a => a.Name == "氧饱和度").ToList()[0], myOpeRecord.Id.Value, xd.DateTime, value));
|
||
}
|
||
if (y[0].ToString() != "")
|
||
{
|
||
value = Math.Round(y[physioParam.YAisx], 1);
|
||
pdNews.Add(PhysioDataConfig.newPhysioData(myOpeRecord.PhysioConfigList.Where(a => a.Name == "体温").ToList()[0], myOpeRecord.Id.Value, xd.DateTime, value));
|
||
}
|
||
|
||
}
|
||
return pdNews;
|
||
}
|
||
catch (Exception)
|
||
{
|
||
return pdNews;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 得到单生命特征对象
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e">点击鼠标事件的参数</param>
|
||
/// <returns></returns>
|
||
private PhysioData rePD(ZedGraphControl sender, MouseEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
if (ZedControl == null) return null;
|
||
|
||
double x, x2;
|
||
double[] y;
|
||
double[] y2;
|
||
|
||
PointF mousePt = new PointF(e.X, e.Y);
|
||
|
||
GraphPane pane = ZedControl.MasterPane.FindChartRect(mousePt);
|
||
if (pane == null) return null;
|
||
pane.ReverseTransform(mousePt, out x, out x2, out y, out y2);
|
||
XDate xd = new XDate(x);
|
||
|
||
PhysioDataConfig physioParam = null;
|
||
if (myOpeRecord.SelPhysioConfig == null)
|
||
{
|
||
physioParam = myOpeRecord.PhysioConfigList[1];
|
||
}
|
||
else
|
||
{
|
||
physioParam = myOpeRecord.SelPhysioConfig;
|
||
}
|
||
double value = physioParam.YAisx == 1 ? Math.Round(y[physioParam.YAisx], 1) : Math.Round(y[physioParam.YAisx], 0);
|
||
PhysioData pdNew = PhysioDataConfig.newPhysioData(physioParam, myOpeRecord.Id.Value, xd.DateTime, value);
|
||
|
||
return pdNew;
|
||
}
|
||
catch (Exception)
|
||
{
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 返回控件的点击的Legend的图例文本
|
||
/// </summary>
|
||
/// <param name="zgc"></param>
|
||
/// <param name="mousePt"></param>
|
||
/// <returns></returns>
|
||
private PhysioDataConfig reClickParamName(ZedGraphControl zgc, PointF mousePt)
|
||
{
|
||
PhysioDataConfig appTemp = null;
|
||
Graphics g = zgc.CreateGraphics();
|
||
GraphPane myPane = new GraphPane();
|
||
object nearestObj;
|
||
int ipt;
|
||
zgc.MasterPane.FindNearestPaneObject(mousePt, g, out myPane, out nearestObj, out ipt);
|
||
if (nearestObj is Legend)
|
||
{
|
||
foreach (PhysioDataConfig Temp in myOpeRecord.PhysioConfigList)
|
||
{
|
||
if (myPane.CurveList[ipt].Tag.ToString().IndexOf(Temp.Name) >= 0)
|
||
{
|
||
appTemp = Temp;
|
||
}
|
||
}
|
||
}
|
||
return appTemp;
|
||
}
|
||
/// <summary>
|
||
/// 点击时是否在图例范围内
|
||
/// </summary>
|
||
/// <param name="zgc"></param>
|
||
/// <param name="mousePt"></param>
|
||
/// <returns></returns>
|
||
private bool isLegendArea(ZedGraphControl zgc, PointF mousePt)
|
||
{
|
||
Graphics g = zgc.CreateGraphics();
|
||
GraphPane myPane = new GraphPane();
|
||
object nearestObj;
|
||
int ipt;
|
||
zgc.MasterPane.FindNearestPaneObject(mousePt, g, out myPane, out nearestObj, out ipt);
|
||
if (nearestObj is Legend)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
/// <summary>
|
||
/// 根据顶部加药序号,确定数值生命体征的纵向位置(以1为单位)
|
||
/// </summary>
|
||
/// <param name="index"></param>
|
||
/// <returns></returns>
|
||
public double getYPositionByListIndex(double index, double yTop, double yBottom, int rowCount)
|
||
{
|
||
double heightT = ZedControl.Height * (yBottom - yTop);
|
||
double setpTemp = heightT / rowCount;
|
||
//求一格在实际高度中的百分比
|
||
double bfb = (setpTemp / heightT);
|
||
//两线之间度*百分比得到一格的百分比高度
|
||
double ygBFB = (yBottom - yTop) * bfb;
|
||
double y = ygBFB * index;
|
||
return y;
|
||
}
|
||
#endregion
|
||
|
||
public DataTable getByOpeIDIsPhysioData(int operationId)
|
||
{
|
||
string sqlStr = "SELECT [PhysioDataConfig].Name , PhysioData.RecordTime, PhysioData.[Value] FROM [dbo].[PhysioDataConfig] INNER JOIN PhysioData ON [PhysioDataConfig].Id = PhysioData.PhysioDataConfigId where PatientId = " + operationId + " order by PhysioDataConfigId,PhysioData.RecordTime ASC";
|
||
return DBHelper.GetDataTable(sqlStr);
|
||
}
|
||
public List<int> SelectPhysioDataByID(int operationId, DateTime startTime, DateTime endTime, double startValue, double endValue)
|
||
{
|
||
List<int> PhysioDatas = new List<int>();
|
||
string sqlStr = "select * FROM PhysioData where PatientId = " + operationId + " and [RecordTime] >='" + startTime + "' and [RecordTime] <='" + endTime + "'";// and [Value] >='" + startValue + "' and [Value] <='" + endValue + "'
|
||
DataTable dt = DBHelper.GetDataTable(sqlStr);
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
double value = -1;
|
||
if (double.TryParse(dr["Value"].ToString(), out value))
|
||
{
|
||
if (value >= startValue && value <= endValue)
|
||
{
|
||
int PhysioDataConfigId = int.Parse(dr["PhysioDataConfigId"].ToString());
|
||
if (!PhysioDatas.Contains(PhysioDataConfigId))
|
||
PhysioDatas.Add(PhysioDataConfigId);
|
||
}
|
||
}
|
||
}
|
||
return PhysioDatas;
|
||
}
|
||
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++)
|
||
{
|
||
DateTime tempTime = myOpeRecord.InRoomTime.Value.AddMinutes(i * 5);
|
||
if (tempTime >= result)
|
||
{
|
||
result = tempTime;
|
||
break;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
}
|
||
}
|