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

すべてのカテゴリ

サービス

ホーム>サービス

ラピッドプロトタイピングサービス

Oct 19, 2026
ラピッドプロトタイピングサービス 迅速な金属プロトタイピングサービス
滄州ディーリンク国際サプライチェーン株式会社

金型製作の前に、適合性、機能性、量産可能性を検証

ラピッドプロトタイピングサービス

レーザー切断、成形、CNC加工、溶接、組立を活用し、量産用金型製作に着手する前に設計を試作・検証

図面をご送付ください(技術検討用) 設備と生産能力を確認

プロトタイプは、設計が機能するかどうかという一つの問いに答えるために存在します。金型を製作せずに試作することで、コストを抑えられます。なぜなら、その後の設計変更は新たにプログラムを作成するだけで済み、金型を新規製作する必要がないからです。

当社のプロトタイピング手法

  • 金型費用がかからない、レーザー切断および成形
  • 成形では確保できない精度や形状を実現するためのCNC加工
  • 量産品と同様の方法で溶接・組立されたプロトタイプ
  • プロトタイプが検証すべき内容に応じて選択される工程

テクニカル仕様

項目 能力
金型コスト 切断・成形のみのプロトタイプには不要
プロトタイピング工程 レーザー切断、成形、CNC加工、溶接、組立
公差 切断・成形部品では約0.1mm、機械加工部品では約0.01mm
検証 初品は図面と照合して測定し、出荷前の最終検査を実施
生産工程間の搬送 量産時と同一の工程で製作するため、承認された仕様がそのまま量産に反映される

プロトタイプが達成すべきこと

  • 部品が対応する他の部品やアセンブリに正しく適合すること
  • 使用材料および板厚が用途に適していること
  • 図面に記載された公差が、実際に重要となる公差であること
  • 選択された工程ルートが量産へスムーズに移行可能であること

金型製作前のDFM(製造可能性)レビュー

量産化を前提とした設計の場合、当社エンジニアリングチームが金型製作着手前に製造可能性をレビューします。公差に関するリスクやコスト要因は文書にて報告され、金型加工後の修正ではなく、図面段階での変更が行われます。

試作から量産へ

プロトタイプ製造に用いる工程は、量産注文の工程と同一であるため、プロトタイプ段階で承認された仕様がそのまま量産に反映されます。部品が量産に移行し、プログレッシブダイによるスタンピングへと切り替わる場合でも、その変更は事前に計画・確認され、突発的に起こることはありません。

品質管理

プロトタイプも量産注文と同様の検査ルートを経ます。すなわち、入荷材料の検査、図面との照合による初品測定、および梱包前の最終検査が実施されます。

実際の製造事例

Sheet metal prototype parts made without production tooling
量産用金型を使わずに製作した板金プロトタイプ部品
Laser cutting used for tool-free metal prototypes
金型不要の金属プロトタイプにレーザー切断を採用
Prototype fabricated enclosure for fit and assembly validation
適合性および組立検証用に製作されたプロトタイプ筐体

プロジェクトの製造工程の流れ

  1. 1.プロトタイプが証明すべき内容を定義し、重要なインターフェースを特定する
  2. 2.工具不要または低負荷の製造工程に対応する設計図をレビューする
  3. 3.最初の実物部品を製作・検査する
  4. 4.想定される用途に対して、適合性・機能性・組立性を確認する
  5. 5.承認済みの変更を記録し、量産への移行計画を立案する

応用分野および部品種別

板金部品の設計検証
機能性ブラケットおよびハウジング
機械加工による概念実証部品
溶接プロトタイプアセンブリ
量産前のプレツーリングによる成形部品の試作
量産再開前の試作車両

RFQに含めるべき内容

  • 2D図面および利用可能な3Dモデル
  • 材料および想定される製造工程
  • プロトタイプで実証すべき項目
  • 重要なインターフェースおよび公差
  • 検証後の想定生産数量

明確な図面パッケージがあれば、製造チームは量産開始前に製造可能性、工程選定、検査要件を検討できます。ただし、個別の図面がレビューされるまでは、公差・価格・納期に関するいかなる約束も成立しません。

関連する製造リソース

よくあるご質問

プロトタイプには最小注文数量はありますか?

カット・フォーミングによるプロトタイプ製造では金型は不要のため、少量の初回注文にもツーリングの障壁はありません。ご希望の図面と数量をお送りください。その後、お見積りとともに最適な製造ルートをご案内いたします。

プロトタイプは量産品と一致しますか?

プロトタイプ製造に用いる工程は、量産注文の工程と同一であるため、プロトタイプ段階で承認された仕様がそのまま量産に反映されます。部品が量産に移行し、プログレッシブダイによるスタンピングへと切り替わる場合でも、その変更は事前に計画・確認されます。

金型製作を確定する前に、設計を確認していただけますか?

はい。量産へと進む予定の設計については、当社のエンジニアリングチームが金型製作の確定前に製造可能性を審査し、公差に関するリスクやコスト要因を書面で報告します。

プロトタイプには最終量産仕様の表面処理が必要ですか?

表面処理が部品の嵌合性、腐食性、外観、または試験目的に影響を及ぼす場合にのみ必要です。プロトタイプで確認すべき項目を明確に示せば、それに応じた作成範囲を検討できます。

量産用金型を使わずにプロトタイプを製作できますか?

レーザー切断、ベンディング、CNC機械加工などにより、量産用ダイスへの投資を前提とせず、設計の妥当性を確認できる場合が多くあります。

量産開始前にフィードバックはどのように収集されますか?

レビューおよび初品検査で明らかになった製造性や公差に関するリスクは、量産工程を確定する前に図面に基づき解決されます。

複数のプロトタイプバージョンを比較できますか?

管理された図面バージョンから異なる改訂版を製作できます。各改訂版は、RFQおよび関連ファイル内で明確に識別される必要があります。

試作から量産への移行はどのように行われますか?

設計が承認されると、繰り返しの需要に対応するための製造工程が再検討されます。プレス成形や専用金型への切り替えは、あらかじめ想定するのではなく、計画・確認のうえで実施されます。

製造性レビューのために図面をお送りください

材料・数量・試作で検証すべき内容を明記した図面をお送りください。その後に量産を予定している場合は、この段階でその旨をお知らせください。そうすることで、量産を見据えた工程ルートを選定できます。

製造性レビューの依頼