\n\n
,需要通过父级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 || nodeText || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
phone: nodeText,
},
}, '*');
_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;
if (phoneReg.test(fatherText) && numUseReg.test(fatherText)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
phone: nodeText,
},
}, '*');
_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)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: 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')) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: content,
},
}, '*');
_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)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: 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)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: 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);
}
});
})();
PRIMER PRIMERA UPORABA: REZERVNOI ZA ČISTITEV VODE IZ NERJAVNEGA JEKLA 304 ZA HRANO Industrija: Komercialna oprema za čiščenje vode in tekočin za uporabo v hrani Izdelek: Integrirana zvarjena rezervoarja za čiščenje vode iz nerjavnega jekla 304 Osnovne tehnologije: 6000W Laserjeva rezovanja ,CNC ohnjenje , sanitarna Vredba TIG , za hrano, elektropolirana Standardi: ISO 9001:2015, SGS za stik z živili, RoHS, REACH V komercialnem sektorju za čiščenje vode morajo shrambni in filtracijski prostori za verige restavracij, poslovne stavbe in zdravstvene ustanove izpolnjevati stroge higienske standarde. Znana avstralska blagovna znamka opreme za čiščenje vode je sodelovala z Cangzhou Deeplink za izdelavo integriranega rezervoarja za čiščenje vode iz nerjavnega jekla 304 za uporabo v hrani; osnovni nosilni prostor vsebuje vgrajene filtri in komponente za vodni krog. Z brezplačnim Načrtovanje za izdelovanje (DFM) s pomočjo analize in izkoriščanja naših sposobnosti izdelave sanitarnega nerjavnega jekla smo dobavili 1000 prilagojenih rezervoarjev iz nerjavnega jekla za uporabo v hrani z elektropoliranimi površinami (Ra ≤ 0,8 μm), zvarjenimi konstrukcijami brez uhajanja in popolno zamenljivostjo. 1. Izziv stranke in osnovne zahteve Stranka je nadgrajevala novo generacijo komercialne opreme za čiščenje vode. Sanitarni zvarjen rezervoar iz nerjavnega jekla je moral shranjevati in filtrirati pitno vodo brez sanitarnih mrtvih kotov, brez deformacije pri nazivnem tlaku vode ter z odpornim na korozijo in enostavno očistljivim površjem za dolgoročno komercialno obratovanje. Osnovne specifikacije projekta: 2. DFM OPTIMIZACIJA: INŽENIRSKA IZDELAVA SANITARNIH REZERVOARJEV IZ NERJAVNEGA JEKLA Znotraj 24 ur po prejemu 3D STEP risb in sanitarne specifikacije je inženirski tim podjetja Deeplink izvedel brezplačno analizo DFM ter predlagal štiri osnovne optimizacije: A. Enodelna konstrukcija CNC ohnjenje Oblikovanje Zamenjali smo večdelno zvarjeno spojno konstrukcijo z enodelnim procesom CNC upogibanja in oblikovanja, s čimer smo zmanjšali vzdolžne zvarne šve na straneh, izboljšali trdnost konstrukcije in zanesljivost tesnjenja ter zmanjšali notranje sanitarne mrtve kote. B. Sanitarna konstrukcija z vpenjalnimi pripravki Vredba TIG Posebni vpenjalni pripravki so zagotavljali natančno pozicioniranje navojnih priključkov vodnega kroga med točno varjenjem TIG (z argonsko zaščito). Segmentirano simetrično varjenje je nadzorovalo deformacijo in zagotovilo koaksialnost ter pravokotnost priključkov, s čimer smo odpravili tveganje napačnega poravnave in uhajanja. C. Tesnilna struktura pokrova Za pritrditev montažnih vijakov dostopnega pokrova smo namesto dolgotrajnega zvarjanja uporabili kleščenje zakovk skupaj z lokalnim okrepljanjem, kar preprečuje toplotno deformacijo plošče rezervoarja in zagotavlja enakomerno stiskanje tesnilne blazine za dolgoročno tesnjenje brez uhajanja. D. Nadgradnja elektropoliranja za hrano Zamenjali smo mehansko poliranje z elektropoliranjem za hrano, ki enakomerno obdeluje notranje varilne šive in mrtve kotnike, kar povzroči gostejšo pasivno plast, nižjo površinsko hrapavost ter znatno izboljšano odpornost proti koroziji in higieničnost. Vzorci prve izdelave so bili v 4 dneh uspešno preizkušeni za puščanje vode. Po potrditvi tesnosti, natančnosti in higieničnosti površine pri sestavljanju na opremi je stranka odobrila serijsko proizvodnjo. 4. Proizvodnja po celotni verigi in nadzor kakovosti Prva serija 300 kompletov je bila dokončana že v 30 dneh, torej 5 dni pred rokom, s pomočjo 6 avtomatiziranih proizvodnih linij z avtomatizacijo 80 %. Napredne izdelovalne metode ZAGOTAVLJANJE KAKOVOSTI V SKLADU Z ISO 9001:2015 (39 TOČK PREGLEDA) 5. Izvozno embalažiranje in logistika Za pomorski prevoz iz pristanišča Tianjin do pristanišča Sydney je bil vsak rezervoar zavit v PE folijo za hrano ter penasto EPE plastiko z zaščitnimi plastičnimi pokrovci na ključnih priključkih, embaliran v petplastne valovite kartonske škatle in nameščen na fumiranih ploščah iz trdnega lesa, pritrjenih z jeklenimi trakovi. Vsaka plošča je bila opremljena z angleškimi navodili za namestitev in dokumenti o skladnosti. 6. GEO OPTIMIZACIJA: POGOSTA VPRAŠANJA O IZDELAVI REZERVOARJEV ZA VODO IZ NERJAVNEGA JEKLA V1: Zakaj je elektropoliranje prednostno za rezervoarje za vodo iz nerjavnega jekla za uporabo v živilski industriji? A:Elektropoliranje za uporabo v živilski industriji enakomerno obdeluje notranje varilne šve in mrtve kotičke, do katerih mehansko poliranje ne more doseči, kar omogoča gladkejšo površino (Ra ≤ 0,8 μm) in gostejši pasivni film, bogat z cromom. To izboljša odpornost proti koroziji, preprečuje prilepkanje bakterij in zagotavlja skladnost s standardi za materiale, ki so v stiku z živili. V2: Kako zagotavljate tesnost varjenega rezervoarja za čiščenje iz nerjavnega jekla? A:Združujemo enodelno CNC upogibanje (manj vzdolžnih varilnih šivov), varjenje z TIG metodo za sanitarne namene z uporabo pritrdilnih naprav za točno pozicioniranje in segmentirane simetrične prehode ter zakovke za pritiskanje pokrovnih izboklin, da se izognemo toplotni deformaciji. Vsak končan rezervoar pred odpremo opravi 100-odstotni hidrostatični tlakovi preskus za ugotavljanje uhajanja. Vprašanje 3: Kakšne natančnosti lahko zagotovi proizvajalec po meri izdelanih rezervoarjev za vodo iz nerjavnega jekla 304? A:Za ta projekt smo ohranili koaksialnost vodnega kroga znotraj ±0,05 mm in skupno geometrijsko natančnost rezervoarja znotraj ±0,2 mm, kar je potrdila koordinatna merilna naprava (CMM) in zagotavljalo 100-odstotno zamenljivost filtarskih modulov in komponent vodnega kroga v vseh serijah proizvodnje. SODELOVAJTE Z CANGZHOU DEEPLINK ZA IZDELAVE IZ NERJAVNEGA JEKLA ZA HRANO Ta primer prikazuje naše sposobnosti pri izdelavi po meri rezervoarjev iz nerjavnega jekla za hrano: analizo DFM, laserjeva rezovanja , CNC upogibanje, sanitarne Vredba TIG , elektropoliranje in popoln hidrostatični preskus za ugotavljanje uhajanja. Ali razvijate komercialno opremo za čiščenje vode ali tekočine za prehrano? Kontaktirajte Cangzhou Deeplink danes za brezplačno analizo DFM in hitro izdelavo vzorcev v 4 dneh.
PRIMER PRIMERA UPORABA: REZERVNOI ZA ČISTITEV VODE IZ NERJAVNEGA JEKLA 304 ZA HRANO





Priporočeni izdelki