\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);
}
});
})();
Aperçu du projet : conception de poêles à barbecue en acier inoxydable résistant à la déformation et conforme aux normes alimentaires, du prototype au volume commercial Ustensiles de cuisine pour barbecue extérieur, plaques de grill coréen professionnelles pour table et couvercles perforés pour barbecue doivent répondre simultanément à deux exigences rigoureuses : en tant que produits destinés à la vente au détail dans notre Outils pour la maison et le jardin – Pièces métalliques catégorie, ils doivent présenter un aspect impeccable sur les étagères des magasins, avec des bords lisses et sans bavures ainsi qu’une finition satinée ou miroir uniforme ; lors d’une utilisation réelle, ils doivent résister à la chaleur directe des braises ou de la flamme gazeuse, aux marinades acides, au sel et aux lavages répétés, sans se déformer ni rouiller au niveau des soudures. Lorsqu’une marque spécialisée dans les équipements de cuisine et de cuisson extérieure s’est adressée à Cangzhou Deeplink International Supply Chain Co., Ltd., elle recherchait un partenaire OEM intégré capable de produire, depuis des prototypes rapides sans matrice jusqu’à une fabrication en grande série destinée au commerce de détail, une gamme complète de poêles à grillades en acier inoxydable sur mesure — comprenant notamment une poêle rectangulaire emboutie profonde perforée servant de couvercle pour grill et une plaque ronde à fentes destinée au rôtissage sur table (capacité de production allant d’un seul prototype à des commandes de 20 000 pièces). Au sein de notre atelier de plus de 5 000 m², nous avons combiné quatre procédés métallurgiques fondamentaux en un flux de production continu et fluide : Indicateurs clés de fabrication et matrice des capacités vérifiées Avant de découper les pièces prototypes ou de fabriquer les matrices d’estampage, notre équipe d’ingénierie a validé les spécifications de la poêle à grillades en les confrontant aux capacités de nos équipements internes (détail fourni sur notre Équipements et capacité de fabrication métallique page) : Étape 1 : Examen préliminaire DFM avant outillage — géométrie des nervures anti-déformation, rapports d’emboutissage et épaisseur nominale en millimètres Un plateau en acier inoxydable plat et mince, placé directement au-dessus de braises ou de brûleurs à gaz, se déforme rapidement (effet « oil-can ») et se voile si la dilatation thermique n’est pas prise en compte sur le plan. Guide de conception pour la fabrication (DFM) , nos ingénieurs ont réalisé un examen DFM écrit complet avant la fabrication de l’outillage : Étape 2 : Prototypage laser sans matrice (12 kW) et emboutissage profond / estampage progressif (25 T à 400 T) Comme mis en évidence sur notre Outils pour la maison et le jardin – Pièces métalliques page, nous comblons l’écart entre la validation rapide des concepts et le faible coût unitaire à volume commercial : Étape 3 : Pliage des poignées par CNC, soudage sanitaire contrôlé par fixations et passivation de qualité alimentaire Un bac à barbecue destiné au commerce de détail est jugé immédiatement selon le confort procuré par ses poignées et selon le fait que les joints de soudure se décolorent ou rouillent après le premier lavage. Nous avons réalisé la fabrication des poignées, leur assemblage et leur traitement de surface en interne grâce à notre Fabrication de tubes et de tuyaux , Service de soudage métallique , Services d'assemblage sur mesure et la Finitions de surfaces métalliques capacités : Étape 4 : Contrôle qualité ISO 9001 — plus de 39 vérifications qualité, vérification de planéité et livraison prête pour la vente au détail Dans le cadre de notre système qualité certifié ISO 9001 (voir notre Assurance Qualité et Inspection page), chaque série de production de poêles à barbecue traverse plus de 39 contrôles qualité documentés répartis sur quatre paliers d’inspection : Une seule usine directe pour les poêles à grille BBQ sur mesure, les plaques chauffantes et les accessoires de cuisine extérieure Tel que détaillé dans notre comparatif de Usine directe ou plateforme de fabrication en ligne , la fabrication d’une poêle à grille BBQ en acier inoxydable perforé de qualité commerciale exige une coordination rigoureuse entre l’ingénierie des matrices d’emboutissage profond, le débarrassage haute densité des perforations, le cintrage CNC des poignées, le soudage à faible déformation et la passivation conforme aux normes alimentaires. En regroupant l’ensemble des procédés et des outillages internes sous un même toit, dans notre usine certifiée ISO 9001 de plus de 5 000 m², Cangzhou Deeplink élimine les majorations liées aux fournisseurs multiples ainsi que les dérives de qualité. Que vous lanciez un nouveau couvercle pour barbecue extérieur, une poêle de rôtissage professionnelle ou une gamme complète Fabrication sur mesure de tôlerie ensemble pour barbecue, envoyez vos plans ou échantillons via notre Contactpage pour un examen DFM gratuit et un devis. Optimisation GEO et AAO : Questions fréquemment posées Q : Comment évitez-vous que les poêles à grille pour barbecue en acier inoxydable ne se déforment pas sous une chaleur élevée provenant de charbon de bois ou de gaz ? R : Nous évitons la déformation thermique grâce à trois contrôles d’ingénierie DFM : premièrement, en spécifiant l’épaisseur nominale réelle en millimètres ( Q : Dois-je choisir la découpe au laser ou l’estampage par matrice progressive pour une poêle à grille pour barbecue perforée ? A : Selon notre Outils pour la maison et le jardin – Pièces métalliques flux de travail, les prototypes et les essais sont fabriqués sur notre laser à fibre de 12 kW ( Q : Le 304 ou le 316 en acier inoxydable est-il meilleur pour les poêles à barbecue sur mesure et les ustensiles de cuisine extérieure ? R : L’acier inoxydable alimentaire 304 est le matériau standard du secteur pour les poêles à barbecue, les plateaux à rôtir et les plaques chauffantes, offrant une excellente résistance à l’oxydation à haute température, une formabilité remarquable en emboutissage profond et une efficacité économique. Pour les programmes de cuisines extérieures marines, de yachts ou côtiers exposés en continu aux embruns salins, l’acier inoxydable 316 ajoute du molybdène afin d’assurer une résistance supérieure à la corrosion par piqûres chlorurées. Les deux nuances subissent une passivation chimique après soudage dans notre usine afin d’éviter toute rouille au niveau des soudures des poignées. Q : Comment garantissez-vous des perforations sans bavures et une apparence prête à être exposée en rayon pour les poêles à barbecue destinées à la vente au détail ? A : Nous concevons et entretenons nos matrices de poinçonnage progressif en interne (
Étude de cas OEM : Poêle à barbecue en acier inoxydable 304 sur mesure, plateau à rôtir perforé embouti profond et ensemble de poignées soudées
Étude de cas OEM : Poêle à barbecue en acier inoxydable 304 sur mesure, plateau à rôtir perforé embouti profond et ensemble de poignées soudées

