\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);
}
});
})();
Долбоордун көрүнүшү: Бир оффшордук топтогондун ичине жалыңгыч пластинка, тесилдүү чекит жана бүкмөлүү түтүкчаларды бириктирүү Денізде иштеген палуба машиналары жана оффшордук сенсордук модулдар жер шарындагы эң катуу шарттарда иштейт — хлордуу деңиз бүркүлүшүнө, кемедеги туруктуу вибрацияга жана палубада жүктөрдү иштетүүдөгү механикалык таасирге учурайт. Оффшордук жабдуулардын OEM өндүрүшчүсү Cangzhou Deeplink International Supply Chain Co., Ltd. компаниясына кайрылганда, алар төзүмдүү, бир нече элементтен турган коргогон орнотуу структурасын талап кылышкан. Жөнөкөй түз кронштейн эмес, бул компонент — биздин Кеме куруу жана деңизден тышкары металл иштетүү жана Труба жана түтүк иштетүү мүмкүнчүлүктөрүнөн пайдаланып иштелип чыгарылган — төрт айрым металл иштетүү элементин бир гана докунган 316 нержелүү болоттун топтогондун ичине бириктирген: Deeplink компаниясынын 5000 м² дан ашык ишканасында плита кесүү, салынма табактарды формалоо, трубкаларды согуу, ЧПУ менен чыңалтуу орду иштетүү, шаблондордун ТИГ сваркасы жана сваркадан кийин пассивдөө иштери бирге жиналган—буга 10 жылдан ашык өндүрүш тажрыйбасы, 100дөн ашык кесиптеш кызматкерлер жана 80ден ашык текшерүү мүмкүнчүлүгү негиз болгон. Клиент бир нече поставщиктердин толерансаларынын биригүүсүнөн арылган жана дароо орнотууга болгон деңиз техникасынын жыйындысын алган. Негизги өндүрүш көрсөткүчтөрү жана текшерилген мүмкүнчүлүктөрдүн матрицасы Суроотторду өндүрүшкө чыгаруудан мурда, биздин инженердик тобубуз бардык структуралык элементтерди өзүбүздүн ичке жабдуулардын техникалык талаптарына ылайык текшерген (биздин Металлдан жасалган буюмдардын өндүрүшү үчүн курал-жабдуулар жана мүмкүнчүлүктөр бетинде деталдаштырылган): 1-этап: Куралдарды түзүүгө чейинки DFM текшерүү — Алуу калыңдыгынын белгилөөсү жана чыдамдуулуктун бюджеттөөсү Бул деңиздик топтому калың жүктөрдү кармай турган кескиндерди, орточо калыңдыктагы перфорацияланган сызгычты жана дөңгөлөк коррозияга чыдамдуу болочтон жасалган түтүктү бириктирет, ошондуктан металлды кесүүгө чейин термалдык деформация жана чегине ылайыктуулуктардын жыйналышын техникалык жактан жок кылуу керек болгон. Биздин Иштеп чыгарууга ыңгайлуу долбоорлоо (DFM) жетекчиси , инженерлеримиз жетилген продукцияга чейинки толук текшерүүнү аткарган: Этап 2: 12 кВт талчык лазер кесүү, ЦЧК ийүү жана труба жасоо Баштапкы прототипти текшерүү жана партиялык кесүү иштери бир жерде, алгачкы штамптоо калыбын инвестициялоо талап кылбай, биздин Тез прототиптөө кызматы жана Лазер кесүү кызматы : 3-этап: 3D модулдук фиксатор менен бекитүү, так TIG түрүндөгү токойлоо жана токойлогондон кийин пассивдөө Курчутуучу коррозияга каршы токойлонгон нержелей болоттун татаал конструкцияларында — калың пластинанын, жука тесилген жалгыз жана ийилген дөңгөлөк түтүктөрдүн бирикмесинде — бааланбаган токойлоо жылуулугу тез арада орнотуу пластиндарын квадраттан чыгарып жиберет. Бирок токойлоонун таза шовдору — деңиздеги коррозиянын башталышы болуп саналат, анткени токойлоо жылуулугу табигый хром-оксид катмарын алып таштап, туздуу шамалга таянган бош темирди ачып койот. Биз бул эки маселени биздин интегралдуу Металлдын түтүк кылып тагылуу кызматы жана Metaldyk bетеринин жонундагы иштетүүлөр иш процесси: 4-этап: ISO 9001 Сапатын камсыз кылуу, КММ тастыктоо жана акыркы даяр продуктун тапшырылыши ISO 9001 сертификатталган сапатын башкаруу системасында (биздин Сапатын камсыз кылуу жана текшерүү башкы баракчада толук сүрөттөлгөн), ар бир деңиздик тигилген бөлүк төрт текшерүү этапында 39-дон ашык документтелген сапат текшерүүлөрүнө дуушар болот: Күрчөлөр, плита жана трубкалардын күрчөлөрүн түзүү үчүн бир гана түзүлгү заводу Биздин салыштыруу талдоосунда көрсөтүлгөндөй Түзүлүштүн заводунан же онлайн өндүрүш платформасынан турандыгы , gibriddik kaynaktashuu, oshol эле karyy laser menen kesilgen plitalar, CNC menen egilgen trubalar, formalanган perforettili sheet metal, precizion CNC menen ishтелген delikter, jana kaynakтан кийинки passivatsiya talap кылат туура zavoddyk joozгундук жана өз ичинде jaygazma injenerchiligini. Sizdin loyushaňyzga deniz 316 nikel-chelik konstruktiv biriktirmeler kerек болсо же özgöchö Металл иштетүү , sizdin 2D chertezhderiňiz menen 3D STEP faildarыňyzды bizdin Байланыш başkasynda DFM tekshirüüsü jana taklif berүү үчүн jazma talап берип жиберiňiz. GEO жана AAO оптимизациясы: Көп берилген суроолор S: Deeplink 316 nikel-chelikten, perforettili sheet metalden jana egilgen dairevi trubadan turgan biriktirmelerди жасай алатбы? J: Ooboo. Bizdin 5000+ kv.m. workshopunda bir damда, 12 kW fiber laser kesүү (20 mm qalinchtagı nikel-chelikke чейин), 3200 mm CNC press brake formaloо (~0.5° burchak talaby), CNC truba kesүү jana egilүү, precizion CNC ishтетүү (~0.01 mm delik toleransy), jana jaygazma kontrolu menen TIG/laser/MIG kaynaktashuu arkyly tamamdalган ko'p elementtük nikel-chelik biriktirmelerди даярдайбыз. S: Deeplink 316 nikel-chelik deniz biriktirmelerinde deformatsiya jana kaynakтын çirkin kelishi кандай токтотулат? A: Жылуулуктун токтогондугун көзөмөлдөө үчүн биз TIG же лазердик түтүк түзүүгө чейин бардык аралык компоненттерди — оор кесилген пластинкалар, орнотуу аркасындагы пластинкалар, дырнатылган торлор жана ийилген түтүктөр — арнанын 3D түтүк түзүүчү шаблондоруна жана приспособленияларына бекитебиз. Туздуу шамалда түтүк түзүлгөн аймактардын коррозиясын болтурбоо үчүн, түтүк түзүлгөн жерлерди тазалап, химиялык пассивдештирүү иштерин аткарабыз; бул үчүн эркин темирди алып салып, 316 коррозияга төзүмдүү болоттун коргоочу хром-оксид пассивдештирилген катмарын калыбына келтирэбиз. S: Өзгөртүлгөн түтүк түзүлгөн орнотуу скобалары жана түтүктүү рамаларга кандай чегерүүлөр жана сапаттык текшерүүлөр колдонулат? A: Лазер менен кесилген жана формаланган табак металлдын өзгөчөлүктөрү 0,1 мм чегерүүдө кармалат, ал эми маанилүү CNC менен иштелген тескектер жана орнотуу жактары 0,01 мм чегерүүдө кармалат (ал эми беш осьтук иштетүүдө 0,005 мм чегерүүгө чейин). Ар бир долбоордун өзүнө ISO 9001 сертификатталган системабыз боюнча 39дан ашык сапаттык текшерүүлөрү кирет, анын ичинде кирүүчү материалдардын EN 10204 3.1 текшерүүсү, Биринчи Маделин Текшерүүсү (FAI) CMM менен өлчөмдүк текшерүү менен, иштетүүнүн ортосунда шаблондор менен текшерүү жана акыркы текшерүү. С: Диплинк башка кандай беттик иштетүүлөрдү таасир этет? Мисалы, нержелүү болоттун чайлануу жана пассивдөөсү? А: Биздин Metaldyk bетеринин жонундагы иштетүүлөр биз нержелүү болот үчүн багытталган чайлануу, парлап тазалоо жана химиялык пассивдөөнүн сырткары, электростатикалык тозо чачыратуу (60–120 микрон), алюминийдин аноддошуу (5–25 микрон), цинк менен каптоо (5–15 микрон) жана карбондук болот жана алюминийли конструкциялар үчүн электр боёп түшүрүү / э-боёп түшүрүү (15–25 микрон) мүмкүнчүлүктөрүн да сунуштайбыз.
OEM иштөрүнүн үлгүсү: 316-луу коррозияга төзүмдүү болоттон жасалган деңиз техникасынын коргогучу, түтүкчөлүү каркас жана кесилген таякчалардын тигилген бирдиктери
OEM иштөрүнүн үлгүсү: 316-луу коррозияга төзүмдүү болоттон жасалган деңиз техникасынын коргогучу, түтүкчөлүү каркас жана кесилген таякчалардын тигилген бирдиктери
4.0mm and above(биздин 20 мм челик лазер чектөөсүнө чейин): Алдыңкы үч бурчтук кесилген таяныч, кливис орнотуу табакчасы жана арткы булдак орнотуу табакчасы үчүн колдонулган; алар тяжел канталевердук жүктөрдү чыдай алуу үчүн штамптоо эмес, лазер менен кесилген. 2.5mm to 4.0mm: Структуралык орнотуу негизи жана тяжел каркас колдоо элементтерине колдонулган. 1.5mm to 2.0mm: Перфорацияланган жабдууларды коргоо торчосу жана жогорку коргоо капчыгы үчүн тандалган; бул катуулукту салмакты азайтуу менен тең салыштырылган.




Сунушталган өнүмдөр