\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);
}
});
})();
Cas de personnalisation d'armoire de stockage d'énergie nouvelle génération : DEEPLINK relève trois défis fondamentaux Lorsqu'une entreprise de technologie de nouvelle énergie a contacté DEEPLINK, ses besoins principaux étaient clairs : personnaliser des armoires métalliques pour un système de stockage d'énergie de nouvelle génération, répondant à trois critères incontournables — « assemblage de haute précision, excellente résistance à la corrosion et livraison en masse en 30 jours ». Les armoires doivent permettre l'installation dense de modules de batteries de stockage tout en résistant à des conditions de fonctionnement extérieures difficiles. Cette exigence mettait non seulement à l'épreuve la précision des procédés de fabrication, mais imposait également des normes extrêmement élevées en matière de collaboration sur l'ensemble de la chaîne industrielle. Problématiques clés du projet : Trois défis critiques de fabrication Contrôle strict de la précision : L'armoire nécessitait 12 positions de montage réservées pour les modules de batteries, avec une tolérance de diamètre de trou de ±0,1 mm et un écart de verticalité du cadre inférieur ou égal à 0,3 mm. Les procédés de fabrication traditionnels sont sujets à des erreurs cumulatives, pouvant entraîner des blocages lors de l'assemblage des modules ; Exigences élevées en matière de résistance à la corrosion : Destiné aux stations de stockage d'énergie en extérieur, le produit doit subir un test de brouillard salin de 48 heures et résister à des cycles de température allant de -30℃ à 60℃ après traitement de surface afin d'éviter la corrosion lors d'une utilisation prolongée ; Délai de livraison serré : Le client avait urgemment besoin du premier lot de 500 armoires pour garantir la connexion au réseau du projet, avec seulement 30 jours prévus entre la finalisation de la conception et la livraison du produit fini — bien en deçà du cycle de production standard de l'industrie. Solutions sur mesure : Intégration des processus + Collaboration en chaîne complète pour surmonter les goulots d'étranglement 1. Analyse DFM en phase préliminaire : Optimiser la structure pour réduire la complexité de fabrication Dès réception de la demande, l'équipe d'ingénierie de DEEPLINK a immédiatement lancé une analyse de conception pour la fabricabilité (DFM). En intégrant les dessins 3D fournis par le client, la structure initiale du boîtier en une seule pièce a été repensée selon un « design d'assemblage modulaire », divisée en trois composants principaux (châssis, panneau et support de fixation). Cette modification permet non seulement d'atténuer les risques liés à la fabrication de structures complexes, mais améliore également l'efficacité d'assemblage. De plus, grâce à des instruments de précision couvrant plus de 80 capacités de test, l'équipe a préétabli des normes d'inspection des dimensions clés afin de garantir que chaque étape de production dispose d'une référence qualité claire. 2. Combinaison des procédés clés : Équilibre entre précision et résistance à la corrosion Procédé de découpe laser : Des machines de découpe au laser à fibre de haute précision sont utilisées pour les tôles en acier inoxydable 304, atteignant une précision de découpe de ±0,05 mm — répondant entièrement aux exigences en matière de diamètre des trous et de planéité des bords des tôles. Par rapport à la découpe plasma traditionnelle, ce procédé offre des découpes sans bavure ni déformation thermique, éliminant ainsi la nécessité d'un meulage supplémentaire et réduisant considérablement le cycle de production ; Procédé de pliage CNC : Des presse-plieuses CNC de haute précision associées à des matrices de pliage sur mesure sont utilisées pour le formage multidimensionnel du châssis de l'armoire. Un système de surveillance en temps réel des angles maintient l'écart de verticalité du châssis à moins de 0,2 mm, garantissant un alignement précis des positions de montage des modules ; Procédé de soudage robotisé : Un soudage robotisé à six axes est utilisé pour les assemblages de l'armoire. Par rapport au soudage manuel, il produit des soudures uniformes et complètes, avec une réduction de 60 % de la déformation liée au soudage. Des essais non destructifs (END) après soudage éliminent les soudures incomplètes ou manquantes, garantissant l'intégrité structurelle ; Procédé de traitement double surface : S'appuyant sur la résistance intrinsèque supérieure à la corrosion de l'acier inoxydable 304, le procédé commence par un polissage électrolytique permettant d'éliminer les impuretés de surface et les couches d'oxyde — améliorant ainsi la finition de surface tout en renforçant la résistance à la corrosion du matériau de base. Un traitement de passivation ultérieur forme un film de passivation anti-corrosion dense et stable (conforme aux normes environnementales ROHS). Le produit final ne présente ni rouille ni délamination après un test de brouillard salin de 48 heures, ce qui le rend parfaitement adapté aux environnements extérieurs sévères. 3. Production automatisée + collaboration en chaîne complète : Réduction des délais de livraison Propulsé par les 6 lignes de production automatisées de DEEPLINK (niveau d'automatisation de 80 %), l'ensemble du processus de fabrication — du découpage, cintrage et soudage au traitement de surface, à l'assemblage et à l'inspection — est intégré de manière fluide. Pendant la production, un système d'exécution de fabrication (MES) assure une surveillance en temps réel de l'avancement, tandis que des circuits verts sont activés pour les processus critiques. Les ressources de la chaîne d'approvisionnement sont également intégrées afin de pré-stocker les matières premières en acier inoxydable 304, évitant ainsi les retards liés aux matériaux. Au final, la fabrication complète de 500 armoires a été réalisée en 30 jours, soit 2 jours avant l'échéancier du client. Retour client et coopération à long terme Après la livraison, le client a effectué des tests d'acceptation complets via un organisme de contrôle tiers accrédité. Les indicateurs tels que la précision, la résistance à la corrosion et la solidité structurelle ont tous satisfait aux normes dès le premier essai, avec un taux de réussite de 100 % pour l'assemblage des modules. Le directeur des achats de la société de technologie énergétique a déclaré : « La précision des processus et l'efficacité de livraison de DEEPLINK ont dépassé nos attentes. Ses compétences professionnelles en matière de fabrication de structures complexes et d'adaptation aux environnements difficiles renforcent notre confiance dans les futures collaborations sur des projets. » Actuellement, les deux parties ont signé un accord annuel de coopération stratégique, désignant DEEPLINK comme fournisseur principal pour ses armoires de stockage d'énergie. Pourquoi choisir DEEPLINK ? Capacités de service de bout en bout : Proposer des solutions intégrées de transformation métallique — de la conception des plans et des essais de prototypes à la production de masse, en passant par l'emballage et l'expédition — éliminant ainsi la nécessité pour les clients de coordonner plusieurs fournisseurs ; Certifications de qualité rigoureuses : Détient des certifications officielles incluant ISO9001/14001/45001, SGS et ROHS. Chaque produit subit plus de 39 étapes d'inspection AQ, garantissant une traçabilité complète de la qualité ; Réponse flexible à la personnalisation : Prend en charge les services OEM/ODM avec une équipe après-vente disponible 24/7 pour répondre rapidement aux demandes techniques. Les solutions peuvent être optimisées pour des conditions de fonctionnement spéciales ; Automatisation + Technologie de précision : Allie 80 % d'automatisation à des procédés clés tels que la découpe laser, le pliage CNC et le soudage robotisé afin d'assurer un équilibre entre précision et efficacité. Si vous avez des besoins de personnalisation pour des châssis métalliques, des armoires ou d'autres pièces métalliques — que ce soit en matière de précision, d'adaptation environnementale ou de délais de livraison — DEEPLINK peut vous proposer des solutions sur mesure.
Cas de personnalisation d'armoire de stockage d'énergie nouvelle génération : DEEPLINK relève trois défis fondamentaux







Produits recommandés