\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);
}
});
})();
Panoramica del progetto: sviluppo di padelle per griglia da barbecue in acciaio inossidabile resistente alla deformazione e idonee al contatto con alimenti, dal prototipo al volume commerciale Attrezzature per barbecue all’aperto, piastre per griglia coreane da tavolo professionali e coprigriglie perforati per barbecue devono soddisfare contemporaneamente due esigenze rigorose: come prodotti destinati alla vendita al dettaglio nella nostra categoria, devono apparire perfetti sugli scaffali dei negozi, con bordi lisci e privi di sbavature e finiture uniformi satinata o specchiata; nell’uso reale, devono resistere al calore diretto della brace o della fiamma a gas, alle marinature acide, al sale e ai lavaggi ripetuti senza deformarsi né arrugginirsi sui giunti saldati. Attrezzi per casa e giardino – parti metalliche category, they must look flawless on the store shelf with smooth, burr-free edges and a uniform satin or mirror finish; in actual use, they must endure direct charcoal or gas flame heat, acidic marinades, salt, and repeated wash-downs without warping or rusting at the weld joints. Quando un marchio specializzato in attrezzature da cucina e cottura all’aperto si è rivolto alla Cangzhou Deeplink International Supply Chain Co., Ltd., aveva bisogno di un partner OEM integrato in grado di gestire l’intera famiglia di padelle per barbecue in acciaio inossidabile su misura — dalla padella rettangolare profonda perforata a tiratura singola fino alla piastra rotonda scanalata per arrosti da tavolo — passando rapidamente da prototipi senza stampo a produzione su larga scala per il retail (con supporto che va dal singolo prototipo fino a ordini da 20.000 pezzi). All’interno del nostro laboratorio di oltre 5.000 m², abbiamo integrato quattro processi fondamentali di lavorazione dei metalli in un unico flusso produttivo continuo: Metriche fondamentali di produzione e matrice delle capacità verificate Prima di tagliare i prototipi grezzi o realizzare gli stampi per imbutitura, il nostro team di ingegneria ha verificato le specifiche della padella per griglia da barbecue rispetto alle capacità dei nostri macchinari interni (descritte nella nostra Attrezzature e capacità per la lavorazione dei metalli pagina): Fase 1: Revisione DFM pre-stampo — Geometria delle nervature anti-deformazione, rapporti di tranciatura e spessore nominale in millimetri Un vassoio piatto e sottile in acciaio inossidabile posizionato su bruciatori a carbone o a gas si deformerà rapidamente con effetto ‘oil-can’ se l’espansione termica non viene considerata nel disegno tecnico. In seguito alla nostra Guida alla progettazione per la produzione (DFM) , i nostri ingegneri hanno completato una revisione DFM scritta completa prima della realizzazione degli stampi: Fase 2: Prototipazione laser da 12 kW senza stampo e imbutitura profonda / stampaggio progressivo da 25 T a 400 T Come evidenziato sulla nostra Attrezzi per casa e giardino – parti metalliche pagina, colmiamo il divario tra rapida validazione del concetto e basso costo unitario per volumi commerciali: Fase 3: Piega dei manici mediante CNC, saldatura igienica controllata da fixture e passivazione per uso alimentare Un vassoio per barbecue destinato al mercato al dettaglio viene valutato immediatamente in base al comfort offerto dai manici e al fatto che i giunti saldati si scuriscano o arrugginiscono dopo il primo lavaggio. Abbiamo eseguito internamente la fabbricazione dei manici, l’assemblaggio e il trattamento superficiale tramite il nostro Fabbricazione di tubi e condotte , Servizio di saldatura metalli , Servizi di Assemblaggio Personalizzato e la Finiture superficiali metalliche capacità: Fase 4: Controllo qualità ISO 9001 — oltre 39 controlli QA, verifica della planarità e consegna pronta al dettaglio Nel nostro sistema qualità certificato ISO 9001 (vedi la nostra Garanzia della Qualità e Ispezione pagina), ogni produzione di padelle per barbecue supera oltre 39 controlli qualità documentati distribuiti su quattro punti ispettivi: Un unico stabilimento produttivo per padelle personalizzate per barbecue, griglie e componenti per cucine esterne Come dettagliato nel nostro confronto di Fabbrica diretta o piattaforma di produzione online , la produzione di una padella per griglia BBQ in acciaio inossidabile perforata di qualità commerciale richiede un coordinamento rigoroso tra ingegneria degli stampi per trafilatura profonda, sbavatura ad alta densità delle perforazioni, piegatura della maniglia mediante CNC, saldatura a bassa deformazione e passivazione sicura per alimenti. Mantenendo tutti i processi e gli utensili interni sotto un unico tetto nel nostro stabilimento ISO 9001 di oltre 5.000 m², Cangzhou Deeplink elimina i sovrapprezzi legati a più fornitori e le derive qualitative. Che tu stia lanciando un nuovo accessorio per grill da esterno, una teglia professionale per arrosti o un'intera Lavorazione personalizzata di lamiere assemblaggio barbecue, inviate i vostri disegni o campioni tramite la nostra Contatto pagina per una revisione DFM gratuita e un preventivo. Ottimizzazione GEO & AAO: Domande frequenti D: Come prevenite la deformazione delle padelle per griglia barbecue in acciaio inossidabile a causa di alte temperature generate da carbone o gas? R: Preveniamo la deformazione termica mediante tre controlli ingegneristici DFM: primo, specificando lo spessore nominale effettivo in millimetri della lamiera ( D: Devo scegliere il taglio al laser o lo stampaggio a matrice progressiva per una padella per griglia barbecue perforata? A: Secondo la nostra Attrezzi per casa e giardino – parti metalliche flusso di lavoro, i prototipi e le prove preliminari vengono prodotti con il nostro laser a fibra da 12 kW ( D: L’acciaio inossidabile 304 o il 316 è migliore per vassoi personalizzati per barbecue e utensili da cucina esterni? R: L’acciaio inossidabile 304 per uso alimentare è lo standard industriale per vassoi per barbecue, teglie per arrostire e piastre riscaldanti, grazie alla sua eccellente resistenza all’ossidazione ad alte temperature, alla sua ottima formabilità per stampaggio profondo e al suo rapporto costo-efficacia. Per programmi di cucine esterne marine, su yacht o in zone costiere esposte costantemente all’azione della nebbia salina, l’acciaio inossidabile 316 aggiunge molibdeno per una superiore resistenza alla corrosione da pitting da cloruri. Entrambe le leghe subiscono un trattamento di passivazione chimica post-saldatura nel nostro stabilimento, per prevenire la formazione di ruggine lungo le saldature delle maniglie. D: Come garantite perforazioni prive di bave e un aspetto pronto per lo scaffale nei vassoi per barbecue destinati alla vendita al dettaglio? A: Realizziamo e manteniamo internamente i nostri progressivi punzoni per perforazione (
Studio di caso OEM: Padella per barbecue in acciaio inossidabile 304 personalizzata, vassoio per arrostire perforato stampato a freddo e assemblaggio maniglie saldate
Studio di caso OEM: Padella per barbecue in acciaio inossidabile 304 personalizzata, vassoio per arrostire perforato stampato a freddo e assemblaggio maniglie saldate