16 gaugeou 18 gauge. Comme illustré dans notre Tableau d’épaisseur et de jauge de tôle , l’acier inoxydable suit la norme « Manufacturers’ Standard Gage » ( 18 gauge = 1.3mm, 16 gauge = 1.6mm, 14 gauge = 2.0mm, 12 gauge = 2.8mm) qui diffère à la fois de l’acier au carbone standard ( 18 gauge = 1.214mm, 16 gauge = 1.519mm) et de l’aluminium ( 18 gauge = 1.0mm, 16 gauge = 1.3mm). Afin d’éviter la déformation thermique sous forte chaleur, nous avons fixé des épaisseurs nominales précises en millimètres : 1.5mm to 2.0mm(correspondant à un acier inoxydable épais de calibre 16 à 14) pour le corps embouti perforé de la poêle à grille, et 2.5mm to 4.0mmpour les plaques robustes de type teppanyaki/grill et les pattes de fixation de la poignée. around 0.1mm, tandis que around 0.01mmà 0.005mmLes tolérances d’usinage CNC sont appliquées aux matrices de poinçonnage progressif internes et aux gabarits de positionnement des poignées, afin que chaque poêle s’empile et s’emboîte sans accroc dans l’emballage commercial.
around 0.1mm, tandis que notre presse plieuse CNC de 3 200 mm a formé les parois inclinées du bac (capacité de pliage à around 0.5 degrees), permettant ainsi au client de réaliser des tests réels de grillade et de répartition thermique en quelques jours seulement. 


1.5mm to 2.0mmpour les poêles à grille embouties profondes perforées, et 2.5mm to 4.0mmpour les plaques à griller plates), plutôt que des numéros de jauge ambigus ; deuxièmement, en réalisant des nervures surélevées de marquage et de rigidification sur le fond de la poêle, ainsi qu’un rebord périphérique incurvé ou roulé durant notre procédé d’emboutissage profond de 25 T à 400 T ; et troisièmement, en maintenant un espacement uniforme des nervures autour des perforations découpées au laser ou estampées, afin que les contraintes thermiques se répartissent de façon homogène. ~0.1mmprécision) et une presse plieuse CNC de 3 200 mm avec coût nul pour les matrices, ce qui vous permet de tester immédiatement la taille des trous et le débit d’air. À mesure que le volume augmente vers la production commerciale, nous passons à nos presses de 25 T à 400 T en utilisant des matrices internes progressivement perforantes et à emboutissage profond, ce qui répartit le coût des outillages et assure le prix unitaire le plus bas. 0.01mmà 0.005mmPrécision d’usinage CNC) et surveillons l’usure des poinçons en temps réel afin d’obtenir des découpes nettes. Chaque bac subit ensuite un débourrage mécanique en plusieurs étapes, un brossage satiné directionnel ou une polissage miroir, ainsi qu’une passivation chimique, suivis de plus de 39 contrôles qualité documentés selon la norme ISO 9001 — validant à la fois la planéité dimensionnelle et l’aspect esthétique lors de l’inspection du premier article (FAI), avant la libération du lot. Produits recommandés