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/emrMZBasePage.html

684 lines
31 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"></script>
<script type="text/javascript" src="./WatEvent.js"></script>
<script src="./select/js/jquery_3.3.1.min.js"></script>
<script language="javascript" type="text/javascript" src="./layer/layer.js"></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",//主任医师
QCR:"_qcr",//起草人,病历新建人
USERNAME:"_username"//当前用户的姓名
}
var emrView;
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: true,
//hcServer: "http://11.21.6.225:12880/", // HC服务端IP
//hcServer: "http://192.168.2.111:12880/",
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: 1
},
// 打印按钮
btnPrint: {
visible: true,
},
// 外部自定义按钮
// btnCustoms: [
// {
// text: "自定义",
// exec: function() {
// alert("点击了自定义按钮");
// }
// }
// ]
},
// 右键菜单中添加自定义菜单
contextMenu: [
],
// 事件
event: {
// 编辑器状态变化时触发:从未修改状态变为修改状态,或从修改状态变为未修改状态,
onChangedSwitch: function() {
if (emrView.IsChanged)
console.log("onChangedSwitch 文档状态变为修改");
else
console.log("onChangedSwitch 文档状态变为未修改");
},
onCaretItemChanged: function() {
if (emrView.InsertProcing) // 编辑器插入病程正在进行中,忽略光标变动
return;
//emrView.CaretProcInfo.Index 光标处的病程id
//emrView.EditProcIndex 当前可编辑的病程id
// console.log("光标位置变动:"+emrView.CaretProcInfo.Index,emrView.GetProcProperty(emrView.CaretProcInfo.Index, "operatorsign"));
var curUser = emrView._EmrEditor[EmrEditor.USER];//当前用户
if(""!=emrView.CaretProcInfo.Index){
//点击病程的话,需要从后台取数据先不处理。病程还需要值班医生来写
// let director = emrView.GetProcProperty(emrView.CaretProcInfo.Index, EmrProp.DIRECTOR);
// let leader = emrView.GetProcProperty(emrView.CaretProcInfo.Index, EmrProp.LEADER);
if(emrView.Trace){
emrView.ReadOnly=false;
emrView.EditProcIndex=emrView.CaretProcInfo.Index;
}else{
if("1"==emrView.GetProcProperty(emrView.CaretProcInfo.Index, EmrProp.OPERATORSIGN)){
emrView.EditProcIndex = "-1";
}else{
emrView.ReadOnly=false;
emrView.EditProcIndex=emrView.CaretProcInfo.Index;
}
}
}else{
let director = emrView. _EmrEditor[EmrEditor.DIRECTOR];
let leader = emrView. _EmrEditor[EmrEditor.LEADER];
if((curUser == director||curUser ==leader)&&emrView.Trace){//当前用户等于上级医师
emrView.ReadOnly=false;
}else{
if(emrView._Emr[EmrProp.OPERATORSIGN]=="1"||
(emrView.InnerView.GetValue(EmrProp.EditorType)!=""
&&emrView._EmrEditor[EmrProp.EditorType]!=emrView.InnerView.GetValue(EmrProp.EditorType))){
emrView.ReadOnly=true;
}else{
emrView.ReadOnly=false;
}
}
}
},
// 点击了编辑器工具栏上的保存按钮时触发
onSave: function() {
appendLine("onSave 事件触发");
feedbackEmrStreamToWat();
},
// 鼠标点击数据元触发,如果数据元的信息有变化,可以这里重新赋值
onPopupGetDeItemInfo: function(item) {
appendLine("onPopupGetDeItemInfo 点击数据元触发 参数:{" + item.ToJSONString() + "}");
if (item.Index == "495") { // 性别
// 点击数据元时,给数据元通过item.Index重新同步最新信息的机会,响应此事件,需要返回frmtp,数值类的需要返回单位deunit,单选多选要返回选项值域domainid
item.SetValue(TDeProp.Frmtp, TDeFrmtp.Radio);
item.SetValue(TDeProp.CMV, "271"); // 值域,271是数据库里性别元素的值域代码,实际可以通过e.index判断是哪个数据元,返回类别,如果是单选或多选类型同时要返回值域
//item.SetValue(TDeProp.Frmtp, TDeFrmtp.Number); // 类别,RS:单选 MS:多选 N:数值 S:文本 D:日期 T:时间 DT:日期时间
//item.SetValue(TDeProp.Unit, "岁,月,天,小时"); // 数值类的要传递单位
}
},
// 单选或多选数据元获鼠标点击后,显示选项时触发,可在这里把选项传递到编辑器中
onPopupGetDeItemDomain: function(cmv) {
appendLine("onPopupGetDeItemDomain 选项类数据元点击时请求选项 参数:" + cmv);
var data = new EmrToWatData("S","EMR004",cmv);//编辑器初始化完成
return watEvents.getDeItemDomain(data,watEvents.url);
// if (cmv == 271) { // 值域ID,271是性别值域ID
// var vs = '{"cv": [{"value": "男性", "code": "1", "id": 3681, "py": "NX", "content": ""},'
// + '{"value": "女性", "code": "2", "id": 3682, "py": "NX", "content": ""},'
// + '{"value": "未知(描述原因)", "code": "9", "id": 3683, "py": "WZ", "content": "..."}'
// + ']}';
// return JSON.parse(vs);
},
// 数据元选项有扩展内容时,获取扩展内容
onPopupGetDomainItemExtraLib: function(item, cvvid) {
// if (item.Index == 495) { // 性别
// if (cvvid == 3683) { // 选择了带内容的
// emrView.SetActiveItemExtraWithJSON({
// });
// }
// }
var data = new EmrToWatData("S","getLiteByte",item.Index);//编辑器初始化完成
watEvents.getLiteByte(data,watEvents.url);
},
// 当编辑器在加载文档或插入了新的Item时触发,便于外部替换数据元的值
onInserItemSync: function(sender, data, item) {
console.log("装载数据元Index:"+item.Index);
console.log("装载数据元:"+item.Name);
console.log("装载数据元:"+item.Text);
console.log("装载数据元:"+item.StyleNo);
var hcdata =watEvents.getHcData();
if(item.Index){
for(prop in hcdata){
if(item.Code==prop){
item.Text = hcdata[prop];
item.AllocValue = true; // 该元素填写过值了
}
}
}
},
//控制菜单显示
onViewMenuPopup: function(menus) {
for (var i = 0; i < menus.count; i++) {
if (menus[i].tag == 1) { //
var selectItem = emrView.GetActiveItem();
if(""==emrView.CaretProcInfo.Index){//病历
var operatorsign = emrView._Emr[EmrProp.OPERATORSIGN];
var curUser = emrView._EmrEditor[EmrEditor.USER];//当前用户
if("1"==operatorsign){
if(selectItem.Index.length==32||selectItem.Index=='sign_'+curUser){
if(menus[i].text == "取消签名"){
menus[i].visible=true;
}
}else{
if(menus[i].text == "取消签名"){
menus[i].visible=false;
}
}
if(menus[i].text == "医学公式"){
menus[i].visible=false;
}
}else{
if(menus[i].text == "取消签名"){
menus[i].visible=false;
}
else if(menus[i].text == "医学公式"){
menus[i].visible=true;
}
}
}
if(menus[i].text == "日期时间"){
menus[i].visible=true;
}
}
}
},
// 当编辑器中的Combobox控件点击了下拉按钮,显示选项时触发
onDeComboboxPopup: function(cmbxItem) {
if (cmbxItem.Index == 495) { // 是性别
if (!cmbxItem.SaveItem) { // combobox自己没有保存选项
if (cmbxItem.Items.count > 0)
cmbxItem.Clear();
cmbxItem.AddItem("男", "1");
cmbxItem.AddItem("女", "2");
}
}
},
// 判断当前情况下是否能编辑,此事件在引起内容变化的时候触发,较频繁,所以不要写复杂的业务
onCanEdit: function(data) {
if (emrView.EditProcIndex != "") // 当前指定了要编辑的病程
return emrView.CaretProcInfo.Index == emrView.EditProcIndex; // 光标所在病程和当前允许编辑的病程Index相同
else
return true;
},
// 数据元右键菜单中的 更新引用 点击后触发的事件
onDeItemGetSyncValue: function(item) {
if (item.Index == "494") // 姓名
return "李四福";
},
// 点了打印并在浏览器里显示了要打印的文件
onPrinted: function(type) {
// type 0打印全部或1-n页,1按行续打,2选中范围续打
console.log(type == 0 ? "打印" : "续打");
},
onInitialization: function(){
appendLine("初始化完成");
var jsonData = new EmrToWatData("S","EMR001","emr001");//编辑器初始化完成
feedbackDataToWat(JSON.stringify(jsonData));
},
//鼠标放在控件上事件
onMouseUp: function(e, item){
console.log("鼠标放在控件上事件:"+item.Code);
if (emrView.HCL.keyDownStates[17] // ctrl键按下
&& (item.HyperLink != "")) // 链接不为空
window.open(item.HyperLink); // 跳转到链接
},
// 编辑器双击事件
onDblClick: function() {
var deGroupCode = emrView.GetCaretDeGroupProperty(TDeProp.Code);
var deGroupIndex = emrView.GetCaretDeGroupProperty(TDeProp.Index);
var propertys = emrView.GetCaretDeGroupProperty("Propertys","json");//json对象
console.log(propertys.isSave);
if(deGroupCode == EmrProp.EmrSignature) {//医生签名
console.log("医生签名");
var curUser = emrView._EmrEditor[EmrEditor.USER];//当前用户
if(""!=emrView.CaretProcInfo.Index){//病程
//右键直接签名,
console.log("当前病程id:"+emrView.CaretProcInfo.Index);
console.log("获得病程属性:"+emrView.GetProcProperty(emrView.CaretProcInfo.Index,"Propertys"));
var qcr=emrView.GetProcProperty(emrView.CaretProcInfo.Index, EmrProp.QCR);
var choscode=emrView.GetProcProperty(emrView.CaretProcInfo.Index, EmrProp.Choscode);
var operatorsign = emrView.GetProcProperty(emrView.CaretProcInfo.Index, EmrProp.OPERATORSIGN);
if("1"!=operatorsign){//未签名
var param={
emrId:emrView.CaretProcInfo.Index,
operator:curUser,
choscode:choscode
};
var data = new EmrToWatData("JSON","setSignatureGraphic",param);
watEvents.getOperatorSignPic(data,watEvents.url);
}
}else{//病历
var operator = emrView. _EmrEditor[EmrEditor.OPERATOR];
var director = emrView. _EmrEditor[EmrEditor.DIRECTOR];
var leader = emrView. _EmrEditor[EmrEditor.LEADER];
var operatorsign = emrView._Emr[EmrProp.OPERATORSIGN];
var directorsign = emrView._Emr[EmrProp.DIRECTORSIGN];
var leadersign = emrView._Emr[EmrProp.LEADERSIGN];
var qcr = emrView.InnerView.GetValue(EmrProp.QCR);
var choscode = emrView.InnerView.GetValue(EmrProp.Choscode);
if("1"!=operatorsign){//经治医师未签名
var param={
emrId:emrView.InnerView.GetValue(EmrProp.EmrId),
operator:curUser,//
choscode:choscode
};
var data = new EmrToWatData("JSON","setSignatureGraphic",param);
watEvents.getOperatorSignPic(data,watEvents.url);
}
}
}else{
}
}
}
});
// 向编辑器的右键菜单中添加菜单
emrView.AddContextMenu(
[
{
text:"日期时间",
exec: function() {
let date=new Date();
let newdate=date.toLocaleString('chinese', { hour12: false }); //获取24小时制,中国时间,打印出 2019/01/03/ 08:40:3
console.log("日期时间:"+newdate);
console.log("年:"+date.getFullYear());
console.log("月:"+date.getMonth());
console.log("日:"+date.getDate());
console.log("时:"+date.getHours());
console.log("分:"+date.getMinutes());
console.log("long:"+Date.now().toString(36));
emrView.InsertDeDateTime({
Index: Date.now().toString(36),
Name: date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()+" "+date.getHours()+":"+date.getMinutes()
});
},
},
{
text: "取消签名",
exec: function() {
console.log("当前操作员"+emrView._EmrEditor[EmrEditor.USER]);
var curUser = emrView. _EmrEditor[EmrEditor.USER];//当前用户
emrView.ReadOnly=false;
console.log("经治医师签名:"+emrView._Emr[EmrProp.OPERATORSIGN]);
var operatorsign = emrView._Emr[EmrProp.OPERATORSIGN];
if("1"==operatorsign){//签名
console.log("病历取消签名:");
var param={
emrId: emrView.InnerView.GetValue(EmrProp.EmrId),//病历附加属性[病历id]
operator:curUser,
choscode:emrView.InnerView.GetValue(EmrProp.Choscode),
};
var data = new EmrToWatData("JSON","cancelSignatureGraphic",param);
watEvents.emrToWatEvent(data);
emrView.DeleteActiveItem();
}
}
},
]
);
}
function applyParaAlignHorz(align) {
// 设置当前光标所在的段水平对齐
emrView.ApplyParaAlignHorz(align);
}
function LoadFromBytes(bytes) { // 二进制数组
// 加载文件,文件数据是byte数组
emrView.LoadFromBytes(bytes);
}
function SaveToBytes() {
// 保存文件,返回文件数据的byte数组
appendLine("SaveToBytes存二进制文件");
return emrView.SaveToBytes();
}
function getDeItemText(index) {
// 获取指定index的数据元的内容
// var vInfo = emrView.GetDeItemText(index);
// if (vInfo.result) { // 取到了
// appendLine("取到数据元内容:" + vInfo.text); // 取到的内容
// console.log(vInfo);
// }else{
// appendLine("未取到数据元内容");
// }
console.log("emrView.getDeItem:"+emrView.getDeItem(index));
}
function getDeItemProperty(index, propName) {
// 获取指定index的数据元的指定属性内容
var vInfo = emrView.GetDeItemProperty(index, propName);
if (vInfo.result) // 取到了
appendLine("取到数据元属性:" + vInfo.text); // 取到的内容
else
appendLine("未取到数据元属性内容");
}
function insertDeGroup(index, name) {
// 插入数据组
emrView.InsertDeGroup({
Index: index,
Name: name,
});
}
function setDeGroupText(index, s) {
emrView.SetDeGroupText(index, s);
}
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
});
});
}
/**------------------------------------------------------------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 {
watEvents.traverseElement_wat();
} catch (error) {
console.log("解析出错了:"+error);
}finally{
let saveData = emrView._saveEmrData;
let deElements = emrView._emrDataElement_wat;
let steamData = SaveToBytes();
let data = {
saveData:saveData,
steamData:steamData,
deElements:deElements
}
var emrData = new EmrToWatData("B","saveDataEMRByte",data);
watEvents.emrToWatEvent(emrData);
}
}
function watResultToIFrame(data){
var jsonData = JSON.parse(data);
console.log("平台传入的数据event:"+jsonData.event);
// console.log("平台传入的数据data:"+jsonData.data);
watEvents.watToEMREvent(jsonData);
}
//数据传递对象
/**
接受平台数据
dataType:"",//数据类型,
event:""//数据来源,类别。业务类别,emr001=编辑器init完成。
data:{}
**/
function EmrToWatData(dataType,event,data){
this.dataType = dataType;//
this.event = event;
this.data = data
}
/**------------------------------------------------------------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>