\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); } }); })();

모든 카테고리

뉴스

홈페이지&gt;뉴스

금속 가공 허용 오차

Sep 17, 2026

허용 오차란 공정이 반복적으로 유지할 수 있는 수준을 의미하며, 단 한 번 달성된 최고 성과를 뜻하지 않는다. 본 페이지에서는 당사가 수행하는 각 공정에 적용되는 허용 오차 범위와, 양산 개시 전 해당 공정이 어떻게 검증되는지를 설명한다.

공정별 허용 오차

  • 레이저 절단 및 성형 판금 부품: 약 0.1mm
  • CNC 가공 특징(선반 가공, 밀링, 드릴링): 약 0.01mm
  • 프레스 성형 부품: 다이에 의해 유지되며, 첫 번째 샘플에서 도면과 대조하여 검증
  • 딥 드로잉 부품: 양산 개시 전 첫 번째 샘플에서 벽 두께, 직경, 깊이를 확인
  • 용접 조립체: 첫 번째 샘플 및 공정 중 차원 정확도와 용접 품질을 점검

도면에서 공정이 반복적으로 유지할 수 있는 것보다 더 엄격한 허용 오차를 요구할 경우, 당사는 DFM 검토 단계에서 이를 명시하고, 충족할 수 없는 주문은 수락하지 않는다. 상기 수치보다 더 엄격한 요구 사항은 사례별로 평가하여 서면으로 확정한 후 양산을 진행한다.

왜 일괄적인 엄격한 허용오차가 더 비쌀까

도면의 모든 치수에 엄격한 허용오차를 적용하면, 그만큼 더 정밀한 공정과 추가 검사가 필요해지므로 모든 치수에 대해 비용이 증가한다. 실제로 기능에 영향을 주는 치수는 일반적으로 전체의 소수에 불과하다. DFM 검토는 하중을 지탱하는 허용오차를 식별하고 나머지는 완화할 것을 제안함으로써, 엄격한 허용오차가 반드시 필요한 곳에만 적용되도록 한다.

우리가 허용오차를 어떻게 검증하는가

검증은 주문 초기부터 내재되어 있으며, 마무리 단계에서 임의로 추가되는 것이 아니다. 원자재 입고 시 점검을 실시하고, 양산 개시 전에 첫 번째 시제품을 도면과 대조 측정하여 승인한다. 이후 공정 중 검사와 최종 검사가 이어진다. 모든 주문은 ISO 9001 품질 관리 시스템 하에 39개 이상의 품질 검사를 거치며, 기록은 보관되어 동일 품목 재주문 시 원본과 비교 검토할 수 있다.

신뢰할 수 있는 견적을 받기 위해 제출해야 할 자료

  • 허용오차 및 중요 치수가 명시된 2D 도면 — 3D 모델만으로는 허용오차를 정의할 수 없다
  • 재료 및 두께, 또는 추천을 원하는 경우 적용 분야와 환경
  • 수량, 그리고 프로토타입 제작과 양산 모두 계획 중인지 여부
  • 마감 요구사항 — 색상 기준 및 마스킹 처리가 필요한 영역 포함
  • 어느 치수가 진정으로 중요하며, 나머지는 합리적인 비용으로 산정할 수 있는지

자주 묻는 질문

레이저 절단 시트 메탈 부품에 대해 허용 가능한 공차는 얼마인가요?

절단 및 성형된 시트 메탈 부품의 경우 약 0.1mm입니다. 도면에서 더 엄격한 공차가 필요할 경우, DFM 검토 과정에서 CNC 가공 등 다른 공정이 더 적합한지 알려 드립니다.

CNC 가공 부품에 적용되는 공차는 얼마인가요?

선삭 및 밀링 가공 특징의 경우 재료, 특징 크기 및 형상에 따라 약 0.01mm입니다. 핵심 치수는 양산 개시 전 최초 부품 검사(F.A.I.)를 통해 확인합니다.

모든 치수에 동일하게 엄격한 공차를 지정해야 하나요?

아니요. 전체 부품에 걸쳐 일괄적으로 엄격한 허용 오차를 적용하면 비용이 증가합니다. 기능과 조립에 영향을 주는 치수만 명시하고, 나머지는 DFM 검토에서 조언을 받으세요. 이것이 도면에 적용할 수 있는 가장 저렴한 변경입니다.

반복 주문 시 허용 오차 내에서 일관성을 어떻게 유지하나요?

승인된 첫 번째 샘플과 그 검사 기록이 부품을 정의하며, 금형은 당사 내부에서 관리되며, 공정 중 점검을 통해 편차를 방지합니다. 반복 주문은 새롭게 해석된 기준이 아니라 동일한 기록과 비교하여 측정됩니다.

어떤 검사 기록을 제공받게 되나요?

원자재 입고, 첫 번째 샘플, 공정 중, 최종 검사 등 39개 이상의 품질 검사를 포함한 기록으로, 당사 ISO 9001 품질 관리 시스템 하에 보관됩니다. 주문 시 귀사 품질 파일에 특정 형식이 필요하다면 미리 알려 주세요.

CNC 가공 부품

레이저 절단 부품

DFM 가이드