\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);
}
});
})();
Caso de personalización de armario para almacenamiento de nueva energía: DEEPLINK aborda tres desafíos principales Cuando una empresa de tecnología de energías nuevas se acercó a DEEPLINK, sus requisitos principales eran claros: personalizar armarios metálicos para un sistema de almacenamiento de energía de próxima generación, cumpliendo tres criterios ineludibles: «ensamblaje de alta precisión, resistencia superior a la corrosión y entrega en masa en 30 días». Los armarios debían permitir la instalación densa de módulos de baterías de almacenamiento de energía, al tiempo que soportaban condiciones operativas exteriores adversas. Esta exigencia no solo ponía a prueba la precisión de los procesos de fabricación, sino que también imponía estándares extremadamente altos para la colaboración en toda la cadena industrial. Puntos críticos principales del proyecto: tres desafíos de fabricación clave Control estricto de la precisión : El armario requería 12 posiciones reservadas para el montaje de módulos, con una tolerancia del diámetro de los orificios de ±0,1 mm y una desviación de verticalidad del marco de ≤0,3 mm. Los procesos tradicionales de fabricación son propensos a errores acumulativos, lo que puede provocar atascos durante el ensamblaje de los módulos; Exigencias elevadas de resistencia a la corrosión : Diseñado para estaciones de energía de almacenamiento al aire libre, el producto debe superar una prueba de niebla salina de 48 horas y soportar ciclos de temperatura de -30℃ a 60℃ tras el tratamiento superficial para prevenir la oxidación durante un uso prolongado; Plazo ajustado de entrega : El cliente necesitaba con urgencia el primer lote de 500 armarios para garantizar la conexión del proyecto a la red eléctrica, disponiendo únicamente de 30 días desde la finalización del diseño hasta la entrega del producto terminado, un periodo mucho más corto que el ciclo de producción estándar en la industria. Soluciones personalizadas: Integración de procesos + Colaboración de cadena completa para superar cuellos de botella 1. Análisis DFM previo a la producción: Optimizar la estructura para reducir la complejidad de fabricación Al recibir la solicitud, el equipo de ingeniería de DEEPLINK inició inmediatamente un análisis de diseño para fabricabilidad (DFM). Integrando los planos 3D proporcionados por el cliente, la estructura original del gabinete de una sola pieza fue rediseñada en un "diseño modular de ensamblaje", dividiéndola en tres componentes principales (marco, panel y soporte de montaje). Esta modificación no solo reduce los riesgos asociados con la fabricación de estructuras complejas, sino que también mejora la eficiencia de ensamblaje. Además, aprovechando instrumentos de precisión que cubren más del 80 % de las capacidades de prueba, el equipo estableció previamente estándares de inspección para dimensiones clave, garantizando así un referente claro de calidad en cada etapa de producción. 2. Combinación de Procesos Clave: Equilibrando Precisión y Resistencia a la Corrosión Proceso de corte por láser : Se emplean máquinas de corte por láser de fibra de alta precisión para chapas de acero inoxidable 304, logrando una precisión de corte de ±0,05 mm, cumpliendo completamente con los requisitos de diámetro de perforación y planicidad del borde de la chapa. En comparación con el corte por plasma tradicional, este proceso ofrece cortes libres de rebabas y deformaciones térmicas, eliminando la necesidad de rectificado adicional y reduciendo significativamente el ciclo de producción; Proceso de Doblado CNC : Se utilizan plegadoras CNC de alta precisión junto con matrices de doblado personalizadas para el conformado multidimensional del marco del gabinete. Un sistema de monitoreo en tiempo real controla la desviación de verticalidad del marco dentro de 0,2 mm, asegurando una alineación precisa de las posiciones de montaje del módulo; Proceso de Soldadura Robótica : Se aplica soldadura robótica de seis ejes para las uniones del gabinete. En comparación con la soldadura manual, produce cordones de soldadura uniformes y completos, con una reducción del 60 % en la deformación por soldadura. Las pruebas no destructivas (NDT) posteriores a la soldadura eliminan soldaduras incompletas o omitidas, garantizando la integridad estructural; Proceso de Tratamiento Dual de Superficie : Basándose en la resistencia inherente superior a la corrosión del acero inoxidable 304, el proceso comienza con un pulido electrolítico para eliminar impurezas superficiales y capas de óxido, mejorando así el acabado superficial y reforzando la resistencia a la corrosión del material base. Posteriormente, un tratamiento de pasivación forma una película pasiva densa y estable contra la corrosión (cumpliendo con los estándares ambientales ROHS). El producto final no presenta óxido ni deslaminación tras una prueba de niebla salina de 48 horas, lo que lo hace completamente adecuado para entornos exteriores severos. 3. Producción Automatizada + Colaboración de Cadena Completa: Acortar Ciclos de Entrega Impulsado por las 6 líneas de producción automatizadas de DEEPLINK (nivel de automatización del 80 %), todo el flujo de fabricación—desde el corte, doblado y soldadura hasta el tratamiento superficial, ensamblaje e inspección—está integrado de forma fluida. Durante la producción, un Sistema de Ejecución de Manufactura (MES) permite el monitoreo en tiempo real del avance productivo, mientras que se activan canales verdes para los procesos críticos. Además, se integran recursos de la cadena de suministro para almacenar previamente materiales brutos de acero inoxidable 304, evitando retrasos por materiales. En definitiva, se completó la fabricación integral de 500 armarios en 30 días, 2 días antes del plazo establecido por el cliente. Comentarios del Cliente y Cooperación a Largo Plazo Después de la entrega, el cliente realizó pruebas integrales de aceptación a través de una agencia de inspección autorizada e independiente. Indicadores como precisión, resistencia a la corrosión y resistencia estructural cumplieron con los estándares en el primer intento, con una tasa de éxito del 100 % en el ensamblaje de módulos. El director de compras de la empresa de tecnología en energías renovables declaró: "La precisión en los procesos y la eficiencia en la entrega de DEEPLINK superaron nuestras expectativas. Sus capacidades profesionales en la fabricación de estructuras complejas y en la adaptación a entornos adversos refuerzan nuestra confianza para futuras colaboraciones en proyectos". Actualmente, ambas partes han firmado un acuerdo estratégico anual, estableciendo a DEEPLINK como proveedor clave para gabinetes de almacenamiento de energía. ¿Por qué elegir DEEPLINK? Capacidades de servicio integral : Ofrecemos soluciones completas de procesamiento metálico, desde el diseño de planos y pruebas de muestras hasta la producción en masa, empaquetado y envío, eliminando la necesidad de que los clientes coordinen con múltiples proveedores; Certificaciones de Calidad Rigurosas : Posee certificaciones autorizadas incluyendo ISO9001/14001/45001, SGS y ROHS. Cada producto pasa por más de 39 pasos de inspección de control de calidad, garantizando trazabilidad completa de la calidad; Respuesta Flexible de Personalización : Ofrece servicios OEM/ODM con un equipo de posventa disponible las 24 horas para responder consultas técnicas rápidamente. Las soluciones de procesos pueden optimizarse para condiciones operativas especiales; Automatización + Tecnología de Precisión : Combina un 80 % de automatización con procesos clave como corte láser, doblado CNC y soldadura robótica para equilibrar precisión y eficiencia. Si tiene necesidades de personalización para chasis metálicos, gabinetes u otro procesamiento de metales—ya sea que enfrente desafíos en precisión, adaptación ambiental o plazos de entrega—DEEPLINK puede ofrecerle soluciones a medida.
Caso de personalización de armario para almacenamiento de nueva energía: DEEPLINK aborda tres desafíos principales







Productos recomendados