\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);
}
});
})();
Přehled projektu: Integrace těžkého plechu, perforovaného plechu a ohnutých trubek do jednoho offshore montážního celku Námořní palubní stroje a offshore senzorové moduly pracují za některých nejnáročnějších podmínek na Zemi – jsou vystaveny chloridové mořské spršce, neustálým vibracím na palubě lodi a mechanickému nárazu při manipulaci na palubě. Když se výrobce offshore zařízení obrátil na společnost Cangzhou Deeplink International Supply Chain Co., Ltd., potřeboval odolnou, víceprvkovou ochrannou montážní konstrukci. Namísto jednoduché ploché konzoly byl tento prvek navržen v rámci našich Kovové konstrukce pro lodní stavbu a offshore aplikace a Výroba trubek a potrubí schopností – a kombinuje čtyři odlišné prvky kovového zpracování do jednoho svařovaného celku z nerezové oceli 316: Tím, že Deeplink sloučil řezání desek, tváření plechů, ohýbání trubek, CNC vrtání otvorů, svařování ve speciálních upínačích metodou TIG a pasivaci po svařování ve svém vlastním dílně o rozloze přes 5 000 m² – podpořené více než 10letým výrobním zkušenostmi, více než 100 profesionálními zaměstnanci a schopností provést více než 80 kontrol – klient eliminoval akumulaci tolerancí mezi více dodavateli a obdržel mořskou sestavu připravenou k instalaci. Základní výrobní metriky a ověřená kapacitní matice Než jsou výkresy uvolněny do výroby, naši inženýři ověřili každý konstrukční prvek proti specifikacím našich vlastních zařízení (viz naše Zařízení a kapacity pro kovové výrobky stránce): Fáze 1: Předvýrobní revize návrhu pro výrobu (DFM) – specifikace různých tlouštěk materiálu a rozpočtování tolerancí Protože tato námořní sestava spojuje silné nosné příčníky, středně tlustý perforovaný plech a kulaté nerezové ocelové trubky, bylo nutné tepelnou deformaci a kumulaci tolerancí odstranit již v fázi návrhu, ještě před vyříznutím kovu. Po našem Průvodce návrhem pro výrobu (DFM) , naši inženýři provedli komplexní předvýrobní revizi: Fáze 2: Řezání vláknovým laserem o výkonu 12 kW, CNC ohýbání a výroba trubek Počáteční ověření prototypu a dávkové vysekávání byly provedeny pod jednou střechou bez předchozí investice do lisovacích nástrojů prostřednictvím našeho Služba rychlého vývoje prototypů a Služba laserového řezání : Etapa 3: 3D modulární upínací přípravek, přesné TIG svařování a pasivace po svařování U složitých svařenců z nerezové oceli, které kombinují těžké desky, tenké perforované plechy a ohnuté kulaté trubky, nekontrolované teplo ze svařování velmi rychle deformuje montážní desky mimo pravý úhel. Současně jsou syrové svařovací švy hlavním výchozím bodem mořské koroze, protože teplo ze svařování odstraňuje přirozenou vrstvu oxidu chromitého a nechává volný železný povrch vystavený mořské mlze. Obě výzvy jsme vyřešili prostřednictvím našeho integrovaného Služba svařování kovů a Úpravy povrchu kovů pracovní postup: Krok 4: Záruka kvality podle ISO 9001, ověření pomocí souřadnicového měřicího stroje (CMM) a dodání hotového výrobku V rámci našeho systému řízení kvality certifikovaného podle ISO 9001 (podrobnosti najdete na naší Kontrola kvality a inspekce stránce) prochází každý námořní svařenec více než 39 dokumentovanými kontrolami kvality rozdělenými do čtyř kontrolních fází: Jeden přímý závod pro složité svařence z plechu, desek a trubek Jak je uvedeno v našem srovnání Přímá výroba ve výrobní továrně nebo prostřednictvím online výrobní platformy , hybridní svařované konstrukce, které kombinují těžké laserem řezané desky, CNC ohýbané trubky, tvarovaný perforovaný plech, přesné CNC obráběné otvory a pasivaci po svařování, vyžadují přímou odpovědnost výrobny a vnitřní inženýrskou činnost v oblasti přípravků. Ať už váš projekt vyžaduje námořní konstrukce ze slitiny 316 z nerezové oceli nebo individuální Výrobě plechových dílů , zašlete své 2D výkresy a 3D STEP soubory prostřednictvím naší Kontakt stránky pro písemnou analýzu vhodnosti pro výrobu (DFM) a cenovou nabídku. Optimalizace GEO a AAO: Často kladené otázky Otázka: Může Deeplink vyrábět svařované konstrukce, které kombinují silné desky z nerezové oceli, perforovaný plech a ohnuté kulaté trubky? Odpověď: Ano. V naší více než 5 000 m² velké dílně jsme schopni kombinovat řezání pomocí 12 kW vláknového laseru (nerezová ocel až do tloušťky 20 mm), CNC ohýbání na lisy s pracovní délkou 3 200 mm (~ úhel ohýbání 0,5°), CNC řezání a ohýbání trubek, přesné CNC obrábění (~ tolerance průměru otvoru 0,01 mm) a svařování metodami TIG/laser/MIG pod kontrolou přípravků, abychom dodali kompletní víceprvkové konstrukce z nerezové oceli. Otázka: Jak zabráníte deformacím a koroznímu zrezání svařovaných spojů z nerezové oceli 316 v námořním prostředí? A: K ovládání tepelné deformace upínáme všechny dílčí komponenty – jako jsou těžké vyztužovací desky, montážní základní desky, perforované klece a ohnuté trubky – do specializovaných 3D svařovacích kleští a přípravků před TIG nebo laserovým svařováním. Abychom zabránili korozi ve svářecí oblasti při zkoušce postříkáním solným roztokem, po svařování upravujeme sváry a provádíme chemickou pasivaci, čímž odstraňujeme volné železo a obnovujeme ochrannou pasivní vrstvu oxidu chromitého na nerezové oceli třídy 316. Q: Jaké tolerance a kontroly kvality se vztahují na individuálně svařované montážní konzoly a trubkové rámy? A: Přesnost laserově řezaných a tvářených plechových dílů je udržována na úrovni cca 0,1 mm, zatímco kritické CNC obráběné otvory a montážní plochy jsou udržovány na úrovni cca 0,01 mm (a až 0,005 mm při obrábění na pětiosých strojích). Každý projekt prochází více než 39 kontrolami kvality v rámci našeho systému certifikovaného podle ISO 9001, včetně ověření materiálu při příjmu podle normy EN 10204 3.1, prvního vzorkového přezkoušení (FAI) s dimenzionální verifikací pomocí souřadnicového měřicího stroje (CMM), kontrol během výroby pomocí přípravků a koneční kontroly. Otázka: Jaké další povrchové úpravy Deeplink nabízí vedle kartáčování nerezové oceli a pasivace? A: Podle našich Úpravy povrchu kovů kromě směrového kartáčování, leštění a chemické pasivace nerezové oceli nabízíme elektrostatické práškové nátěry (60 až 120 mikronů), anodizaci hliníku (5 až 25 mikronů), zinkování (5 až 15 mikronů) a elektrobarvení / e-barvení (15 až 25 mikronů) pro sestavy z uhlíkové oceli a hliníku.
Studie případu OEM: Zákaznická ochrana námořního vybavení z nerezové oceli 316, trubkový rám a svařená podepřená konzola
Studie případu OEM: Zákaznická ochrana námořního vybavení z nerezové oceli 316, trubkový rám a svařená podepřená konzola
4.0mm and above(až do našeho limitu laserového řezání z nerezové oceli 20 mm): Použito pro přední trojúhelníkovou výztuž, montážní desku kloubového uchycení a montážní desku zadní příčné stěny, které jsou řezány laserem místo lisování, aby odolaly velkým konzolovým zatížením. 2.5mm to 4.0mm: Použito pro konstrukční montážní základnu a těžké rámové podpory. 1.5mm to 2.0mm: Vybráno pro perforovanou ochrannou klec zařízení a horní ochranný kryt, aby byla dosažena rovnováhy mezi tuhostí a redukcí hmotnosti.




Doporučené produkty