\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);
}
});
})();
Yeni enerji saxlama şkaflarının fərdiləşdirilməsi üzrə nümunə: DEEPLINK üç əsas problemi həll edir Yeni enerji texnologiyası şirkəti növbəti nəsil enerji saxlama sistemi üçün metal şkafların fərdiləşdirilməsini təmin etmək məqsədilə DEEPLINK-ə müraciət etdi və bu zaman üç qəti tələb irəli sürdü: «yüksəq dəqiqlikli montaj, üstün korroziyaya davamlılıq və 30 gün ərzində kütləvi çatdırılma». Şkaflar enerji saxlama batareyası modullarının sıx quraşdırılmasını təmin etməli və eyni zamanda sərt xarici iş şəraitində dayanıqlı olmalıdır. Bu tələblər yalnız istehsal prosesinin dəqiqliyini yoxlamır, həm də bütün sənaye zənciri üzrə əməkdaşlıq üçün son dərəcə yüksək standartlar irəli sürür. Əsas layihə problemləri: Üç kritik istehsal çətinliyi Ciddi dəqiqlik nəzarəti : Batareya modulları üçün 12 quraşdırma mövqeyi nəzərdə tutulan şkafın deşik diametri toleransı ±0,1 mm, çərçivənin şaquli meylənməsi isə ≤0,3 mm olmalıdır. Ənənəvi istehsal prosesləri toplanan səhvlərə meyllidir və bu da modul montajında problem yarada bilər; Yüksək korroziyaya davamlılıq tələbi : Uzunmüddətli istifadə zamanı paslanmadan qorunmaq üçün səth emalından sonra 48 saatlıq duz spreyi testindən keçməli və -30℃-dən 60℃-ə qədər temperatur dövrlərini dözə bilən məhsul, xarici enerji saxlama stansiyaları üçün nəzərdə tutulmuşdur; Qısa çatdırılma müddəti : Müştəri layihənin şəbəkəyə qoşulmasını təmin etmək üçün ilk 500 kabinetə acil ehtiyac duyurdu və dizaynın son halına gətirilməsindən başlayaraq hazır məhsulun çatdırılmasına qədər yalnız 30 gün verildi — bu, sənayedəki standart istehsal dövründən xeyli qısadır. Fərdiləşdirilmiş Həllər: Prosesin İnteqrasiyası + Bottlenecklərin Aşılması Üçün Tam Zəncir Əməkdaşlığı 1. İstehsala Hazırlıq DFM Analizi: İstehsal Mürəkkəbliyini Azaltmaq Üçün Strukturun Optimallaşdırılması Sorğu daxil olunandan dərhal sonra DEEPLINK-in mühəndislik komandası İstehsal üçün Dizayn (DFM) təhlilinə başlamışdır. Müştərinin təqdim etdiyi 3D çertyojları inteqrasiya edərək, orijinal birgövdəli şkaflı konstruksiya "modullu toplanma dizaynına" çevrilmiş və üç əsas komponentə (çərçivə, panel və quraşdırma bərkidicisinə) bölünmüşdür. Bu dəyişiklik yalnız mürəkkəb konstruksiyanın istehsalı ilə əlaqəli riskləri azaldır, həm də toplanma səmərəliliyini artırır. Bundan əlavə, 80-dən çox test imkanını əhatə edən dəqiq cihazlardan istifadə edərək, komanda hər bir istehsal addımında aydın keyfiyyət meyarlarının olmasını təmin etmək üçün əsas ölçülərin yoxlanma standartlarını əvvəlcədən müəyyən etmişdir. 2. Əsas Proses Birləşməsi: Dəqiqlik və Korroziyaya Dözümlülük Arasında Balans لیزر کَسمه پروسئسی : Yüksək dəqiqlikli liflər üzərində işləyən lazer kəsici maşınlar 304 paslanmayan poladdan düzəldilmiş lövhələrin kəsilməsi üçün istifadə olunur və ±0,05 mm-ə qədər olan kəsici dəqiqliyi təmin edir — bu da delik diametri və lövhə kənarlarının müstəviyə uyğunluq tələblərini tamamilə ödəyir. Ənənəvi plazma kəsməyə nisbətən bu proses kənara çıxıntı yaratmadan, istilikdən deformasiya olmadan kəsmə imkanı verir ki, bu da əlavə şlifləməyə ehtiyac yaratmır və istehsal dövrünü əhəmiyyətli dərəcədə qısaldır; CNC Qurulma Prosesi : Şkafların çərçivəsinin çoxölçülü formalı qurulması üçün yüksək dəqiqlikli CNC press-kremlər xüsusi qurulma kalıpları ilə birlikdə istifadə olunur. Real vaxt rejimində bucaq monitorinq sistemi çərçivənin şaquli meylənməsini 0,2 mm daxilində saxlayır və modulların quraşdırılma mövqelərinin dəqiq uyğunlaşmasını təmin edir; Robotla Yalama Prosesi : Şkafların birləşmə yerləri üçün altı oxlu robotla yalanma tətbiq olunur. Əl ilə yalanmadan fərqli olaraq, bu üsul birləşmə yerlərində bərabər və dolğun yalaşmış tikişlər əmələ gətirir və yalanma deformasiyasını 60% azaldır. Yalanmadan sonra keçirilən pozuntusuz testlər (NDT) natamam və ya buraxılmış yalaşmaları aradan qaldırır və konstruksiyanın bütövlüyünü təmin edir; İkili Səth Emalı Prosesi : 304 paslanmayan poladda olan təbii korroziyaya davamlılığı əsas götürərək, proses səthdəki qarışıqlıqları və oksid təbəqələrini aradan qaldırmaq üçün elektroparlatma ilə başlayır — bu, səthin keyfiyyətini yaxşılaşdırarkən eyni zamanda əsas materialın korroziyaya davamlılığını artırır. Sonrakı passivasiya emalı sıx və sabit anti-korroziya passiv filmi yaradır (ROHS ekoloji standartlarına uyğundur). Yekun məhsul 48 saatlıq duz sprey testindən sonra heç bir pas və ya qabarma göstərmir və bununla da çox şiddətli xarici mühit şəraitinə tamamilə uyğundur. 3. Avtomatlaşdırılmış İstehsal + Tam Zəncir Əməkdaşlığı: Çatdırılma Müddətinin Qısaltılması DEEPLINK-in 6 avtomatlaşdırılmış istehsal xəttinin (80% avtomatlaşdırma səviyyəsi) sayəsində kəsmə, əyilmə və qaynaqdan səth emalı, montaj və yoxlama qədər olan bütün istehsal prosesi sırf inteqrasiya edilmişdir. İstehsal zamanı İstehsalatın İdarəetdirilmə Sistemi (MES) real vaxtda istehsal irəliləyişini izləməyə imkan verir, müxtəsər proseslər üçün isə yaşıl kanallar aktivləşdirilir. Təchizat zənciri resursları da 304 paslanmayan polad xammalının əvvəlcədən ehtiyatda saxlanması üçün inteqrasiya edilmişdir ki, bu da material gecikmələrindən qaçınılsın. Nəticədə, 500 şkafın tam prosesli istehsalı 30 gün ərzində başa çatdırılmışdır — müştərinin planından 2 gün əvvəl. Müştəri Rəyləri və Uzunmüddətli Əməkdaşlıq Təhvil aldıqdan sonra müştəri, dəqiqlik, korroziyaya davamlılıq və konstruktiv möhkəmlik daxil olmaqla bütün göstəricilərin standartlara birinci dəfədən uyğun olduğunu təsdiqləmək üçün üçüncü tərəf müstəqil ekspertiza agentliyi vasitəsilə ətraflı qəbul testi keçirdi və modul montajının müvəffəqiyyət nisbəti 100% təşkil etdi. Yeni enerji texnologiyaları şirkətinin alışlar direktoru belə dedi: "DEEPLINK-in proses dəqiqliyi və təhvil vermə səmərəliliyi gözləntilərimizi aşdı. Mürəkkəb konstruksiyaların istehsalı və çətin şəraitə uyğunlaşmadakı peşəkar bacarıqları gələcək layihələrdə əməkdaşlıq etməyə olan inamımızı möhkəmləndirir." Hal-hazırda tərəflər illik strategiyası əməkdaşlıq müqaviləsini imzalayıblar və DEEPLINK-i enerji saxlama şkafları üçün əsas təchizatçısı kimi təyin ediblər. DEEPLINK niyə seçməli? Uçdan-uca Xidmət İmkanları : Çertyoj dizaynından, nümunə testindən başlayaraq kütləvi istehsal, qablaşdırma və göndərməyə qədər bir pəncərədən metal emal həlləri təqdim edirik — müştərilərin bir neçə təchizatçı ilə əlaqə qurma ehtiyacını aradan qaldırır; Ciddi Keyfiyyət Sertifikatları : ISO9001/14001/45001, SGS və ROHS daxil olmaqla nüfuzlu sertifikatlara malikdir. Hər bir məhsul 39-dan çox keyfiyyət yoxlama addımından keçir və tam keyfiyyət izlənəbilirliyi təmin edir; Elastik Tənzimləmə Reaksiyası : OEM/ODM xidmətlərini dəstəkləyir və texniki sorğulara operativ cavab vermək üçün 24/7 texniki dəstək komandası mövcuddur. Xüsusi iş şəraitinə uyğun proses həlləri optimallaşdırıla bilər; Avtomatlaşdırma + Dəqiqlik Texnologiyası : Lazer kəsmə, CNC büküm və robotla qaynaq kimi əsas proseslərlə birlikdə 80% avtomatlaşdırmanı birləşdirərək dəqiqlik və səmərəliliyi tarazlayır. Metal şassilər, kabinetlər və ya digər metal emal üçün fərdiləşdirmə ehtiyaclarınız varsa — dəqiqlik, ekoloji adaptasiya və ya çatdırılma müddətləri ilə bağlı çətinliklər yaşasınızsız, DEEPLINK sizin üçün xüsusi həllər təqdim edə bilər.
Yeni enerji saxlama şkaflarının fərdiləşdirilməsi üzrə nümunə: DEEPLINK üç əsas problemi həll edir







Tövsiyə olunan Məhsullar