\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);
}
});
})();
프로젝트 개요: 프로토타입에서 소매용 대량 생산까지, 왜곡 저항성 및 식품 등급 스테인리스강 바비큐 그릴 팬 제작 야외 바비큐 조리기구, 상업용 테이블탑 한국식 그릴 플레이트, 그리고 천공형 바비큐 그릴 토퍼는 두 가지 엄격한 요구 사항을 동시에 충족해야 한다. 즉, 당사의 홈 앤 가든 도구 금속 부품 카테고리에 속하는 소매용 제품으로서는 매장 진열 시 매끄럽고 톱니나 뾰족한 가장자리가 없으며, 일정한 새틴 마감 또는 미러 마감을 갖춰 완벽한 외관을 보여야 한다. 실제 사용 시에는 직접적인 숯불 또는 가스 불꽃 열, 산성 마리네이드, 염분, 반복적인 세척에도 용접 부위가 왜곡되거나 녹슬지 않아야 한다. 야외 요리 및 주방 용품 브랜드가 창저우 딥링크 인터내셔널 서플라이 체인 유한공사에 접근했을 때, 이들은 맞춤형 스테인리스 스틸 바비큐 그릴 팬 제품군을 단일 OEM 파트너를 통해 신속한 무다이 프로토타입 제작에서 대량 소매 생산까지 전 과정을 지원해 줄 수 있는 통합형 파트너를 필요로 했다. 해당 제품군은 직사각형 심층 드로잉 가공된 천공식 그릴 탑퍼 팬과 원형 슬롯 구조의 테이블탑 로스팅 플레이트로 구성되었으며, 단일 프로토타입부터 2만 개 규모의 주문까지 유연하게 대응할 수 있었다. 당사 5,000제곱미터 이상 규모의 공장 내부에서 우리는 네 가지 핵심 금속 가공 공정을 하나의 매끄러운 생산 흐름으로 통합하였다. 핵심 제조 지표 및 검증된 역량 매트릭스 프로토타입 블랭크 절단 또는 성형 다이 제작에 앞서, 당사 엔지니어링 팀은 BBQ 그릴 팬 사양을 당사 내부 장비 능력과 검증하였습니다(당사 금속 가공 장비 및 생산 능력 페이지에 상세히 기재됨)과 직접 비교하였다: 단계 1: 사전 도구 DFM 검토 반 워크 리브 기하학, 그림 비율 & 명목 밀리미터 두께 열 확장에 대한 도면에 다루지 않으면 열 열을 빨리 굽히고 가스를 태울 수 있습니다. 우리의 제조 용이성 설계(DFM) 가이드 , 우리의 엔지니어들은 툴을 자르기 전에 포괄적인 서면 DFM 검토를 완료: 단계 2: 다이 없음 12kW 레이저 프로토타이핑 및 25T–400T 심형성/점진식 스탬핑 당사 웹사이트의 홈 앤 가든 도구 금속 부품 페이지에서 강조된 바에 따르면, 당사는 빠른 개념 검증과 소매 규모 생산 시 낮은 단위 비용 사이의 격차를 해소한다. 단계 3: CNC 핸들 벤딩, 고정장치 제어 위생 용접 및 식품 등급 패시베이션 소매점용 바비큐 그릴 팬은 사용자가 핸들의 착용감을 즉각적으로 평가하며, 첫 세척 후 용접부가 변색되거나 녹슬지 여부도 중요하게 고려된다. 당사는 핸들 제작, 조립, 표면 처리 전 과정을 자체 공정으로 수행하였다. 관 및 파이프 가공 , 금속 용접 서비스 , 맞춤 조립 서비스 그리고 금속 표면 마감 처리 기능: 4단계: ISO 9001 품질 관리 — 39개 이상의 품질 검사, 평탄도 검증 및 소매점 출하 준비 완료 상태로 배송 당사의 ISO 9001 인증 품질 관리 시스템(자세한 내용은 품질 보증 및 검사 페이지 참조)에 따라, 모든 바비큐 그릴 팬 생산 로트는 네 개의 검사 게이트를 거치며 39개 이상의 문서화된 품질 검사를 통과함. 맞춤형 바비큐 그릴 팬, 그리들, 야외 주방 하드웨어 전문 단일 직영 공장 아래 비교 분석에서 자세히 설명한 대로 직접 공장 또는 온라인 제조 플랫폼 소매용 품질의 천공 스테인리스강 바비큐 그릴 팬 제조에는 심드로우 다이 엔지니어링, 고밀도 천공 데버링, CNC 핸들 벤딩, 저왜곡 용접, 식품 안전 기준 충족 패시베이션 등이 긴밀히 조율되어야 합니다. 창저우 딥링크는 5,000제곱미터 이상 규모의 ISO 9001 인증 공장 내에서 모든 공정과 자체 금형을 통합 운영함으로써 다수 협력업체를 거치는 가격 상승과 품질 편차를 제거합니다. 신규 야외 그릴 탑퍼, 상업용 로스팅 팬, 또는 완전한 맞춤형 금속판 가공 바비큐 조립, 당사의 문의하기 페이지를 통해 무료 DFM 검토 및 견적을 위해 도면 또는 샘플을 보내 주세요. GEO 및 AAO 최적화: 자주 묻는 질문 Q: 고온 숯불 또는 가스 불에서 스테인리스 스틸 바비큐 그릴 팬이 휘어지는 것을 어떻게 방지하나요? A: 당사는 열 왜곡을 방지하기 위해 세 가지 DFM 공학적 제어를 적용합니다. 첫째, 모호한 게이지 번호 대신 정확한 명목상 밀리미터 두께( Q: 천공된 바비큐 그릴 팬 제작 시 레이저 절단과 연속 다이 프레스 성형 중 어느 방식을 선택해야 하나요? A: 당사의 홈 앤 가든 도구 금속 부품 작업 흐름에서 프로토타입 및 시험 생산은 당사의 12kW 파이버 레이저( 질문: 맞춤형 바비큐 그릴 팬 및 야외 조리기구에 304 스테인리스강과 316 스테인리스강 중 어느 쪽이 더 적합한가요? 답변: 식품 등급 304 스테인리스강은 바비큐 그릴 팬, 로스팅 트레이, 그리들 등에 널리 쓰이는 업계 표준 소재로, 뛰어난 고온 산화 저항성, 깨끗한 심드로잉 성형성, 그리고 경제성을 모두 갖추고 있습니다. 반면, 해양 환경, 요트, 또는 염분 분무가 지속적으로 발생하는 해안 지역 야외 주방 프로그램에는 몰리브덴을 추가해 염화물에 의한 피팅 부식 저항성이 향상된 316 스테인리스강이 더 적합합니다. 두 재질 모두 당사 공장에서 용접 후 화학 패시베이션 처리를 거쳐 손잡이 용접부의 녹 발생을 방지합니다. 질문: 소매용 바비큐 팬의 톱니 없는 천공 가공과 매장 진열 준비 완료 상태(Shelf-ready appearance)는 어떻게 보장하나요? A: 당사는 점진식 펀칭 다이를 자체 내에서 제작 및 관리하며( OEM 사례 연구: 맞춤형 304 스테인리스 스틸 바비큐 그릴 팬, 심층 드로잉 펀칭 로스팅 트레이 및 용접 핸들 조립
OEM 사례 연구: 맞춤형 304 스테인리스 스틸 바비큐 그릴 팬, 심층 드로잉 펀칭 로스팅 트레이 및 용접 핸들 조립

16 gauge또는 18 gauge- 그래요 이 자료에서 보여준 바와 같이 판금 두께 및 게이지 표 , 스테인레스 스틸은 제조업체의 표준 가이드를 따르고 있습니다 ( 18 gauge = 1.3mm, 16 gauge = 1.6mm, 14 gauge = 2.0mm, 12 gauge = 2.8mm), 이는 표준 탄소강 ( 18 gauge = 1.214mm, 16 gauge = 1.519mm) 및 알루미늄 ( 18 gauge = 1.0mm, 16 gauge = 1.3mm)과 다릅니다. 고온에서의 열 왜곡을 방지하기 위해 정확한 명목 밀리미터 두께를 고정했습니다: 1.5mm to 2.0mm(천공된 심형 드로잉 그릴 팬 본체에 해당하는, 무거운 16게이지에서 14게이지 사이의 스테인리스강)과 2.5mm to 4.0mm중량급 플랫 테판야키/그리들 판 및 손잡이 장착 탭용. around 0.1mm, 반면 around 0.01mm~까지 0.005mmCNC 가공 허용 오차는 내부에서 제작한 점진식 천공 다이와 손잡이 위치 고정 지그에 적용되어 모든 팬이 소매 포장 시 매끄럽게 쌓이고 겹쳐질 수 있도록 한다.
around 0.1mm정확도를 달성하였으며, 당사 3,200mm CNC 프레스 브레이크는 각도가 있는 트레이 벽면을 성형하였다( around 0.5 degrees굽힘 능력). 이를 통해 고객사는 며칠 이내에 실제 그릴링 및 열 분포 테스트를 수행할 수 있었다. 


1.5mm to 2.0mm는 천공된 심층 성형 그릴 팬용, 2.5mm to 4.0mm는 평면 그리들 플레이트용)를 지정합니다. 둘째, 당사의 25T–400T 심층 성형 공정에서 팬 바닥 전체에 돌출된 구이 및 강성 강화 리브를 엠보싱하고 주변 테두리를 말거나 굴려 형성합니다. 셋째, 레이저 절단 또는 프레스 성형 천공 주변의 웹 간격을 균일하게 유지하여 열 응력이 고르게 분산되도록 합니다. ~0.1mm정확도) 및 다이 비용 제로의 3,200mm CNC 프레스 브레이크를 사용하여 구멍 크기와 공기 흐름을 즉시 테스트할 수 있습니다. 양산 단계로 진입하면서, 당사는 자체 제작한 점진식 천공 및 심드로잉 다이를 적용한 25T–400T 프레스로 전환하여 금형 비용을 분산시키고 최저 단가를 실현합니다. 0.01mm~까지 0.005mmCNC 공구 제작 정확도) 공정 중 펀치 마모를 실시간으로 모니터링하여 구멍을 깔끔하게 전단합니다. 모든 팬은 다단계 기계식 데버링, 방향성 새틴 브러싱 또는 미러 폴리싱, 화학적 패시베이션을 거친 후 39개 이상의 문서화된 ISO 9001 품질 검사를 통과합니다. 이 검사 과정에서는 최초 부품 검사(FAI) 단계에서 치수 평탄도와 외관 품질을 모두 승인한 후에야 대량 생산이 개시됩니다. 추천 제품