არის ლ...">
,需要通过父级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 || node.innerHTML || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
_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;
var fatherDom = trimText(node.parentNode.innerHTML || '');
if (phoneReg.test(fatherDom) && numUseReg.test(fatherDom)) {
_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)) {
_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')) {
_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)) {
_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)) {
_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);
}
});
})();
Გაქვს რაიმე გამოსახული კონტეინერული სახლების შესახებ? Container House არის გამოვარაუდებული სახლი, რომელიც შეიქმნა კონტეინერის გამო. ეს კონტეინერის სახლი არის დიდი მეტალურგიული კონტეინერები, რომელთაშიც ტოვარი შეიძლება გაიგზავნოს გalley-ზე და რეილზე. ბოლო წლებში ისინი გახარისხეს პოპულარობა, რადგან მათი შექმნის ღირებულება შეიძლება იყოს დაბალი ჩვეულებრივი სახლის შედგენისთვის. იმის უდრის, სახლის შესამუშაო კონტეინერის შექმნა არ იქნება ის么 ფასიანი, როგორც ჯერ ჩანს. ბევრი ფაქტორი განაპირობებს სამთლეს ღირებულებას თქვენს კონტეინერ სახლის შესამუშაოდ. მაგალითად, რომელ მიმართულებით გსურთ თქვენი სახლი? გსურთ მრავალ წერტილი თუ ცოტა? მაგალითად, რომელ მახასიათებელები გსურთ ჩათვალოთ; დიდი მართვანა თუ სასტუმრო სარეცხები? რომელი ხელმისაწვდომი გსურთ ან არასარგმანო იმპოტენცია არის სხვა კომპანიის გადაწყვეტილების გამოყენება? თითოეული ამ არჩევანი გავლენა იქნება ფასდასავალებაზე, როდესაც თქვენი კონტეინერ სახლი დასრულდება. Ქალაქის საშუალო სახლზე კონტეინერული სახლის ფასის შესაბამისობის გადაწყვეტილება ძალიან მეტად 埨PENDS იმაზე, რა ეძებთ ცხოვრების სტილში. კონტეინერული სახლების წინააღმდეგობაში საწყისი ხარჯები შეიძლება ნაკლები იყოს, მაგრამ სახლები თავიანთი გარეშე ჩანაწერის მიმართ სახლებზე ნაკლებად დამალულია. მაგალითად, ისინი შეიძლება არ იყოს ასაფეს ზუსტად რამდენიმე სახის სახელმწიფო ამინდების დროს, როგორიცაა ტორნადოები ან ჰურიკანები, რაც ძალიან მნიშვნელოვანია დამოკიდებული იმის დამოკიდებულია, სად ცხოვრობთ. აქ არის რამდენიმე მნიშვნელოვანი რჩევა კონტეინერული სახლის ხარჯებზე შენახვისთვის, თუ გსურთ თავად შეინარჩუნებთ. პირველი რითმით, შეგიძლიათ გამოიყენოთ გააღდგენილი ან რეციკლირებული ელემენტები, როგორიცაა ძველი ხის ან მეტალი, რაც შეგიძლიათ დაგეხმაროს ხარჯების შენახვაში. ფრუგალურად არ მართავთ არ მხოლოდ თქვენს ფულს შენახავს, არამედ თუ გამოიყენებთ სამბოლოს და რაგებს, ეს ასევე განათლული გადაჭრის მიმართ არის. სხვა არჩევანი არის კონტრაქტორის მოქმედება, რომელიც განსაკუთრებით კონტეინერული სახლების შენობაში განსაკუთრებით მუშაობს. CDPH გაშლადი კონტეინერული სახლი უნდა მოიგოს სრულყოფილი გაერთიანება მასში და შეძლებს თქვენს დახმარებაში, რათა მიიღოთ საუკეთესო შეთანხმებები მასალებზე ერთად სამუშაოს თან. Იტინერარის ცოდნილი განვითარება არის კიდევ ერთი საჭირო წერტილი, რომელიც უნდა იყოს გამembranceში. დაჯერ დაუბრუნეთ და ნამდვილად განვითარეთ, რა გსურთ თქვენს სახლში. CDPH საკეცი კონტეინერი სახლი შეიძლება გახდეს მოვალეობით მეტი ფერმენტებისა და საშუალებების დამატებით. ამიტომ, უნდა იცოდეთ, რა არის თქვენი საჭიროები და სად შეიძლება გააკეთოთ. პროცესში, შეძლებთ შექმნა ბიუჯეტი და მიმართება მას შემდეგ, რაც აშენებთ თქვენს კონტეინერ სახლს. Განსხვავებული მიზნებით, კონტეინერ სახლები შეიძლება იყოს უფრო ღარიბი არჩევანი პარადოქსის მიმართულების შედარებით. პირველი რიგით, ისინი სხვაოდან უფრო ვარაუდიანია. CDPH პრეფაბრიკაციური სახლი კონტეინერი ასევე მწვერვარია როგორც ისინი გამოიყენებიან ძველ სატრანსპორტო კონტეინერებს, რაც შემცირებს განათლებას და დაბრუნებას. ასევე, მოდულარული სახლები როგორც სატრანსპორტო კონტეინერები სრულყოფილად პერსონალიზებულია, რაც გიანებთ აშენებას სახლი იმასა, როგორიც გსურთ. Უფრო განვითარებულ მასშტაბში, რადგან კონტეინერული სახლების მოძრაობა იზრდება, იზრდება ყველა რესურსი, რაც ხალხს ხელს უწყობს, რომელიც გსურთ ასეთი სახლი. პრეფაბრიკატური კონტეინერის სახლი მოქმედია ბევრი ონლაინ ჯგუფი და ფორუმი, რომელშიც შეგიძლია ჩაერთვა და განახლება ჩვენ საკუთარი კონტეინერული სახლის მშენებლებით. სამშენებლო საზოგადოებები არის ადგილები, სადაც შეგიძლია მიიღო დახმარება, რჩევა ან უბრალოდ განახლება ადამიანებთან თქვენი მშენებლობის პროცესის წინა და განმავლობაში. Პრეფაბრიკირებული სახლი მიიღებს სტრუქტურული სიმტკიცისთვის განკუთვნილ სპეციალურ დიზაინს და შეძლებს უზრუნველყოფას უზრუნველყოფის წინააღმდეგ კარგი მოქმედების უზრუნველყოფას, რათა უზრუნველყოფას უზრუნველყოფის უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყოფას უზრუნველყ...... მოდულური დიზაინი მარტივად გადაადგილდება, დაყენება შესაძლებელია ადაპტირებული იყოს თქვენს პერსონალურ სურვილებს შესაბამად სხვადასხვა დიზაინზე, სტილზე და ოთახის ტიპებზე. ყველა კომპონენტი წინასწარ მომზადებულია და მარტივად მოსათავსებლად, არ სჭირდება კონკრეტული უნარები. ეს პრეფაბრიკირებული სახლი შეძლებს თქვენს საჭიროებებს დაკმაყოფილებას მიუხედავად იმისა, რომ ის განკუთვნილია საოფისე სივრცეების, საცხოვრებლად გამოსაყენებლად, საცავის ან სხვა ნებისმიერი სიტუაციის მიზნით. სტილის მხრივ მიმზიდველი გარეგნობა, გლუვი ხაზები და შესაძლებლობა პერსონალური გემოვნების მიხედვით ინდივიდუალურად მორგების, რათა შეიქმნას სრულყოფილი საცხოვრებლის სივრცე. ყველაზე მნიშვნელოვანია ის, რომ პრეფაბრიკირებული სახლების დაყენების დროს არ სჭირდება სავარძლის შეერთება ადგილზე, ხოლო ჩვენ მივაწოდებთ დაყენების ინსტრუქციებს, რათა დაყენება მარტივი და სწრაფი გახდეს. მიიღეთ საუკეთესო ცხოვრება, რომელსაც შეგიძლიათ ჰყავთ, აირჩიეთ კონტეინერული სახლები ან პრეფაბრიკირებული სახლები. Გააკეთეთ თქვენი სახლი უფრო უსაფრთხო და კომფორტული კონტეინერული სახლის მონტაჟით! ყველა სტრუქტურული კომპონენტი წინასწარ მომზადებულია საწარმოში. სწორი განზომილებების, კონფიგურაციისა და სტილის არჩევანით შეგიძლიათ სწრაფად შექმნათ თქვენი საცხოვრებლის სივრცე. რამდენიმე მოდული შეიძლება ინტეგრირდეს სხვადასხვა სარეცეპციო განლაგებაში მრავალფუნქციური კონტეინერული სახლების შესაქმნელად, რომლებიც შეიძლება გამოყენებულ იქნას საცხოვრებლის ოთახად, სამზარეულოდ ან საძინებლად — მომხმარებლის საჭიროებებისა და სურვილების მიხედვით. ყველაზე მნიშვნელოვანი არის ის, რომ ჩვენ გამოყენებული კონტეინერული სახლი მარტივად დაიშლება და შეკრებადია, მისი სტრუქტურა მაგრად არის აგებული და გამორჩევა განსაკუთრებული მახასიათებლებით: წყლის წინააღმდეგობა, წყლის შეღებვის წინააღმდეგობა, სიცოცხლის დაცვა და მონტაჟის პროცესი მარტივი და მარტივად მართვადია, რომელსაც არ სჭირდება სპეციალური ტექნიკური კვალიფიკაცია. პირადი საცხოვრებლის, საწყობის, დროებითი ოფისის ან სხვა მიზნების მიხედვით წინასწარ მომზადებული კონტეინერული სახლები შეიძლება მორგებულ იქნას თქვენს მოთხოვნებს. აიღეთ სარგებლობა ყუთის სახლის შესაძლებლობებით დღესვე, მიიღეთ უკეთესი ფასი და უკეთესი მომსახურება და გააუმჯობესეთ თქვენი საცხოვრებლის ხარისხი! Ვარდის სახლი, უნიკალური ფორმა, ლამაზი გარეგნობა, რაც თქვენს სახლს უფრო პერსონალიზებულს ხდის. ჩვენ გაძლევთ ფართო რაოდენობას ფერებისა და სტილების, რათა დააკმაყოფილოთ თქვენი სურვილები — მარტივი და თანამედროვე სტილიდან ტრადიციულამდე. პეკინის Чэндун კომპანია მომხმარებლის სურვილებსა და მოთხოვნებზე აკეთებს აკენტს. იგი შეიძლება იყოს ინდივიდუალურად შერჩეული თქვენს მოთხოვნებს შესაბამად. თქვენი საკუთარი სურვილებისა და სიმპათიების მიხედვით შეგიძლიათ შეცვალოთ სახლის გეგმის ფორმა, გეგმირება, წყალ-ელექტრო სისტემების განლაგება, ასევე ელექტრო და წყლის სისტემების განლაგება, რათა ააგოთ თქვენთვის უნიკალური და სრულყოფილი სახლი. წყალ-ელექტრო სადგურების წინასწარ მომზადება გვეხმარება არ გადავაწყობოთ მილები სახლის შემდგომი რემონტის შემდეგ, რაც ამატებს რემონტის ეფექტურობას და ხარისხს. ჩვენ გაძლევთ შიდა გეგმირების რამდენიმე ვარიანტს, რომლებშიც შედის საცხოვრებლის ოთახი და საჭმლის მიღების ოთახი, საძინებლები, სამზარეულო, საპირფარეშო და ა.შ. შეგიძლიათ აირჩიოთ ის ვარიანტი, რომელიც ყველაზე კარგად ემთხვევა თქვენს საჭიროებებს და სიმპათიებს, რათა შექმნათ თქვენთვის იდეალური და უნიკალური სახლი. ვარდის სახლი — ხარისხიანი ცხოვრების უმაღლესი ნიმუში! გაეცანით ვარდის სახლის კონტეინერული სახლების ფასებს! Გახურვის სახლი დაყრდნობაშია ტრადიციული სახლის Container homes cost-თან, რომელიც შეიძლება დაიზიანოს თქვენი მოთხოვნების მიხედვით, წარმოების მასივის გაკეთება და თქვენს ცხოვრების გარემოს უფრო უსაფრთხოდ და მั่ნამდენად გახდეს. ოთახი შეიძლება გამოიყენოს ინგების განსხვავებულ მოთხოვნების მიხედვით, რაც ნიშნავს, რომ თქვენ შეგიძლიათ კომფორტულად ცხოვროთ ნებისმიერ ადგილზე და ნებისმიერ დროს. სწრაფი მომწიდება! პაკეტირება და მომწიდება ასევე სწრაფია, რადგან ჩვენ გამოვიყენებთ პროფესიონალებს ჩვენი პაკეტირების სტაფის მიერ, რომელიც შესაბამისად თქვენს მოთხოვნებს პაკეტირებს გახურვის ოთახს და უზრუნველყოფს, რომ მიღებთ ყველაზე გამართლებული პროდუქტი. ჩვენ უზრუნველყოფენ მომწიდების ყოველი ნაბიჯი, რომ დარწმუნდეთ, რომ თქვენს პროდუქტებს უსაფრთხოდ და უსაფრთხოდ მიიღებიან მათი მიზნის მდგომარეობაში. გახურვის სახლი შეიძლება დაიყენოს გარეშე სადგურების სახლში და ჩვენ გვაძლევთ დაყენების ინსტრუქციებს, რათა გახურვა და მარტივი გახდეს. თუ მოგვიანებით ინსტრუქციების ნაბიჯებს, შეგიძლიათ მარტივად დაასრულოთ სახლის დაყენება, რომელიც გახურდება. CDPH წარმოქმნის და გაყიდებს განსხვავებულ ტიპის მოდულარ სახლებს, წინადადებით შემუშავებულ სახლებს და ვილა სახლებს. პროდუქციის გაფართოებული ასортიმენტი გვაძლევს შესაძლებლობას თითოეულ ინჟინრულ ტაბორისთვის საკმარის ამოხსნის გათვალისწინებას.Კონტეინერის სახლების ღირებულება
Რამდენი ღელად სჭირდება საკუთარი კონტეინერის სახლის შესაქმნელად?

Რომელია ფასური უფრო ეფექტური?

Რჩევები კოსტ-ეფექტიული კონტეინერული სახლის შესამზადებლად

Რატომ არის კონტეინერის სახლები ფასური არასავარაუდო ალტერნატივა?
Why choose CDPH
Კონტეინერის სახლების ღირებულება?
Ახალი მოსამაღლების სახლი
Good Sales container house
Სამიტი სტილი apple სახლი
Მაღალი ხარისხის შეკრუმებული სახლი
Დაკავშირებული პროდუქტის კატეგორიები
Ნვ ნაოპაგთრვ ქრჲ რპწბგაქ?
Მოთხოვნა ციფრით
Სვანეთსა და კვანძშიᲓაუკავშირდით
27+ წლის გამოცდილება
Ინჟინრული ტაბორის შემოწმება