You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
klhis/hcemr_new/emrShowPage.html

729 lines
30 KiB

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HCEmrViewLib Demo</title>
<script type="text/javascript" src="./HCEmrViewLib.min.js?v=6"></script>
<script type="text/javascript" src="./WatEvent.js?v=48"></script>
<script type="text/javascript">
var TItemStyle = {
Null: -1,
Image: -2, // 图片
Table: -3, // 表格
Tab: -4, // TAB键
Line: -5, // 直线
Express: -6, // 公式
Vector: -7, // 矢量图
Domain: -8, // 域
PageBreak: -9, // 分页
CheckBox: -10, // 勾选框
Gif: -11, // GIF动画
Control: -12, // 控件
Edit: -13, // Edit 文本框
Combobox: -14, // Combobox 下拉弹出框
QRCode: -15, // 二维码
BarCode: -16, // 一维码
Fraction: -17, // 分数
DateTimePicker: -18, // 日期时间控件
RadioGroup: -19, // RadioGroup 单选、多选控件
SupSubScript: -20, // 同时上下标
Button: -21, // 按钮控件
FloatLine: -101, // 浮动直线
FloatBarCode: -102, // 浮动一维码
Custom: -1000
}
// 数据元属性
var TDeProp = {
Index: "Index", // 唯一索引
Code: "Code", // 编码
Name: "Name", // 名称
Frmtp: "Frmtp", // 类别,见TDeFrmtp枚举
Unit: "Unit", // 单位
HideUnit: "HdUnit", // 是否隐藏单位,比如血压的收缩压不显示单位
PreFormat: "PRFMT", // 表示格式
Raw: "Raw", // 原始数据
CMV: "CMV", // 受控词汇表(值域代码)
CMVVCode: "CMVVCode", // 受控词汇编码(值编码)
Trace: "Trace", // 痕迹信息
Secret: "Secret", // 是否属于隐私信息
ItemEditValue: "EdtVal" // 选项值直接编辑,不通过弹出框处理
}
// 数据元类型
var TDeFrmtp = {
Radio: "RS", // 单选
Multiselect: "MS", // 多选
Number: "N", // 数值
String: "S", // 文本
Date: "D", // 日期
Time: "T", // 时间
DateTime: "DT" // 日期和时间
}
// 痕迹样式
var TDeTraceStyle = {
None: 0, // 无
Del: 1, // 删除
Add: 2 // 添加
}
var TGroupProp = {
Index: "Index",
Name: "Name",
Code: "Code",
SubType: "RT",
Propertys: "Propertys"
}
var EmrProp = {//电子病历属性
EmrId:"emrId",//电子病历的id.
EmrName:"name",//电子病历名称。
OPERATORSIGN:"operatorsign",//签字状态:经治医师签字 0,未签字 1签字确认, 2接收审签,3,审签退回
DIRECTORSIGN:"directorsign",//主治医师签名
LEADERSIGN:"leadersign",//主任医师签名
OPERATOR:"operator",//经治医师
DIRECTOR:"director",//主治医师
LEADER:"leader",//主任医师
Choscode:"choscode",//医院编码
QCR:"qcr",//创建病历人
OPERATORTIME:"operatortime",//书写时间
EmrProcessId:"emrProcessId",//病程id
EmrProcessContent:"emrProcessContent",//病程内容
EmrContent:"emrContent",//病历内容
EmrDiagnose:"DE05.01.024.00",//诊断数据组
EmrSignature:"DE02.01.039.00",//签名数据组
EditorType:"_editortype",//当前书写是护士还医生
}
var EmrEditor={//病历操作人属性,非序列化属性。
USER:"_user",//当前操作用户。
OPERATOR:"_operator",//经治医师
DIRECTOR:"_director",//主治医师
LEADER:"_leader",//主任医师
}
var emrView;
function EmrToWatData(dataType,event,data){
this.dataType = dataType;//
this.event = event;
this.data = data
}
function appendLine(s) {
var textArea = document.getElementById("textBox");
if (textArea)
textArea.value += "\r\n" + s;
}
function getBase64ByUrl (data,src, callback, outputFormat) {
var xhr = new XMLHttpRequest();
xhr.open("GET", src, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(e) {
if (xhr.status == 200) {
var uInt8Array = new Uint8Array(xhr.response);
var i = uInt8Array.length;
var binaryString = new Array(i);
while (i--)
binaryString[i] = String.fromCharCode(uInt8Array[i]);
var data = binaryString.join('');
var base64 = window.btoa(data);
var dataUrl = "data:" + (outputFormat || "image/png") + ";base64," + base64;
callback.call(this, dataUrl);
}
}
xhr.send(JSON.stringify(data));
}
function getFileAsBytes(src, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", src, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(e) {
if (xhr.status == 200) {
var vBytes = new Uint8Array(xhr.response);
callback.call(this, vBytes);
}
}
xhr.send();
}
function load() {
emrView = new THCEmrViewLib({
debug: false,
//hcServer: "http://192.168.2.111:12880/", // HC服务端IP
hcServer: "http://"+GetQueryString('strHcServer')+"/",
baseUrl: "./", // 编辑器需要的资源路径
el: "divHCEmrView", // 编辑器父容器的ID
defaultFontSize: "小四", // 编辑器默认字号,默认小四
defaultFontFamily: "宋体", // 编辑器默认字体,默认宋体
paperSize: "A4", // 纸张大小
paperOrientation: 0, // 纸张方向 0纵向 1横向,默认0
designMode: false, // 是否设计模式,也可以使用emrView.designMode = true;
multItemEditValue: true, // 多选数据元选项上屏后,再次点击直接编辑内容,使用右键菜单重新选择
//deUnDoneColor: "#FF8C00", // 没选过选项或没写过内容时数据元背景色
//deDoneColor: "#AFEEEE", // 填写或选择过选项的数据元背景色
//deHotColor: "#87CEFA", // 鼠标移动上去时的颜色
// 工具条
toolBar: {
visible: true, // 是否整体显示顶部工具条,也可以使用emrView.toolBar.visible = false;
//height: 35, // 设置工具栏高度
// 文件按钮
btnFile: {
visible: true
},
// 打印按钮
btnPrint: {
visible: true,
},
// 外部自定义按钮
btnCustoms: [
{
text:"导出",
textVisible:true,
// exec: function() { emrView.ExportPDF(); },
menu:[
{
text: "导出为pdf",
exec: function() {
emrView.ExportPDF();
},
},
// {
// text: "导出为xml",
// exec: function() {
// emrView.ExportXML();
// },
// },
]
}
]
},
// 右键菜单中添加自定义菜单
contextMenu: [
],
// 事件
event: {
// 编辑器状态变化时触发:从未修改状态变为修改状态,或从修改状态变为未修改状态,
onChangedSwitch: function() {
if (emrView.IsChanged)
console.log("onChangedSwitch 文档状态变为修改");
else
console.log("onChangedSwitch 文档状态变为未修改");
},
onCaretItemChanged: function() {
//emrView.CaretProcInfo.Index 光标处的病程id
//emrView.EditProcIndex 当前可编辑的病程id
// console.log("光标位置变动:"+emrView.CaretProcInfo.Index,emrView.GetProcProperty(emrView.CaretProcInfo.Index, "operatorsign"));
// if(""!=emrView.CaretProcInfo.Index){
// emrView.EditProcIndex = "-1";
// }else{
// emrView.ReadOnly=true;
// }
},
// 点击了编辑器工具栏上的保存按钮时触发
onSave: function() {
console.log("onSave 事件触发");
},
// 点了打印并在浏览器里显示了要打印的文件
onPrinted: function(type) {
// type 0打印全部或1-n页,1按行续打,2选中范围续打
console.log(type == 0 ? "打印" : "续打");
if(emrView.ProcCount>0){//如果是病程的话。
if(type == 0){
var emrProcIds = emrView.InnerView.GetAllProcIndex();
var jsonData = new EmrToWatData("S","print",emrProcIds);
watEvents.emrToWatEvent(jsonData);
}
}else{//如果是病历
if(type == 0){//
var emrId = emrView.InnerView.GetValue(EmrProp.EmrId);
if(emrId!==null&&undefined!=emrId){
var emrIds= new Array();
emrIds.push(emrId);
var jsonData = new EmrToWatData("S","print",emrIds);
watEvents.emrToWatEvent(jsonData);
}
}
}
},
onInitialization: function(){
console.log("初始化完成");
var jsonData = new EmrToWatData("S","EMR001","emr001");//编辑器初始化完成
feedbackDataToWat(JSON.stringify(jsonData));
},
}
});
emrView.FrmRecord.btnSave.visible = false;
}
function applyTextStyle(style) {
// 设置选中的文本设置样式
emrView.ApplyTextStyle(style);
}
function applyParaAlignHorz(align) {
// 设置当前光标所在的段水平对齐
emrView.ApplyParaAlignHorz(align);
}
function LoadFromBytes(bytes) { // 二进制数组
// 加载文件,文件数据是byte数组
emrView.LoadFromBytes(bytes);
}
function SaveToBytes() {
// 保存文件,返回文件数据的byte数组
console.log("SaveToBytes存二进制文件");
return emrView.SaveToBytes();
}
function insertDeItem() {
// 插入数据元
emrView.InsertDeItem(
// {
// Index: "499",
// Name: "静脉曲张",
// //Text: "静脉无曲张",
// //CMVVCode: "1",
// Frmtp: TDeFrmtp.Multiselect,
// CMV: "299"
// }
{
"CMV": "1000000062",
// "CMVVCode": "",
// "code": "",
"Frmtp": "MS",
// "hideUnit": "",
"Index": "1000000062",
"Name": "皮肤颜色",
// "preFormat": "",
// "raw": "",
// "secret": "",
// "trace": "",
// "unit": ""
}
);
}
function getDeItemText(index) {
console.log("emrView.getDeItem:"+emrView.getDeItem(index));
}
function getDeItemProperty(index, propName) {
// 获取指定index的数据元的指定属性内容
var vInfo = emrView.GetDeItemProperty(index, propName);
if (vInfo.result) // 取到了
console.log("取到数据元属性:" + vInfo.text); // 取到的内容
else
console.log("未取到数据元属性内容");
}
function insertDeGroup(index, name) {
// 插入数据组
emrView.InsertDeGroup({
Index: index,
Name: name,
});
}
function setDeGroupText(index, s) {
emrView.SetDeGroupText(index, s);
}
function getDeGroupText(index) {
console.log(index + "数据组内容:" + emrView.GetDeGroupText(index));
}
function insertDeImage(index, name) {
// 仅插入空白占位图片,实际业务中再替换成相应的图片
emrView.InsertDeImage({
Index: index,
Name: name
});
// 直接插入图片
// getBase64ByUrl("./image/qm.png", function(base64) {
// emrView.InsertDeImage({
// Index: index,
// Name: name,
// Base64: base64,
// ImageType: "png"
// });
// });
}
function setSignatureGraphic(index) {
// 替换签名图片
getBase64ByUrl("./image/qm.png", function(base64) {
emrView.SetDeImage({
Index: index,
Base64: base64
});
});
}
// 遍历编辑器中的数据元
function traverseElement() {
/*emrView.TraverseElement(fun, areas, tag)需要3个参数
fun表示每遍历到一个元素时触发的事件
areas是个集合,表示要遍历的文档区域,集合的成员是1:页眉、2:正文、4:页脚,areas为null时表示全部区域(正文,页眉,页脚)
tag遍历标识,用于区域本次遍历是完成什么业务,可根据需要赋值
*/
console.log("开始遍历文档-----------------------------");
if(emrView.ProcCount>0){//病程
emrView._isProc=true;
}else{//病历
emrView._isProc=false;
}
let vAreas = new Set([]);
// vAreas.add(1);
vAreas.add(2);
// vAreas.add(4);
emrView._dataStr ="";//用来保存待解析的数据
emrView._dataMark=false;//解析数据组和字符串
emrView._saveEmrData={};//
emrView._saveEmrDataArray=[];
emrView._currentDataGroup="";
emrView._emrId="";
emrView.TraverseElement(traverseFun, vAreas, 0);
console.log(emrView._saveEmrData);
}
/* 遍历编辑器中的数据元时,每遍历到一个数据元触发
此方法参数使用编辑器内置的原生Item对象,注意相关的属性大小写
tag:
domainStack:.peek
stop:
停止解析,return true;
*/
function traverseFun(data, itemNo, tag, domainStack, stop) {
//首先判断是否是同一份病历或者病程。
//对emrView._saveEmrData={};对象进行装饰。
//{
// "emrId":{
// "主诉::"",
// }
// }
console.log("解析:"+itemNo);
let vItem = data.Items[itemNo];
var Index = vItem.Index;//获得属性ID
var emrId = "";
if(emrView._isProc){
console.log("当前解析是病程");
}else{
emrId=emrView.InnerView.GetValue(EmrProp.EmrId);
if(emrView._saveEmrData.emrId==undefined||emrView._saveEmrData.emrId!=emrId){
emrView._saveEmrData.emrId=emrId;
}
}
var code = vItem.Code;
if (vItem.StyleNo == TItemStyle.Domain) { // 数据组
if (vItem.IsProcBegin){
emrId = vItem.Index;
emrView._saveEmrData.emrId=emrId;
console.log("病程开始--------唯一标识:" + vItem.Index);
emrView._dataMark = true;
emrView._currentDataGroup=Index;
emrView._saveEmrData[Index]={};
emrView._saveEmrData[Index].parentId=emrView._saveEmrData.emrId;
emrView._saveEmrData[Index].dataStr="";
}
else if (vItem.IsProcEnd){
console.log("病程结束--------唯一标识:" + vItem.Index);
if(emrView._dataMark){
console.log("病程 Index:"+vItem.Index+":"+emrView._dataStr);
emrView._dataMark=false;
emrView._currentDataGroup=""
}
}
else if (vItem.MarkType == 0){
if(emrView._dataMark){
console.log("数据组开始--------Index:" + vItem.Index);
emrView._saveEmrData[Index]={};
emrView._saveEmrData[Index].parentId=emrView._currentDataGroup;
emrView._currentDataGroup=Index;
emrView._saveEmrData[Index].dataStr="";
emrView._dataStr ="";
}else{
emrView._dataMark = true;
console.log("数据组开始--------Index:" + vItem.Index);
emrView._currentDataGroup=Index;
emrView._saveEmrData[Index]={};
emrView._saveEmrData[Index].parentId=emrView._saveEmrData.emrId;
emrView._saveEmrData[Index].dataStr="";
}
}
else{
console.log("数据组结束--------Index:" + vItem.Index);
if(emrView._dataMark){
console.log("数据组 Index:"+vItem.Index+":"+emrView._dataStr);
console.log("数据组:"+emrView._EmrData);
// if(emrView._EmrData.hasOwnProperty(code)){
// emrView._saveEmrData[Index].dataStr+=emrView._dataStr;
// }
if(emrView._saveEmrData[Index].parentId!=emrView._saveEmrData.emrId){
emrView._saveEmrData[emrView._saveEmrData[Index].parentId].dataStr+=emrView._saveEmrData[Index].dataStr;
emrView._currentDataGroup=emrView._saveEmrData[Index].parentId;
}else{
emrView._dataMark=false;
emrView._currentDataGroup=""
}
}
}
}
else if (vItem.StyleNo > TItemStyle.Null) { // 文本
if (vItem.IsElement){
console.log("数据元 Index:" + vItem.Index + " Text:" + vItem.Text);
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
else{
console.log("自然文本 Text:" + vItem.Text); // 原生Item文本属性Text(大写T开始)
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
}
else if (vItem.StyleNo == TItemStyle.CheckBox){
console.log("勾选框 Text:" + vItem.Text);
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
else if (vItem.StyleNo == TItemStyle.Combobox){
console.log("下拉框 Text" + vItem.Text);
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
else if (vItem.StyleNo == TItemStyle.Edit){
console.log("文本框 Text" + vItem.Text);
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
else if (vItem.StyleNo == TItemStyle.DateTimePicker){
console.log("日期时间 Text" + vItem.Text);
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
else if (vItem.StyleNo == TItemStyle.RadioGroup){
console.log("RadioGroup Text" + vItem.Text);
if(emrView._dataMark){
emrView._dataStr+=vItem.Text;
emrView._saveEmrData[emrView._currentDataGroup].dataStr += vItem.Text;
}
}
}
// 取指定Inex的病程内容
function getProc() {
var procIndex = document.getElementById("procIndex").value;
//var text = emrView.GetProcAsText(procIndex); // 返回病程内容文本
//var bytes = emrView.GetProcAsBytes(procIndex); // 返回病程内容Byte数组(二进制)
var html = emrView.GetProcAsHtml(procIndex); // 返回病程内容Html格式
var vWindow = window.open("", "", "width=" + emrView.ActiveSection.PaperWidthPix);
vWindow.document.write(html);
vWindow.focus();
}
// 编辑光标处病程
function editCaretProc() {
emrView.EditProcIndex = emrView.CaretProcInfo.Index;
}
// 取病程属性信息
function getProcProperty() {
var procIndex = document.getElementById("procIndex").value;
// 取病程所有属性信息
//appendLine("病程" + procIndex + "的属性信息:" + emrView.GetProcProperty(procIndex, TGroupProp.Propertys));
// 取病程Name属性
console.log("病程" + procIndex + "的属性信息:" + emrView.GetProcProperty(procIndex, TGroupProp.Name));
}
// 开启关闭痕迹
function setTrace() {
emrView.Trace = !emrView.Trace;
if (emrView.Trace)
document.getElementById("btnTrace").innerHTML = "关闭留痕";
else
document.getElementById("btnTrace").innerHTML = "开启留痕";
}
// 在留痕模式下,对新痕迹添加痕迹信息
function setTraceInfo() {
// 痕迹时间,实际业务应该取服务端时间
var vDate = new Date();
var vDateTime = vDate.getFullYear() + "-" + (vDate.getMonth() + 1).toString()
+ "-" + vDate.getDate() + " " + vDate.getHours() + ":" + vDate.getMinutes() + ":" + vDate.getSeconds();
var vDeItem;
if (emrView.Trace) { // 当前是留痕模式
let vAreas = new Set([]);
vAreas.add(2);
emrView.TraverseElement(
function (data, itemNo, tag, domainStack, stop) {
vDeItem = data.Items[itemNo];
if (vDeItem.StyleNo > -1) { // 是文本
switch (vDeItem.StyleEx) {
case TStyleExtra.None: {
if (vDeItem.GetValue(TDeProp.Trace) != "")
vDeItem.SetValue(TDeProp.Trace, "");
}
break;
case TStyleExtra.Del: {
if (vDeItem.GetValue(TDeProp.Trace) == "") // 新的删除痕迹
vDeItem.SetValue(TDeProp.Trace, "荆通(jt " + vDateTime + ")删除");
}
break;
case TStyleExtra.Add: {
if (vDeItem.GetValue(TDeProp.Trace) == "") // 新的添加痕迹
vDeItem.SetValue(TDeProp.Trace, "荆通(jt " + vDateTime + ")添加");
}
break;
}
}
},
vAreas, 0);
}
else
console.log("当前不是留痕模式");
}
/**------------------------------------------------------------xgf 2020年7月23日 10:18:45 begin -------------------------------------------------**/
function GetQueryString(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null){
return unescape(r[2]);
}
return null;
}
//保存数据返回给平台[add by xgf 2020年7月23日 10:13:13]
function feedbackDataToWat(data){
//console.log("二进制数据:"+data,"strwinid:"+GetQueryString('strwinid'),+"strctrid:"+GetQueryString('strctrid'));
return window.parent.top.DxURLPage.action(GetQueryString('strwinid'),GetQueryString('strctrid'),data);
}
//病历二进制数据返回给平台,以及解析数据到平台。
function feedbackEmrStreamToWat(){
console.log(emrView.InnerView.FPropertys);
try {
traverseElement();
} catch (error) {
console.log("解析出错了:"+error);
}finally{
let saveData = emrView._saveEmrData;
let steamData = SaveToBytes();
let data = {
saveData:saveData,
steamData:steamData
}
var emrData = new EmrToWatData("B","saveDataEMRByte",data);
watEvents.emrToWatEvent(emrData);
}
}
//病历xml数据返回给平台
function feedbackEmrXmlToWat(){
var xmlData = emrView.SaveToXml();
console.log(xmlData);
var emrData = new EmrToWatData("B","saveEMRXml",xmlData);
watEvents.emrToWatEvent(emrData);
}
function insertProcToWat(){
var emrData = new EmrToWatData("S","insertProc","");
watEvents.emrToWatEvent(emrData);
}
function watResultToIFrame(data){
//debugger;
var jsonData = JSON.parse(data);
console.log("平台传入的数据event:"+jsonData.event);
//debugger;
// console.log("平台传入的数据data:"+jsonData.data);
watEvents.watToEMREvent(jsonData);
}
/**------------------------------------------------------------xgf 2020年7月23日 10:18:45 end -------------------------------------------------**/
</script>
</head>
<body style="height: 100%;" onload="load()">
<div id="divHCEmrView" style="left: 2px; top: 0px; position: fixed; width: 100%; height:100%; background: lightgray;"></div>
</body>
</html>