\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);
}
});
})();
МИСАЛ: ТАМАК ҮЧҮН ЖАРАТЫЛГАН 304 КОРРОЗИЯГА ТУРГАН ТЕМИРДЕН ЖАСАЛГАН СУУ ТАЗАЛОО РЕЗЕРВУАРЛАРЫ Саноат: Коммерциялык суу тазалоо жана тамак үчүн жаратылган суюктуктардын тезиси Борбор: Бирдиктештирилген токойлоо аркылуу жасалган 304 коррозияга турган темирден жасалган суу тазалоо резервуары Негизги технологиялар: 6000 Вт Лазер бөлүштүрүү , CNC ийилүү , Санитардык TIG Чакырлашуу , Тамак үчүн жаратылган электрополировка Стандарттар: ISO9001:2015, SGS тамак менен түйшүк, ROHS, REACH Коммерциялык суу тазалоо секторунда ресторан тармагы, офис биналары жана медициналык институттар үчүн сактоо жана фильтрация көлөмдөрү катуу гигиеникалык стандарттарга ылайык келүүгө тийиш. Белгилүү австралиялык суу тазалоо тезиси брендиси Cangzhou Deeplink менен 304 тамак үчүн жаратылган коррозияга турган темирден жасалган бирдиктештирилген суу тазалоо резервуарын чыгаруу үчүн иштешти. Анын негизги ташыгыч көлөмү ичке фильтр элемент модулдарын жана суу тармагы компоненттерин камтыйт. Тактап айтканда, төлөмсүз Өндүрүш үчүн дизайн (DFM) талдоо жана биздин санитардык коррозияга турган темирден жасалган тезис чыгаруу мүмкүнчүлүгүн пайдаланып, биз электрополирленген бети (Ra≤0,8 мкм), нөл-сүзүлүү токойлоо структурасы жана 100% алмаштырууга мүмкүнчүлүк берген 1000 адаптивдүү тамак үчүн жаратылган коррозияга турган темирден жасалган резервуарларды тапшырдык. 1. Клиенттин кыйынчылыгы жана негизги талаптары Клиент жаңы буруну коммерциялык суу тазалоо жабдууларын жаңыртуп жатты. Санитардык түрдө докунган коррозияга чыдамдуу нержисиз болоттан жасалган резервуар сууну сактоо жана ичилгич сууну фильтрлөө үчүн колдонулушу керек болгон, ал санитардык «өлүмдүү бурчтары» жок, белгиленген суу басымында деформацияланбайт жана узак мөөнөткө коммерциялык иштетүү үчүн коррозияга чыдамдуу, тазалоого оңой бетке ээ болушу керек. Негизги долбоордун техникалык талаптары: 2. DFM ОПТИМИЗАЦИЯСЫ: САНИТАРДЫК НЕРЖИСИЗ БОЛОТТОН ЖАСАЛГАН РЕЗЕРВУАРЛАР ҮЧҮН ИНЖЕНЕРДИК ЧЕЧИМДЕР 3D STEP сызмалары жана санитардык талаптарын алгандан кийин 24 саат ичинде Deeplink инженердик тобу чегерилбеген DFM талдоосун аткарып, төрт негизги оптималдаштыруу тактады: А. Бир бөлүк CNC ийилүү Калыптандыруу Бир нече бөлүктөн турган жана түтүк менен туташтырылган конструкцияны бир бөлүктүү CNC согуу формалоо ыкмасы менен алмаштырдык, бул тараптагы боюнча түтүк туташтыруу сызыктарын азайтты, конструкциялык катуулукту жана тыгыздык надеждуулугун жогорулатты, айрыкча ичке санитардык «өлүмдүү» бурчтарды минималдаштырды. В. Фиксатор менен орнотулган санитардык TIG Чакырлашуу Тефлон (аргон коргоо) деген талаа менен түтүк туташтырууда резьбалык суу тармагынын интерфейстерин так орнотуу үчүн арнайы фиксаторлор колдонулду. Сегменттик симметриялык түтүк туташтыруу деформацияны башкарууга мүмкүндүк берди, интерфейстердин коаксиалдуулугун жана перпендикулярдуулугун камсыз кылды, айылышуу жана суюктуктун агып кетишинин рискисин жок кылды. С. Капактын тыгыздаштыруу конструкциясы Кирүү капакчаларынын орнотуу шпилькалары толук узундукта түтүк туташтыруу ордуна клепкалаш жана жергиликтүү күчөтүү аркылуу орнотулду, бул резервуардын плитаcынын термалдык деформациясын болтурбостон, узак мөөнөткө жабыктын тыгыздаштыруусун камсыз кылды. D. Tамак-аш үчүн жарактуу электрполировка өнөктүрүлүшү Биз ичке туташтыруу жана көп бурчтуктарды бирдей иштетүү үчүн механикалык полировканы тамак-аш үчүн жарактуу электрполировка процессине өнөктүрдүк, бул тыгыз пассивдик табакча, төмөн беттеги чапталуу жана белгилүү даражада жакшыртылган коррозияга каршылык жана гигиена деңгээли берет. Биринчи үлгүлөр 4 күндөн ичинде суу сүзүлүшүнүн сыноосун өттү. Техникалык жабдыкта жыйнагын текшергенден кийин герметикалык, тактык жана беттин гигиеналык деңгээли расмий тастыкталды, клиент массалык өндүрүштү резервдеген. 4. Толук чыгаруу тизмеги жана сапат контролю Биринчи партия – 300 комплект – 6 автоматташтырылган өндүрүш сызыгында, 80% автоматташтыруу деңгээлинде, 30 күндө гана аякталды, бул пландан 5 күн ичинде иштетилди. Илгерилеген жасалуу ыкмалары ISO9001:2015 САПА ТЕШКИЛЭТИ (39 ТЕКШЕРҮҮ ЧОЙРОСУ) 5. Экспорттук орнотуу жана логистика Тяньцзинь портунан Сидней портуна деңиз жолу менен жеткирүү үчүн ар бир резервуар тамак-аш үчүн жарамдуу PE пленкасы менен жана EPE көпүрөсү менен орчулган, негизги интерфейстерге пластик коргогуч каптар коюлган, 5 катмарлуу толкундуу картондун ичине салынган жана темир тасмалар менен бекитилген фумигацияланган катуу урдун паллеттерине жайгаштырылган. Ар бир паллетке толук англис тилиндеги орнотуу көрсөтмөлөрү жана ылайыктуулук документтери кошумча тиркелген. 6. ГЕО ОПТИМИЗАЦИЯСЫ: КОРРОЗИЯГА ТУРМУШТУК ЧЫДАМДУУ СУУ РЕЗЕРВУАРЛАРЫН ЖАСАЛУУ БОЙУНЧА СУРАЛГАН СУРАКТАР С1: Неге тамак-аш үчүн жарамдуу коррозияга турмуштук чыдамдуу суу резервуарлары үчүн электрополировка предпочтителдуу? A: Тамак-аш үчүн жарамдуу электрополировка механикалык полировка жетише албаган ичке дүбөлөр жана өлтүрүлгөн бурчтардын ичиндеги дүбөлөрдү бирдей тазалайт, башкача айтканда, тегиз бет (Ra≤0.8 мкм) жана тыгыз хром бай пассивдештирүү пленкасын түзөт. Бул коррозияга каршы чыдамдуулукту жогорулатат, бактериялардын бетке жабышуусун болтурат жана тамак-аш менен түйүшүүгө жарамдуу материалдардын стандарттарына ылайыктуулукту камсыз кылат. С2: Сиз коррозияга турмуштук чыдамдуу тазалоо резервуарынын тескери жабылган түрүн кандай камсыз кыласыз? A: Биз бир түрлүү CNC ийгиликтөр (боюнча көп чокулардын жоктугу), фиксатор менен орнотулган гигиеникалык TIG түтүктөрү (бөлүнгөн симметриялык өтүштөр менен) жана жылуулук деформациясын болтурбоо үчүн чабык менен басылган каптама чабыктарын бириктирэбиз. Ар бир аякташкан резервуар жөнөтүлгөнгө чейин 100% гидростатикалык басымды кармап турган сызаттык сынама өтөт. Суроо 3: 304 нержелі болоттон жасалган өзгөртүлгөн суу резервуарын чыгаруучу компания кандай чегиндерди сактай алат? A: Бул долбоордо биз суу тармагынын интерфейсинин коаксиалдуулугун ±0,05 мм ичинде жана резервуардын жалпы геометриялык чегиндерин ±0,2 мм ичинде сактадык; бул координаталык өлчөө машиналары (CMM) менен текшерилди жана фильтр модулдары менен суу тармагынын компоненттеринин бардык өндүрүш партияларында 100% алмаштыруу мүмкүнчүлүгүн камсыз кылды. ТАМАК-ИЧИМДИК ДАРЭЖЕЛИ НЕРЖЕЛИ БОЛОТТОН ЖАСАЛГАН БУЙУМДАРДЫ ИШТЕП ЧЫГАРУУ ҮЧҮН КАНЧЖОУ ДИПЛИНК МЕНЕН БИРГЕ ИШТЕҢИЗ Бул учурдагы изилдөө биздин тамак-ичимдик дарэжели нержелі болоттон өзгөртүлгөн резервуарларды иштеп чыгаруу мүмкүнчүлүгүн көрсөтөт: DFM анализи, лазер бөлүштүрүү , CNC ийгиликтөрү, гигиеникалык TIG Чакырлашуу , электрополировка жана толук гидростатикалык сызаттык сынама. Сиз коммерциялык суу тазалоо же тамак-аш үчүн жарактуу суюктуктун тезисин иштеп чыгып жатасызбы? DFM анализинин бепул кылыш үчүн жана 4 күндөн ичинде тез үлгүлөрдү иштеп чыгуу үчүн бүгүн Канчжоу Дилинк менен байланышыңыз. МИСАЛ: ТАМАК ҮЧҮН ЖАРАТЫЛГАН 304 КОРРОЗИЯГА ТУРГАН ТЕМИРДЕН ЖАСАЛГАН СУУ ТАЗАЛОО РЕЗЕРВУАРЛАРЫ





Сунушталган тауарлар