using Newtonsoft.Json;
using AIMSExtension;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DrawGraph
{
[Serializable, JsonObject(MemberSerialization.OptOut)]
public class OutputManage : AreaManageBase
{
///
/// 药品区域
///
public RectangleFramePackObj sapPpack;
public LinesPackObj lines;
public LinePackObj H3pack;
public LinePackObj H5pack;
public int RowsCount;
///
/// 当前手术对象
///
private OperationRecord myOpeRecord = null;
public List DrugsListstr = new List();
#region 初始化液体区域
public OutputManage()
{
init();
}
public OutputManage(object _operationRecor, DrawGraph.ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
{
init();
}
public void init()
{
//自己要用的手术对象
myOpeRecord = OpeRecord as OperationRecord;
}
///
/// 初始画的后置方法
///
public override void FollowUpMethod()
{
H3pack = template.GetPackObjectOTag("OutputManage_LinePackObj_11");
H5pack = template.GetPackObjectOTag("OutputManage_LinePackObj_5");
sapPpack = template.GetPackObjectOTag("OutputManage_RectangleFramePackObj_10");
lines = template.GetPackObjectOTag("OutputManage_LinesPackObj_15");
RowsCount = Convert.ToInt32(lines.XPageSpan / lines.XMajorGridStep);
}
#endregion
#region 重写的事件
///
/// 鼠标点击画板
///
///
///
public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
{
//if (e.Button == System.Windows.Forms.MouseButtons.Left)
//{
// MessageBox.Show(this.GetType().Name + "is Click Left Button");
//}
}
public override void MouseMove(ZedGraphControl sender, MouseEventArgs e)
{
}
public override void MouseUp(ZedGraphControl sender, MouseEventArgs e)
{
}
public override void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
{
}
public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
{
}
#endregion 重写的事件结束
#region 绑定区域数据
public override void Bind()
{
init();
DrawOutput();
}
///
/// 画加药
///
private void DrawOutput()
{
try
{
foreach (FactOutputLiquids temp in myOpeRecord.FactOutputLiquidsList)
{
temp.clearAddObj(ZedControl);
}
reDrawDrug();
}
catch (Exception exp)
{
PublicMethod.WriteLog(exp);
}
}
///
/// 重新画加药文本
///
private void reDrawDrug()
{
try
{
//画在第几行
int rowDrugsIndex = 0;
//y的高度//主要高度
double drugsy = 0;
//加药最后位置
double maxDrugsy = sapPpack.RealEndY;
//持续加药当前时间
DateTime curTimeTemp = OperationRecord.getOpeMaxTime(myOpeRecord);
DateTime serverTime = DateTime.Now;
if (curTimeTemp > serverTime) curTimeTemp = serverTime;
//超出的药画备注 镇痛药备注
List DrugListstr = new List();
DrugListstr.Add("【出量】");
myOpeRecord.BeforeDrugs = "";
myOpeRecord.AnalgesiaDrug = "";
//当前时间段加药集合
myOpeRecord.FactOutputLiquidsList.ForEach(drug =>
{
if (drug.IsContinue == 1 && drug.BeginTime == drug.EndTime) drug.End = curTimeTemp;
else if (drug.EndTime != null) drug.End = drug.EndTime;
});
List _FactOutputLiquidsList = myOpeRecord.FactOutputLiquidsList.Where(s => IfInTimeExist(s.BeginTime, s.End) == true).ToList();
//加药按加药时间排序
//_FactOutputLiquidsList.Sort(new FactOutputLiquidsComparer());
for (int i = 0; i < _FactOutputLiquidsList.Count; i++)
{
FactOutputLiquids temp = _FactOutputLiquidsList[i];
bool isEqual = false;
bool isChildEqual = false;
//以行号返回具休的位置
drugsy = sapPpack.RealY + getYPositionByListIndex(rowDrugsIndex, sapPpack.RealY, sapPpack.RealEndY, RowsCount);
SetDrug(temp, curTimeTemp, drugsy);
//判断是否重复的 主药或组药
for (int j = 0; j < i; j++)
{
FactOutputLiquids addDrug1 = _FactOutputLiquidsList[j];
//如果加药品ID相同并且加加药ID不同,则认为加了同一种加药
if (addDrug1.Equal(temp))
{
addDrug1.clearDNAndDT(ZedControl);
//因为相同则取得相同对象的Y,为当前的对象的高度
drugsy = addDrug1.nowY;
isEqual = true;
continue;
}
}
if (isChildEqual == true) continue;
if (drugsy <= maxDrugsy)
{
temp.drawText(H3pack.RealX + 0.006f, drugsy);
if (isEqual == false)
rowDrugsIndex++;
}
else
ListAddDrugs(DrugListstr, i, temp);
}
myOpeRecord.OutsListstr = DrugListstr;
DrawOutDose();
}
catch (Exception ex)
{
throw ex;
}
}
private void DrawOutDose()
{
try
{
double allOutDose = 0;
double nlDose = 0;
double sxDose = 0;
myOpeRecord.FactOutputLiquidsList.ForEach(item =>
{
if (item.DosageUnit.Trim() == "mL" || item.DosageUnit.Trim() == "ml" || item.DosageUnit.Trim() == "ML")
{
Double val = Convert.ToDouble(item.Dosage);
allOutDose += val;
if (item.OutputLiquidsName == "尿量")
nlDose += val;
else if (item.OutputLiquidsName == "失血")
sxDose += val;
}
});
template.SetObjValue(myOpeRecord, "OperationRecord.OutAmount", allOutDose.ToString(), allOutDose.ToString(), allOutDose.ToString() != myOpeRecord.OutAmount ? true : false);
string outStr = "";
if (nlDose > 0)
{
outStr += "尿量 " + nlDose + " ml\n";
}
if (sxDose > 0)
{
outStr += "失血 " + sxDose + " ml\n";
}
if (outStr != "")
template.SetObjValue(myOpeRecord, "OperationRecord.Crystal", outStr, outStr, false);
}
catch (Exception ex)
{
PublicMethod.WriteLog(ex);
}
}
private void SetDrug(FactOutputLiquids temp, DateTime curTimeTemp, double y)
{
if (temp.IsContinue == 1 && temp.BeginTime == temp.EndTime) temp.End = curTimeTemp;
temp.EqualDose = null;
temp.setAnasArr(ZedControl, H5pack.RealX, sapPpack.RealEndX, myOpeRecord.PageBegin, myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
temp.nowY = y;
}
private static void ListAddDrugs(List DrugListstr, int i, FactOutputLiquids temp)
{
string dose = "";
if (dose.Trim() != "") dose += " ";
dose += ((double)temp.Dosage).ToString();
if (temp.DosageUnit != null)
{
dose += temp.DosageUnit;
}
DrugListstr.Add(string.Format("({0}){1} {2} {3}{4}{5}", i + 1, (temp.BeginTime == temp.EndTime) ? temp.BeginTime.ToShortTimeString() : temp.BeginTime.ToShortTimeString() + "->" + temp.EndTime.ToShortTimeString(), temp.OutputLiquidsName.Trim(), dose, "", ""));
//DrugListstr.Append(" ");
}
#endregion
#region 当前区域公用事件方法
private bool IfInTimeExist(DateTime Begin, DateTime End)
{
DateTime lastime = myOpeRecord.lastPageBegin.AddSeconds(59);
bool b = false;
if (End == null)
{
if (Begin > myOpeRecord.PageBegin && Begin < lastime)
{
b = true;
}
}
else
{
if (Begin >= myOpeRecord.PageBegin && Begin <= lastime)
{
b = true;
}
else if (End >= myOpeRecord.PageBegin && End <= lastime)
{
b = true;
}
else if (Begin < myOpeRecord.PageBegin && End > lastime)
{
b = true;
}
}
return b;
}
///
/// 根据顶部加药序号,确定数值生命体征的纵向位置(以1为单位)
///
///
///
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
}
}