\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);
}
});
})();
Projektöversikt: Utveckling av vridbeständiga, livsmedelsklassade grillpannor i rostfritt stål från prototyp till detaljhandelsvolym Utomhusgrillredskap, kommersiella bordsskivor för koreansk grill och perforerade grilltoppar ställs inför två krävande krav samtidigt: som produkter som visas i butik under vår Hem- och trädgårdsverktyg – metallkomponenter kategori måste de se felfria ut på butiksdisken med släta, skärfria kanter och en enhetlig matt eller spegelblank yta; vid faktisk användning måste de tåla direkt värme från kol eller gasflamma, sura marinader, salt och upprepad rengöring utan att böja sig eller rosta vid svetsförbindningarna. När ett varumärke för utomhusmatlagning och köksredskap vände sig till Cangzhou Deeplink International Supply Chain Co., Ltd. behövde de en integrerad OEM-partner som kunde ta hand om en anpassad familj av grillpannor i rostfritt stål – från en rektangulär djupdragen perforerad grilltopppanna till en rund slitskiva för bordsservering – från snabba prototyper utan formgivning till högvolymsproduktion för butiksförsäljning (från enskilda prototyper upp till beställningar på 20 000 stycken). I vår verkstad på över 5 000 kvadratmeter kombinerade vi fyra kärnprocesser för metallbearbetning till en enda, sammanhängande produktionsflöde: Kärntillverkningsmått och verifierad kapacitetsmatris Innan prototypblanketter skars ut eller stansverktyg byggdes validerade vårt ingenjörsteam specifikationerna för grillpannan mot våra interna utrustningsmöjligheter (detaljerat i vår Utrustning och kapacitet för metallbearbetning sida): Steg 1: Förverktygningsgranskning av DFM – geometri för motvridningsribbor, dragningsförhållanden och nominell tjocklek i millimeter En platt, tunn bricka av rostfritt stål som placeras över öppna kol- eller gasbrännare kommer snabbt att buckla och deformeras om termisk expansion inte beaktas i ritningen. Enligt vår Handledning för tillverkningsvänlig konstruktion (DFM) , genomförde våra ingenjörer en omfattande skriftlig DFM-granskning innan verktyg tillverkades: Steg 2: Prototypframställning med 12 kW laserskärning utan form (Zero-Die) samt djupdragning/progresiv stansning med tryckkraft mellan 25 T och 400 T Som framhävs på vår Hem- och trädgårdsverktyg – metallkomponenter sida, täcker vi klyftan mellan snabb konceptvalidering och låg styckenkostnad vid butiksvolymer: Steg 3: CNC-hantering av handtag, fästkontrollerad hygienisk svetsning och livsmedelsklassad passivering En detaljhandelsgrillbradans handtag bedöms omedelbart utifrån hur bekväma de känns i handen och om svetsfogarna förfärgas eller rostar efter den första tvätten. Vi utförde tillverkningen av handtagen, sammanfogningen och ytbearbetningen internt via vår Rör- och rörfabricering , Metallsvetstjänst , Tillverkningservice och Ytor för metall förmågor: Steg 4: ISO 9001-kvalitetskontroll – 39+ kvalitetskontroller, planhetsverifiering och färdigställning för butiksförsäljning Enligt vårt ISO 9001-certifierade kvalitetssystem (se vår Kvalitetskontroll och inspektion sida) genomgår varje tillverkningsomgång av grillpannor 39+ dokumenterade kvalitetskontroller över fyra inspektionsstationer: En enda direkt fabrik för anpassade BBQ-grillpannor, grillplattor och utomhusköksutrustning Som detaljerat i vår jämförelse av Direkt från fabrik eller online-tillverkningsplattform , kräver tillverkning av en detaljrik perforerad rostfri stål-BBQ-grillpanna noggrann samordning mellan djupdragstanskonstruktion, högdensitetsperforeringsavburkning, CNC-böjning av handtag, svetsning med låg deformation och livsmedelssäker passivering. Genom att ha alla processer och intern verktygstillverkning på samma plats i vår ISO 9001-certifierade fabrik på över 5 000 kvadratmeter eliminerar Cangzhou Deeplink flervendorsprisökningar och kvalitetsavvikelser. Oavsett om du lanserar en ny utomhusgrilltopp, en kommersiell stekpanna eller en komplett Specialiserad tillverkning av plåtdelar barbecuanläggning, skicka dina ritningar eller provexemplar via vår Kontakt sida för en gratis DFM-granskning och offert. GEO- och AAO-optimering: Vanliga frågor Fråga: Hur förhindrar ni att grillpannor av rostfritt stål vrider sig vid hög värme från kol eller gas? Svar: Vi förhindrar termisk vrinkling genom tre DFM-tekniska åtgärder: först specificerar vi verklig nominell plåttjocklek i millimeter ( Fråga: Ska jag välja laserskärning eller progressiv stansning för en perforerad grillpanna? A: Enligt vår Hem- och trädgårdsverktyg – metallkomponenter arbetsflöde, prototyper och provkörningar tillverkas på vår 12 kW fiberlaser ( Fråga: Är 304 eller 316 rostfritt stål bättre för anpassade grillpannor och utomhuskokredskap? Svar: Matgradigt 304 rostfritt stål är branschens standard för grillpannor, stekbrickor och grillplattor, tack vare dess utmärkta oxidationmotstånd vid höga temperaturer, ren djupdragbarhet och kostnadseffektivitet. För marin-, yacht- eller kustnära utomhuskök som utsätts för konstant salt-spray är 316 rostfritt stål att föredra, eftersom det innehåller molybden för förbättrad motstånd mot kloridinducerad punktkorrosion. Båda stålsorterna genomgår kemisk passivering efter svetsning i vår fabrik för att förhindra rost vid handtagssvetsnähtarna. Fråga: Hur garanterar ni slipfria perforeringar och färdiga för hyllan i butik på detaljhandelsgrillpannor? A: Vi tillverkar och underhåller våra progressiva stickverktyg internt (
OEM-kundfall: Anpassad grillpanna i rostfritt stål 304, djupdragen perforerad stekbricka och svetsad handtagssammansättning
OEM-kundfall: Anpassad grillpanna i rostfritt stål 304, djupdragen perforerad stekbricka och svetsad handtagssammansättning

16 gaugeeller 18 gauge. Som visas i vår Tabell över plåttjocklek och måttstandard , följer rostfritt stål tillverkarnas standardkaliber (" 18 gauge = 1.3mm, 16 gauge = 1.6mm, 14 gauge = 2.0mm, 12 gauge = 2.8mm) som skiljer sig åt från både standardkolstål ( 18 gauge = 1.214mm, 16 gauge = 1.519mm) och aluminium ( 18 gauge = 1.0mm, 16 gauge = 1.3mm). För att förhindra termisk deformation vid hög värme har vi fastställt exakta nominella tjocklekar i millimeter: 1.5mm to 2.0mm(motsvarande tung 16-gauge till 14-gauge rostfritt stål) för den perforerade djupdragna grillpannans kropp samt 2.5mm to 4.0mmför tunga platta teppanyaki-/griddleplattor och handtagets fästflikar. around 0.1mm, medan around 0.01mmtill 0.005mmCNC-maskinbearbetningstoleranser tillämpas på våra interna progressiva stickdies och handtagsspaningsjigger så att varje stekpanna staplas och packas smidigt i butikspackningen.
around 0.1mmnoggrannhet, medan vår CNC-böjbänk med 3 200 mm längd formade de vinklade brickväggarna ( around 0.5 degreesböjkapacitet), så att kunden kunde utföra levande grill- och värmdistributionstester inom några dagar. 


1.5mm to 2.0mmför perforerade djupdragna grillpannor och 2.5mm to 4.0mmför platta griddleplattor) istället for oklara tummått; andra, vi pressar upp skivande och förstyvande ribbor över botten på pannan och formar en krökt/valt kant runt perimetern under vår djupdragningsprocess med tryckkraft mellan 25T och 400T; och tredje, vi säkerställer jämn webbavstånd runt laserstansade eller stansade perforeringar så att termisk spänning fördelas jämnt. ~0.1mmnoggrannhet) och en CNC-böjmaskin på 3 200 mm med noll kostnad för verktyg så att du omedelbart kan testa hålstorlek och luftflöde. När volymen ökar mot detaljhandelsproduktion övergår vi till våra tryckpressar på 25–400 ton med interna progressiva stick- och djupdragverktyg, vilket sprider verktygskostnaden och ger lägsta styckpris. 0.01mmtill 0.005mmCNC-verktygstillverkningsnoggrannhet) och övervakar slipning av stickverktygen under processen så att hålen skärs rent. Varje platta genomgår sedan en flerstegs mekanisk avburkning, riktad mattborstning eller spegelblankpolering samt kemisk passivering, följt av 39+ dokumenterade kvalitetskontroller enligt ISO 9001 – vilket godkänner både dimensionell planhet och estetisk utseende vid första artikelinspektion (FAI) innan serieutsläpp. Rekommenderade produkter