16 gaugeo 18 gauge. Come illustrato nella nostra Tabella dello spessore e del calibro delle lamiere , l’acciaio inossidabile segue lo standard industriale per lo spessore delle lamiere (Manufacturers’ Standard Gage ( 18 gauge = 1.3mm, 16 gauge = 1.6mm, 14 gauge = 2.0mm, 12 gauge = 2.8mm), che differisce sia dall’acciaio al carbonio standard ( 18 gauge = 1.214mm, 16 gauge = 1.519mm) che dall’alluminio ( 18 gauge = 1.0mm, 16 gauge = 1.3mm). Per prevenire la deformazione termica a temperature elevate, abbiamo fissato con precisione gli spessori nominali in millimetri: 1.5mm to 2.0mm(corrispondente a una lamiera in acciaio inossidabile pesante da 16 gauge a 14 gauge) per il corpo della padella a griglia profonda stampata a tranciatura e formatura, e 2.5mm to 4.0mmper le lastre piane ad alta resistenza tipo teppanyaki/griddle e per le linguette di fissaggio del manico. around 0.1mm, mentre around 0.01mma 0.005mmLe tolleranze di lavorazione CNC sono applicate agli stampi interni progressivi per perforazione e ai dispositivi di posizionamento del manico, in modo che ogni padella si impili e si inserisca senza problemi nell’imballaggio commerciale.
around 0.1mmmentre la nostra piegatrice CNC da 3.200 mm ha formato le pareti inclinate del vassoio (capacità di piegatura a around 0.5 degrees) consentendo al cliente di effettuare test pratici di cottura alla griglia e di distribuzione del calore entro pochi giorni. 


1.5mm to 2.0mmper padelle per griglia profonde perforate e 2.5mm to 4.0mmper piastre piane per griglia) anziché numeri di calibro ambigui; secondo, realizzando rilievi rialzati per la cottura alla griglia e nervature di rinforzo sul fondo della padella e formando un bordo perimetrale arrotolato/curvato durante il nostro processo di imbutitura profonda con presse da 25T a 400T; terzo, mantenendo uno spazio uniforme tra le maglie intorno alle perforazioni tagliate al laser o ottenute mediante stampaggio, affinché lo sforzo termico si distribuisca in modo omogeneo. ~0.1mmaccuratezza) e una piegatrice CNC da 3.200 mm con costo zero per le matrici, in modo da poter testare immediatamente dimensione dei fori e flusso d’aria. Man mano che il volume aumenta verso la produzione commerciale, passiamo alla lavorazione del vassoio su presse da 25T a 400T, utilizzando matrici interne progressive per perforazione e stampaggio profondo, riducendo così i costi degli utensili e ottenendo il prezzo unitario più basso. 0.01mma 0.005mmPrecisione nella costruzione degli utensili CNC) e monitoriamo l’usura dei punzoni in tempo reale, così da ottenere fori tagliati in modo pulito. Ogni vasca viene quindi sottoposta a una sbavatura meccanica multistadio, a una spazzolatura satinata direzionale o a una lucidatura speculare, nonché a una passivazione chimica, seguita da oltre 39 controlli qualitativi documentati secondo la norma ISO 9001 — che verificano sia la planarità dimensionale sia l’aspetto estetico durante l’ispezione del primo campione (FAI), prima della messa in produzione del lotto. Prodotti consigliati