, ki pèmèt pou patyan ak doktè tou lè tou konfòrme ak...">
,需要通过父级DOM结构来判断
*/
var trackActionPhone = function (node) {
var nodeInnerText = node.innerText || '';
if (!limitRegLength(nodeInnerText)) return;
var nodeText = trimText(nodeInnerText);
if (nodeText.length < 5 || nodeText.length > 20) return false;
var type =
arguments.length > 1 && arguments[1] !== undefined
? arguments[1]
: 'click';
var str = trimText(node.href || node.innerHTML || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
/** 排查父级嵌套非标签场景,并且对dom的正则校验做一个性能兜底,通过控制innerText的长度,来确保正则的性能 */
var fatherText = trimText(node.parentNode.innerText || '');
if (fatherText.length < 5 || fatherText.length > 20) return false;
var fatherDom = trimText(node.parentNode.innerHTML || '');
if (phoneReg.test(fatherDom) && numUseReg.test(fatherDom)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
return false;
};
window.addEventListener('click', function (e) {
var node = e.target;
/** 社媒点击 */
var appName = '';
var getAppAriaLabel =
node.ariaLabel || node.parentNode.ariaLabel || '';
if (mediaList.includes(getAppAriaLabel.toLowerCase())) {
appName = getAppAriaLabel;
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'a'
) {
appName = getMediaName(node.href) || getMediaName(node.alt);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'img'
) {
appName = getMediaName(node.alt) || getMediaName(node.src);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'i'
) {
appName = getMediaName(node.className);
}
if (appName) {
_paq.push(['trackEvent', 'click', 'contactApp', appName]);
return;
}
/** 联系方式点击 */
if (trackActionPhone(node, 'click')) return;
if (node.nodeName && node.nodeName.toLowerCase() === 'a') {
var val = node.href;
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
if (node.nodeName && node.nodeName.toLowerCase() === 'i') {
var val = node.className;
var content = node.parentNode.href || '';
if (val.includes('email')) {
_paq.push(['trackEvent', 'click', 'email', content]);
return;
}
}
var nodeChildList = node.childNodes;
for (var i = 0; i < nodeChildList.length; i++) {
if (nodeChildList[i].nodeType !== 3) continue;
var val = nodeChildList[i].textContent.replace(/\s?:?/g, '');
if (!limitRegLength(val)) continue;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
trackNumberData(node);
});
window.addEventListener('copy', function (e) {
if (trackActionPhone(e.target, 'copy')) return;
var text = e.target.textContent;
if (!text) return;
var val = text.replace(/\s:?/g, '');
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'copy', 'email', val]);
return;
}
trackNumberData(e.target);
});
}
trackContactInit();
/**
* 基于custom_inquiry_form.js 以及 form.js 对于询盘表单提交的实现,来反推询盘表单的input标签触发,用来收集意向客户
* 1. 缓存的KEY:TRACK_INPUT_ID_MTM_00;
* 2. 缓存策略 - lockTrackInput:单个页面内,10分钟内,不重复上报
*/
function trackActionInput() {
const CACHE_KEY = 'TRACK_INPUT_ID_MTM_00';
const pathName = window.location.hostname + window.location.pathname;
var lockTrackInput = function () {
try {
const lastCacheData = localStorage.getItem(CACHE_KEY);
if (!lastCacheData) return false;
const cacheData = JSON.parse(lastCacheData);
const cacheTime = cacheData[pathName];
if (!cacheTime) return false;
return Date.now() - cacheTime < 1000 * 60 * 10; // 10分钟内,不重复上报
} catch (error) {
console.error('lockTrackInput Error', error);
return false;
}
};
var setInputTrackId = function () {
try {
const curCacheData = localStorage.getItem(CACHE_KEY);
if (curCacheData) {
const cacheData = JSON.parse(curCacheData);
cacheData[pathName] = Date.now();
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
return;
}
const cacheData = {
[pathName]: Date.now(),
};
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
} catch (error) {
console.error('setInputTrackId Error', error);
}
};
var getInputDom = function (initDom) {
var ele = initDom;
while (ele) {
/**
* isWebSiteForm 是站点的表单
* isChatWindowForm 是聊天窗口的表单
*/
/** 旧模板表单 */
var isWebSiteForm = !!(
/crm-form/i.test(ele.className) && ele.querySelector('form')
);
/** 1:新模板自定义表单、2:Get a Quote 弹框表单 */
var isWebSiteFormNew = !!(
/inquiry/i.test(ele.className) && ele.querySelector('form')
);
if (isWebSiteForm || isWebSiteFormNew) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'page']);
setInputTrackId();
return;
}
/** Mkt会话触达-聊天弹框的表单输入: MKT由于是iframe嵌入,所以MKT的上报,会单独写到MKT-form代码上 */
var isInquiryChatForm = !!(
/comp-form/i.test(ele.className) && ele.querySelector('form')
);
if (isInquiryChatForm) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'chat']);
setInputTrackId();
return;
}
/** 向上查找父节点 */
ele = ele.parentNode;
}
};
function initInputListener() {
var inputUseDebounce = function (fn, delay) {
var timer = null;
var that = this;
return function () {
var args = Array.prototype.slice.call(arguments);
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(that, args);
}, delay);
};
};
var optimizeGetInputDom = inputUseDebounce(getInputDom, 300);
window.addEventListener('input', function (e) {
/** 如果已经上报过,则不再上报 */
if (lockTrackInput()) return;
optimizeGetInputDom(e.target);
});
}
try {
initInputListener();
} catch (error) {
console.log('initInputListener Error', error);
}
}
trackActionInput();
}
/** 第三方消息上报:目前主要是针对全点托管会话;在msgCollect/index.js中调试,访问test.html */
function thirdMsgCollect() {
/** 先检测是否是stayReal托管:如果stayReal脚本都没有,那么说明当前站点未开启stayReal会话托管 */
const scriptList = Array.prototype.slice.call(
document.querySelectorAll('script'),
);
const checkStayReal = () =>
!!scriptList.find((s) => s.src.includes('stayreal.xiaoman.cn'));
if (!checkStayReal()) return;
/** 缓存当前消息队列的最后一条消息id */
const CACHE_KEY = 'CACHE_KEY_MONITOR';
const setCache = (msgIndex) => {
/** 对缓存KEY进行base64转码处理 */
const cacheMsgIndex = btoa(msgIndex);
localStorage.setItem(CACHE_KEY, cacheMsgIndex);
};
const getCache = () => {
const cacheMsgIndex = localStorage.getItem(CACHE_KEY);
if (cacheMsgIndex) return Number(atob(cacheMsgIndex));
return -1;
};
/** 拉取最新msg列表 */
const pullMsgList = () => {
const msgEleList = Array.prototype.slice.call(
document.querySelectorAll('#chat-list li'),
);
const msgIds = [];
const msgMap = msgEleList.reduce((acc, item) => {
const sendTime = item
.querySelector('.message-data-time')
.textContent.trim();
const sendContent = item.querySelector('.message').textContent.trim();
/** msg带有class:other-message的是访客消息,my-message的是客服消息 */
const isOtherMessage = item
.querySelector('.message')
.classList.contains('other-message');
const msgId = item.querySelector('.message').getAttribute('id');
const msgItemData = {
msgId,
user: isOtherMessage ? 'visitor' : 'official',
time: sendTime,
content: sendContent,
};
msgIds.push(msgId);
acc[msgId] = msgItemData;
return acc;
}, {});
return {
ids: msgIds,
dataMap: msgMap,
};
};
/** 加密并上传消息数据 */
let ENCRYPT_KEY = 'de29f1aab63ab033';
let ENCRYPT_IV = 'b8d2badf875e76ac';
const baseUrl = 'https://cms.xiaoman.cn';
// var getEncryptConfig = function () {
// const url = baseUrl + '/shop-api/innerApi/getKeyIv'
// $.get(
// url,
// function (result) {
// console.log('result', result)
// if (Number(result.code) === 0 && result.data.key && result.data.iv) {
// ENCRYPT_KEY = result.data.key
// ENCRYPT_IV = result.data.iv
// uploadMsgData()
// } else {
// /** 如果获取失败,则重试 */
// setTimeout(() => {
// getEncryptConfig()
// }, 1000)
// }
// },
// 'json'
// )
// }
// getEncryptConfig()
const encryptMsg = function (msgData) {
const enc = new TextEncoder();
// 转字节
const keyBytes = enc.encode(ENCRYPT_KEY);
const ivBytes = enc.encode(ENCRYPT_IV);
const plainBytes = enc.encode(msgData);
// 导入密钥并加密
return crypto.subtle
.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, ['encrypt'])
.then(function (cryptoKey) {
return crypto.subtle.encrypt(
{ name: 'AES-CBC', iv: ivBytes },
cryptoKey,
plainBytes,
);
})
.then(function (encryptedBuffer) {
// 转 base64 返回
return btoa(
String.fromCharCode(...new Uint8Array(encryptedBuffer)),
);
})
.catch((err) => {
return Promise.reject(err);
});
};
let uploadFlag = false;
const uploadMsgData = function () {
if (uploadFlag) return;
uploadFlag = true;
const { ids, dataMap } = pullMsgList();
let cacheMsgIndex = getCache();
const msgLen = ids.length;
if (!msgLen) {
// 消息DOM未挂载 || 消息DOM已挂载,但是消息列表为空
uploadFlag = false;
return;
}
if (msgLen - 1 < cacheMsgIndex) {
/** 针对站点挂后台一段时间,消息列表会自动塞入重复消息,导致消息有重复,刷新后又重置回正常消息列表,所以这里需要更新锚点下标 */
cacheMsgIndex = msgLen - 1;
setCache(cacheMsgIndex);
uploadFlag = false;
return;
}
if (msgLen - 1 === cacheMsgIndex) {
// 缓存的最后一次发送的消息ID是最后一条(说明当前消息均已经上报),则不跳过本地上报
uploadFlag = false;
return;
}
const currentMsgIds = ids.slice(cacheMsgIndex + 1, msgLen);
const currentMsgData = currentMsgIds.map((id) => dataMap[id]);
const mtmId = window.matomo_site_id_cookie_key || ''; // 获取mtm会话id
const msgBody = {
mtmId,
curl: window.location.href,
msgList: currentMsgData,
};
const msgBodyStr = JSON.stringify(msgBody);
encryptMsg(msgBodyStr)
.then(function (encryptedMsg) {
console.log('encryptedMsg:', encryptedMsg, msgBodyStr);
const url = baseUrl + '/shop-api/External/ListenSiteActiveStatus';
$.ajax({
type: 'POST',
url,
data: JSON.stringify({ d_v: encryptedMsg }),
contentType: 'application/json',
success: function (result) {
if (Number(result.code) === 0) {
// 更新消息队列
setCache(msgLen - 1);
}
uploadFlag = false;
},
error: function (err) {
console.error(err, '请求异常');
uploadFlag = false;
},
});
})
.catch((err) => {
console.error(err, '数据加密失败');
uploadFlag = false;
});
};
/** 监控chat-list的DOM变更 */
const initChatListObserver = () => {
// 需要监听的 DOM 节点
const target = document.getElementById('chat-list');
if (!target) return;
// 回调函数
const callback = function (mutationsList, observer) {
for (const mutation of mutationsList) {
console.log('mutation', mutation);
if (mutation.type === 'childList') {
uploadMsgData();
}
}
};
// 配置
const config = {
childList: true, // 监听子节点的增删
subtree: true, // 是否也监听后代节点
};
// 创建 observer
const observer = new MutationObserver(callback);
// 开始监听
observer.observe(target, config);
};
let testCount = 30;
let itv = null;
const checkChatDom = () => !!document.querySelector('#vc-model');
const initTalkCheck = () => {
itv = setTimeout(() => {
console.log('checkChatDom', checkChatDom(), testCount);
if (!checkChatDom() && testCount > 0) {
testCount--;
initTalkCheck();
return;
}
clearTimeout(itv);
uploadMsgData();
initChatListObserver();
}, 1500);
};
initTalkCheck();
}
try {
gtmTrack();
thirdMsgCollect();
console.log('inserted gtm code');
} catch (error) {
console.error('gtmTrack Error', error);
}
});
})();
XIEHE MEDICAL gen yon varyete mebils de chevet , k ap pral konfò ak armoni pou pasyan ak doktè yo. Elèv yo enpotan pou itilizasyon nan milye medikal kote bezwen an estoke objè pèsonèl, apovwa ak machin yo aji rapidman. Bezwen an pou achte pi bon mebils de chevet pou lopital yo se esansyèl paske li sèvi pou asire ke sèvis lopital ou efikas epi kliyan yo kontan. Chwazi pi bon tabouret latè lit Chwa yon armanchèt chèv lit ki apwopriye enkli pran an konsiderasyon grandè ak madjira, desen ak karaktèristik pou milye a osipitalye. XIEHE MEDICAL se yon ekselan pwovida chine, espesyalize nan lopital mòbilye tankou pyezèt. Ou kapab achte pyezèt sa yo chez yon vann majistrate, yon magazen pwodui medikal oswa direkteman sou sit wèb endistri a. XIEHE MEDICAL founi yon varyete pyezèt ak dimansyon, koulè ak estrikti diferan pou reponn bezwen lopital diferan. Ak pyezèt XIEHE MEDICAL, lopital yo pral jwi yon konstriksyon solid, yon desen tailor ak opsyon pesonalizasyon ki disponib selon entèrès yo. Lè w'ap achte tab vòt pou yon opital, se twò enpotan pou w pran an konsiderasyon bezwen ak pwefere spesifik istitisyon sante a. Bagay pou pran an konsiderasyon enkouraj mezir tab vòt la - evidaman se yon bon ide ke w kapab mete kantite tab vòt ou vle nan yon espas patikilye, kidonk yo dwe konpate ak konstrenn ou sou sa; materyal ki itilize nan konstriksyon an - estil fasil pou netwaye ak ipyjenik?; konbyen fasil yo pou itilizasyon ak konbyen pratik yo pou kenbe net? - yon eksemp ki gen yon tèt avan oswa oblik, pa egzanp, ap envite moun chaje sal sou yo, elatriye - pwopryete oswa karaktè ki kiltive tankou verou, roul swivel oswa tout lòt sa ki ta kapab enterese w. Tab vòt XIEHE MEDICAL yo gen diferan spesifikasyon pou reponn bezwen itilizasyon patikilye pou diferan objè depo, konsa opital yo kapab chwazi tab vòt ki pi konvenab pou respòn ak bezwen yo ak amelyore pwochen pasyan ak anviwonman travay la. Se l kote ekspètiz XIEHE MEDICAL pral entèvni nan mobilier opital, ak tout opital nan Chin ki gen konfyans nan armoir tab vòt yo kapab reziste itilizasyon chak jou ak doure pou lane vini. Nan XIEHE MEDICAL, nou konprann nesesite lòkèt chèz malad apresyab ak fonksyonèl nan milye opital sou baz konprann endistri a an premye men. Nou sèlman ofri pi enpotan ki pouse non sèlman anpil espas pou met objè m alad yo men tou ki kontwibye yon sal opital ki pi bèl. Yon bon opsyon disponib ak yon aspè ak sansibilite asye inoxydab modèn ki kapab kenranse epreuv tan ak fasilite netwayaj. Yon lòt tandans se estasyon pouvwa entegre pou chachaj aparèy elektwonik pou m alad la kapab rete konekte pandan yo nan klinik la. Lòkèt chèz malad nou yo gen opsyon koutimizasyon koubyen ke opsyon koulè pou asire yo toujou korapondre ak opital ou. Si ou bezwen mebils de chevet pou lopital yo ki pi bon, XIEHE MEDICAL kapab ranpli bezwen ou. Mebils chevet nou yo se yon desen ki mete aksan sou pasyan ak pèsonèl la. Yo founi yon siste bloke pou mete chòz pasyan yo nan sekirite. Tiroirs gwo ak etaj founi espas pou objè pèsonèl, medikaman ak lòt apovwa. Anplis, mebils chevet nou yo te konstwi pou kapab kenbe tout kalite itilizasyon chak jou nan yon anviwònman lopital, sa ki fè yo yon solisyon mebel dirab pou long tan pou òganizasyon santeray yo. Xiehe Medical Apparatus Instruments an rete pou globalizasyon nan maketing ak vent. Nou gen plis de 30 distribite a plis de 120 peyi bazé sou plis de 10 zan soupo e defi partnye yo. nou soti pou fonnèt relasyon jen dlo ak distribite ak integrate pou konstri ak yon lavi pi byen. Xiehe Medical Apparatus Instruments kontinye travay nan rechèch ak devlòpman inovatè epi li dedye pou ofri pwodui ki kapab konpete. Brevè ak pwopryete entelektiyèl pwotije lit kominikasyon medikal, objè premye sekou ak mebli pou ospital, ansanm ak ka lòk pou chevet pou ospital. Pwodui nou yo konsepte pou reponn bezwen kliyan nou yo epi yo adapte ak modè ak tendans aktyèl. Pwodui sa yo resevwa bon akèil sèlman pa kliyan entènasyonal menm pasi pa kliyan nasyonal. Kòm pwodiksyon pèfesyonèl materyèl medikal, Xiehe Medical Apparatus Instruments ofri pwodui de bon kalite ak sèvis espayisye. Tout pwodui yo sertifye pa TUV, CE ak FDA. Yo siveye sistè kontròl kwalite ISO13485. Yo gen yon ekip dedye kap kapab reponn vites a bezwen kliyan yo epi livrer yon lòkè pou lit opere de bon kalite ak estab nan ipital yo. Si ou bezwen yon kawalè pou ambilans, yon kawalè ki pliye, mebli pou ipital oswa materyèl pou sevelman, Xiehe Medical Equipment gen solisyon pou sa. Hehe Medical Equipment met satisfaksyon kliyan yo an premye plas epi li eseye reponn bezwen kliyan yo ak kwalite ak relyabilite. Nou kapab ofri kliyan yo yon sèvis pèsonèl ak relyab paske staf nou gen pasyon pou travay la epi teknoloji kolaboratif nou itilize. Objektif nou se etabli yon patnèyaj kontinyè, estab ak kolaboratif avèk kliyan nou, epi ofri yo pwodui ak sèvis de pi bon kalite.kabè pyebord ospital
Kote pouw jwenn pi bon pyezèt pou syèj lopital yo

Kouman chwazi pi bon pyezèt pou syèj ou an pou lopital ou

Mond lan nan pyezèt pou syèj lopital yo

Pi bon pyezèt pou syèj pou lopital yo
Why choose XIEHE MEDICAL
kabè pyebord ospital?
Reso maketing mondial ak partizan stabi
Inovasyon nan Rechèch ak Devlopman ak Pwant Vann
Pwodwi kalite youn ak sèvis spesyalize
Servis aprè vant ak fokus sou klant yo epi sòt teknik
Pa jwenn sa w ap chache?
Demann yon Kote Maintenant
Kontakte konsiltan n pou plis pwodui dispo.PRAN KONTAK