1class ScriptDetailPrice extends Script { 2 constructor(params) { 3 super(params) 4 this.$unit = document.getElementById(`${this.attrId}`) 5 if (this.$unit === null) return; 6 /** unit-detail-price */ 7 this.U = (suffix, isSelector = true) => `${isSelector ? '.' : ''}unit-detail-price${suffix}` 8 // æ´å¤ä¼æ ä¿¡æ¯æé® 9 this.$detail = this.$unit.querySelector(this.U('--detail')) 10 // ææ£æ´å¤å表项 11 this.$discountList = this.$unit.querySelector(this.U('--discount-list')) 12 // å计æ¶ï¼æ¶ï¼åç§ 13 this.$date = this.$unit.querySelector(this.U(`--date`)) 14 this.$discountTimer = this.$unit.querySelector('.discount-timer') 15 this.$dd = this.$unit.querySelector(this.U('--date_limt--dd')) 16 this.$hh = this.$unit.querySelector(this.U('--date_limt--hh')) 17 this.$mm = this.$unit.querySelector(this.U('--date_limt--mm')) 18 this.$ss = this.$unit.querySelector(this.U('--date_limt--ss')) 19 20 this.$modal = this.$unit.querySelector(this.U('__model')) 21 this.$modalContent = this.$modal.querySelector(this.U('__model_content')) 22 this.$coupon = this.$unit.querySelector(this.U('_box--list')) 23 24 this.counpList = [] 25 this.isMoreCoupon = false 26 27 // æ¥æ¾åä»·ä¿¡æ¯å ç´ 28 this.$price = this.$unit.querySelector(this.U('--prices_sell-price')) 29 this.$cost = this.$unit.querySelector(this.U('--prices_cost-price')) 30 this.$newPrice = this.$price.querySelector(this.U('--prices_sell-price_new')) 31 this.$newCostPrice = this.$cost.querySelector(this.U('--prices_cost-price_new')) 32 33 //满åä¿¡æ¯ 34 this.$reduce = this.$unit.querySelector(this.U('__reduce')) 35 this.$off = this.$unit.querySelector(this.U('--prices__off')) 36 this.$costPriceMin = this.$cost.querySelector(this.U('--price_cost-price_original--min')) 37 this.$costPriceMax = this.$cost.querySelector(this.U('--price_cost-price_original--max')) 38 this.$originalPrice = this.$price.querySelector(this.U('--prices_sell-price_original')) 39 } 40 async init() { 41 // await new Load('/assets/plugins/couponSvg.js') 42 // åå§åæ´å¤detailå±å¼äºä»¶ 43 this.initDetailEvent() 44 this.initAllCounponList() 45 } 46 /** åå§åæ¾ç¤ºææ£ä¿¡æ¯ */ 47 initDicountInfo() { 48 const detail = window.app.info.productDetail 49 // æ¾ç¤ºæ»¡åä¿¡æ¯ 50 this.showReduce(detail) 51 // 妿æä¸æ¯éæ¶ææ£æ¾ç¤ºåä»· 52 if (!detail.is_discount) { 53 this.showOriginalPrice(detail) 54 } else { 55 this.showDiscountPrice(detail) 56 } 57 } 58 /** 59 * æ¾ç¤ºåä»· 60 * @param {产å详æ } detail 61 * @returns 62 */ 63 showOriginalPrice(detail) { 64 // éèææ£ä»·ä¿¡æ¯ 65 this.$newPrice.innerHTML = '' 66 this.$newCostPrice.innerHTML = '' 67 this.$off.classList.add('d-none') 68 this.$date.classList.add('d-none') 69 // ä»·æ ¼ 70 const $originalPriceSymbol = this.$unit.querySelector(this.U('--prices_sell--i')) 71 const $originalPriceMin = this.$price.querySelector(this.U('--price_sell-price_original--min')) 72 const $originalPriceMax = this.$price.querySelector(this.U('--price_sell-price_original--max')) 73 if (this.$originalPrice) this.$originalPrice.classList.remove('d-none') 74 if ($originalPriceMin) { 75 $originalPriceMin.innerHTML = '' 76 if (detail.min_price <= 0) { 77 this.$unit.querySelector(this.U('__box-time')).classList.add('d-none') 78 $originalPriceSymbol.classList.add('d-none') 79 //this.$originalPrice.innerHTML = window.app.utilts.$t('No Quotation') 80 } 81 else { 82 this.$unit.querySelector(this.U('__box-time')).classList.remove('d-none') 83 $originalPriceSymbol.classList.remove('d-none') 84 $originalPriceMin.innerHTML = `${detail.min_price}` 85 window.app.info.productDetail.mainPrice = detail.min_price // 设置主产åä»·æ ¼,ç¨äºæé 产å计ç®ä»·æ ¼ 86 window.app.info.productDetail.mainOriginalPrice = detail.min_cost_price // 设置主产åä»·æ ¼,ç¨äºæé 产å计ç®ä»·æ ¼ 87 let matchProductsTotal = window.app.info.productDetail.matchProductsTotal || 0 88 // 妿ææé 产åï¼è®¡ç®æ»ä»· 89 let matchTotal = document.querySelector(`#${this.attrId} .pm-total-price`) 90 if (matchTotal) { 91 matchTotal.innerHTML = `$${(detail.min_price + matchProductsTotal).toFixed(2)}` 92 } 93 94 let matchProductsOriginalTotal = window.app.info.productDetail.matchProductsOriginalTotal || 0 95 // 妿ææé 产åï¼è®¡ç®æ»ä»· 96 let matchOriginalTotal = document.querySelector(`#${this.attrId} .pm-original-total-price`) 97 if (matchOriginalTotal) { 98 matchOriginalTotal.innerHTML = `$${(detail.min_cost_price + matchProductsOriginalTotal).toFixed(2)}` 99 } 100 } 101 } 102 const isShowMaxPrice = detail.max_price !== 0 && detail.min_price !== detail.max_price 103 if (isShowMaxPrice && $originalPriceMax) $originalPriceMax.innerHTML = `ï½ ${detail.max_price}` 104 else if ($originalPriceMax) $originalPriceMax.classList.add('d-none') 105 // éå®ä»·æ ¼ 106 const $costPrice = this.$cost.querySelector(this.U('--prices_cost-price_original')) 107 if ($costPrice) $costPrice.classList.remove('d-none') 108 // 为0䏿¾ç¤º 109 if (detail.min_price <= 0) this.$costPriceMin.innerHTML = '' 110 else if (detail.min_cost_price <= 0)this.$costPriceMin.innerHTML = '' 111 else this.$costPriceMin.innerHTML = `$${detail.min_cost_price}` 112 const isShowMaxCostPrice = detail.max_cost_price !== 0 && detail.min_cost_price !== detail.max_cost_price
113 if (isShowMaxCostPrice && this.$costPriceMax) this.$costPriceMax.innerHTML = `ï½ ${detail.max_cost_price}` 114 else this.$costPriceMax.classList.add('d-none') 115 if(detail.min_cost_price <= 0){ 116 this.$costPriceMax.innerHTML =`$${detail.max_cost_price}` 117 } 118 } 119 /** 120 * æ¾ç¤ºææ£ä»·æ ¼ï¼å为é»è®¤æ¾ç¤ºï¼åéæ©æ¬¾å¼ä»¥åçæ¾ç¤º 121 * @param {产å详æ } detail 122 * @returns 123 */ 124 showDiscountPrice(detail) { 125 // éèåä»·ä¿¡æ¯ 126 this.$costPriceMin.innerHTML = '' 127 this.$costPriceMax.classList.add('d-none') 128 this.$originalPrice.classList.add('d-none') 129 this.$unit.querySelector(this.U('__box-time')).classList.remove('d-none') 130 const $originalPriceSymbol = this.$unit.querySelector(this.U('--prices_sell--i')) 131 // æ¾ç¤ºä»·æ ¼ä¸ºææ£çä»·æ ¼ 132 this.$newPrice.innerHTML = '' 133 if (detail.is_pattern) { //å¦ææ¬¾å¼åºé æ¾ç¤ºå¹é ä»·æ ¼ 134 if (detail.discount_price <= 0) { 135 // this.$newPrice.innerHTML = window.app.utilts.$t('No Quotation') 136 $originalPriceSymbol.classList.add('d-none') 137 } else { 138 $originalPriceSymbol.classList.remove('d-none') 139 this.$newPrice.innerHTML = `${detail.discount_price}` 140 } 141 } 142 else if (!detail.is_pattern) { 143 console.log(detail,'detaildetail') 144 if (detail.discount_min_price < 0) { 145 // this.$newPrice.innerHTML = window.app.utilts.$t('No Quotation') 146 $originalPriceSymbol.classList.add('d-none') 147 } else{ 148 $originalPriceSymbol.classList.remove('d-none') 149 //款å¼ä¸å¹é ææå¤§æå°æ¾ç¤ºä»·æ ¼åºé´ 150 var new_price = `${detail.max_price||detail.discount_price||detail.discount_max_price}` 151 this.$newPrice.innerHTML = `${detail.min_price}ï½${new_price}` 152 if (detail.min_price == new_price) { 153 //款å¼ä¸å¹é ææå¤§æå°æ¾ç¤ºä»·æ ¼åºé´ 154 this.$newPrice.innerHTML = `${detail.min_price}` 155 } 156 } 157 // else if (detail.discount_min_price !== detail.discount_max_price) { 158 // $originalPriceSymbol.classList.remove('d-none') 159 // //款å¼ä¸å¹é ææå¤§æå°æ¾ç¤ºä»·æ ¼åºé´ 160 // this.$newPrice.innerHTML = `${detail.discount_min_price}ï½${detail.discount_max_price}` 161 // } 162 // else { 163 // $originalPriceSymbol.classList.remove('d-none') 164 // this.$newPrice.innerHTML = `${detail.discount_min_price}` 165 // } 166 } 167 168 // æ¾ç¤ºçéå®ä»·æ ¼ä¸ºææ£åçä»·æ ¼ 169 this.$newCostPrice.innerHTML = '' 170 if (detail.is_pattern) { //å¦ææ¬¾å¼åºé æ¾ç¤ºå¹é ä»·æ ¼ 171 if (detail.discount_price <= 0) this.$newCostPrice.innerHTML = '' 172 else this.$newCostPrice.innerHTML = `$${detail.discount_original_price}` 173 } else { 174 if (detail.discount_sell_min_price <= 0) this.$newCostPrice.innerHTML = '' 175 else if (detail.discount_sell_min_price !== detail.discount_sell_max_price) { 176 //款å¼ä¸å¹é ææå¤§æå°æ¾ç¤ºä»·æ ¼åºé´ 177 this.$newCostPrice.innerHTML = `$${detail.min_price}ï½${detail.discount_sell_max_price}` 178 } else if (detail.discount_min_price !== 0) { 179 this.$newCostPrice.innerHTML = `$${detail.discount_sell_min_price}` 180 } 181 } 182 // 设置æ¾ç¤ºéä»·çæ¯ç 183 this.$off.classList.remove('d-none') 184 const $offRate = this.$off.querySelector(this.U('--prices_dis')) 185 $offRate.textContent = '' 186 if (detail.is_pattern) { 187 $offRate.textContent = `${detail.off_rate}% ` + window.app.utilts.$t('Off') 188 } else { 189 if (detail.off_rate > 0) { 190 $offRate.textContent = `${detail.off_rate}% ` + window.app.utilts.$t('Off') 191 this.$off.classList.remove('d-none') 192 } 193 else if (detail.min_off_rate !== detail.off_rate) { 194 $offRate.textContent = `${detail.min_off_rate}ï½${detail.off_rate}% ` + window.app.utilts.$t('Off') 195 } 196 } 197 // åè®¡æ¶ 198 if (window.innerWidth < 768) { 199 const parent = document.querySelector('.unit-detail_content') 200 if (parent) parent.prepend(this.$date) 201 } 202 this.countTime() 203 } 204 205 /** æ¾ç¤ºæ»¡åä¿¡æ¯ */ 206 showReduce(detail) { 207 const $reduceList = this.$reduce.querySelector(this.U('__reduce--list')) 208 const $show = this.$reduce.querySelector(this.U('__reduce--show')) 209 if ($reduceList === null || !detail.reduction || $reduceList.childNodes.length > 0) return 210 this.$reduce.classList.remove('d-none') 211 $reduceList.innerHTML = '' 212 detail.reduction.split(';').forEach((item, index) => { 213 const $el = document.createElement('div') 214 $el.classList.add('unit-detail-price__reduce--item') 215 if (index === 0 || window.innerWidth > 768) $el.classList.add('show') 216 $el.innerHTML = `<span class="unit-detail-price__reduce--txt">${item}</span>` 217 $reduceList.appendChild($el) 218 }) 219 $reduceList.title = detail.reduction 220 const $reduceLink = this.$reduce.querySelector(this.U('__reduce--a')) 221 if ($reduceLink === null) return 222 $reduceLink.onclick = () => { 223 window.location.href = globalThis.Server.getRinseHref(`/reduction_detail/${detail.reduction_id}.html`, window.app.info.site) 224 } 225 // å±å¼ç¬¦ 226 $show.onclick = () => { 227 this.showReduceModal(detail) 228 } 229 } 230 showReduceModal(params) { 231 const $frage = document.createDocumentFragment() 232 const $div = document.createElement('div') 233 $div.classList.add('unit-detail-price__reduce--list') 234 params.reduction.split(';').forEach(data => { 235 const $el = document.createElement('div') 236 $el.classList.add('unit-detail-price__reduce--item', 'show') 237 $el.innerHTML = `<div class="unit-detail-price__reduce--txt">${data}</div>` 238 $div.appendChild($el) 239 }) 240 $frage.appendChild($div) 241 const modal = new Modal() 242 modal.init({ 243 title: window.app.utilts.$t('Offers and Discounts'), 244 body: $frage, 245 isHideCancel: true, 246 className: 'reduce-modal', 247 submitText: window.app.utilts.$t('Shop now'), 248 onSubmit: () => location.href = globalThis.Server.getRinseHref(`/reduction_detail/${params.reduction_id}.html`, window.app.info.site), 249 onCancel: () => modal.destroy() 250 }).open() 251 } 252 /** 253 * æ ¹æ®äº§åä¿¡æ¯æ¾ç¤ºåè®¡æ¶ 254 * @param {产åä¿¡æ¯} product 255 */ 256 countTime() { 257 // 妿æå计æ¶ï¼å¤çæ¾ç¤ºåè®¡æ¶ 258 if (window.app.info.productDetail.is_discount) { 259 if (this.$date) this.$date.classList.remove('d-none') 260 const time = window.app.info.productDetail.count_time 261 this.utilts.countTime(this.utilts.getTimeParseInt(time), this.$discountTimer, 262 window.app.info.productDetail.detail_type, () => { 263 // å¦ææ¯æ£å¨è¿è¡çæ´»å¨ï¼ä»·æ ¼æ¢å¤æ£å¸¸ 264 if (window.app.info.productDetail.detail_type === 'now') { 265 setTimeout(() => { 266 this.countTimeFinish() 267 }, 1000); 268 } else if (window.app.info.productDetail.detail_type === 'upcoming') { 269 // 妿æ¯å³å°è¿è¡çæ´»å¨ï¼ç»§ç»å计æ¶ä¸ºæ£å¨è¿è¡çæ´»å¨ 270 this.countTime() 271 } 272 }) 273 } 274 } 275 /** åå§åæ´å¤detailå±å¼äºä»¶ */ 276 initDetailEvent() { 277 //å¦ææ²¡ædetail éåº 278 if (!this.$detail) return; 279 const $detailIcon = this.$unit.querySelector(this.U('--detail_icon')) 280 this.$detail.addEventListener('click', () => { 281 if (!this.isMoreCoupon) { 282 $detailIcon.classList.add('rotate-icon') 283 this.setCouponList(this.counpList) 284 this.isMoreCoupon = true 285 } else { 286 $detailIcon.classList.remove('rotate-icon') 287 this.renderCouponList() 288 this.isMoreCoupon = false 289 } 290 }) 291 } 292 /** å计æ¶ç»ææ¶ï¼å¤çç¸å ³ä¿¡æ¯ */ 293 async countTimeFinish() { 294 await window.app.info.updataDetailDiscountInfo() 295 window.app.info.productDetail.is_discount = 0 296 //éèåè®¡æ¶ 297 if (this.$date) this.$date.classList.add('d-none') 298 // éèææ£ 299 this.$off.classList.add('d-none') 300 this.$newPrice.innerHTML = '' 301 this.$newCostPrice.innerHTML = '' 302 this.$newPrice.innerText = '' 303 this.$newCostPrice.innerText = '' 304 this.render() 305 } 306 // è·å产åç伿 å¸ 307 getProductCoupon() { 308 return this.utilts.request({ 309 url: '/coupon/product-coupons', 310 method: 'GET', 311 params: { 312 product_id: window.app.info.productDetail.product_id 313 } 314 }) 315 } 316 // æ¾ç¤ºäº§å伿 å¸ 317 async renderCouponList() { 318 const resData = await this.getProductCoupon() 319 this.counpList = resData.data 320 if (this.counpList.length > 0) { 321 this.$coupon.classList.remove('d-none') 322 const list = this.counpList.filter((_, i) => i <= 1) 323 this.setCouponList(list) 324 // æ¯å¦æ¾ç¤ºæ´å¤é¡¹ 325 const $moreCoupon = this.$unit.querySelector('.unit-detail-price--detail') 326 if ($moreCoupon && this.counpList.length > 2) { 327 $moreCoupon.classList.remove('d-none') 328 } 329 } 330 331 } 332 // 设置产å伿 å¸èç¹ 333 setCouponList(list) { 334 this.$discountList.innerHTML = '' 335 const $items = document.createElement('div') 336 $items.classList.add('unit-detail-price--discount-list_items') 337 list.forEach(data => $items.append(this.getCouponNode(data))) 338 this.$receive = document.createElement('div') 339 this.$receive.classList.add('unit-detail-price--discount-get--coupons') 340 if (window.innerWidth > 768) { 341 this.$receive.textContent = window.app.utilts.$t('Get coupons') 342 } else { 343 this.$receive.classList.add('iconfont', 'icon-action-left-lighter') 344 } 345 $items.append(this.$receive)
346 this.$discountList.append($items) 347 this.$receive.onclick = () => this.onShowCoupon() 348 } 349 // çæäº§å伿 å¸èç¹ 350 getCouponNode(data) { 351 const $node = document.createElement('div') 352 $node.classList.add('unit-detail-price--discount-list_item') 353 let innerHtml = this.getCouponHtml(data) 354 $node.innerHTML = innerHtml 355 this.$receive = $node.querySelector('.unit-detail-price--discount-list__item--receive') 356 357 return $node 358 } 359 getCouponHtml(data) { 360 const discount = data.discount_setting 361 const discountStr = discount.discount_type === 2 ? `$${this.utilts.toFixed(discount.discount_value / 100)}` 362 : (`${this.utilts.toFixed((1000 - discount.discount_value) / 10)}% ` + window.app.utilts.$t('Off')) 363 const usage_amount = data.usage_amount ? (window.app.utilts.$t('for order over') + ` $${this.utilts.toFixed(data.usage_amount / 100)}`) : window.app.utilts.$t('All Orders') 364 const htmlList = [] 365 // Get xx% off for order over $xxx 366 htmlList.push(`<div class="unit-detail-price--discount-list__item-inner">`) 367 htmlList.push(` <div class="unit-detail-price--discount-list__item--off">`) 368 htmlList.push(` ` + window.app.utilts.$t('Get') + ` ${discountStr} ${usage_amount}`) 369 htmlList.push(` </div>`) 370 htmlList.push(`</div>`) 371 return htmlList.join('') 372 } 373 /** ææä¼æ å¸å¼¹çªæ¾ç¤º */ 374 async initAllCounponList() { 375 await new Load('/assets/plugins/coupon-list.js') 376 const couponList = new PluginCouponList(this.attrId, { 377 cols_col: 12, 378 cols_md: 6, 379 cols_xl: 6, 380 show_coupon: 1, 381 show_code: 1 382 }) 383 this.coupon = await couponList.init() 384 this.$modalContent.append(this.coupon.$baseNode) 385 } 386 onShowCoupon() { 387 const modal = new Modal() 388 modal.init({ 389 body: this.$modal, 390 title: window.app.utilts.$t('Get discount'), 391 size: 'lg', 392 className: 'coupon-modal', 393 isHideCancel: true, 394 isHideSubmit: true, 395 submitText: 'Confirm', 396 onCancel: () => modal.destroy() 397 }).open() 398 this.coupon.renderSvg() 399 } 400 render() { 401 this.initDicountInfo() 402 this.renderCouponList() 403 const wholesale = ScriptWholesalePrice.ins(this.attrId) 404 wholesale.init() 405 } 406} 407 408/** 409 * æ¹åä»· 410 */ 411class ScriptWholesalePrice { 412 constructor(attrId) { 413 this.attrId = attrId 414 this.$unit = document.getElementById(`${this.attrId}`) 415 416 this.U = (suffix, isSelector = true) => `${isSelector ? '.' : ''}unit-detail-price${suffix}` 417 418 this.$wholesaleItem = this.$unit.querySelector('.unit-detail-price__wholesale--items') 419 this.$wholesales = this.$unit.querySelector('.unit-detail-price__wholesale') 420 } 421 422 /** å便¨¡å¼ */ 423 static ins(attrId) { 424 if (!this.instance || window.app.utilts.checkDesign()) return this.instance = new ScriptWholesalePrice(attrId) 425 return this.instance 426 } 427 428 init() { 429 this.setWholesaleList() 430 } 431 432 setWholesaleList() { 433 // æ¹åä»·æ¹å¼ 434 const wholesale_method = window.app.info.productDetail.wholesale_method 435 // æ¹åä»·å表 436 const list = window.app.info.productDetail.wholesale 437 this.$unit.querySelector('[unit-type="price"]').style.setProperty('display','block') 438 this.$unit.querySelector('[unit-type="price"]').classList.remove('d-none') 439 if (wholesale_method && list.length <= 4) { 440 this.$wholesales.classList.remove('d-none') 441 let wholesaleHtml = `` 442 list.forEach(item => { 443 const newItem = this.setItem(item, wholesale_method) 444 wholesaleHtml += this.getHtml(newItem) 445 }) 446 this.$wholesaleItem.innerHTML = wholesaleHtml 447 } else { 448 if (this.$unit.querySelector(this.U('__box-time')).classList.contains('d-none') && this.$unit.querySelector('[unit-type="price"]')) { 449 // æ´ä¸ªä»·æ ¼åéè 450 this.$unit.querySelector('[unit-type="price"]').classList.add('d-none') 451 this.$unit.querySelector('[unit-type="price"]').style.setProperty('display','none','important') 452 } 453 } 454 } 455 456 setItem(item, wholesale_method) { 457 const unit_price = this.getUnitPrice() 458 if (wholesale_method === 2) { 459 item.discount_limit = (100 - ((item.discount / 1000) / 10 * 100)) 460 item.total_price = unit_price * (item.discount / 1000) / 10 461 } else { 462 item.discount_limit = unit_price ? ((unit_price - (item.discount / 100)) / unit_price * 100).toFixed(2) : 0 463 item.total_price = item.discount / 100 464 } 465 item.discount_limit = Number(Number(item.discount_limit).toFixed(2)) 466 item.total_price = Number(Number(item.total_price).toFixed(2)) 467 return item 468 } 469 470 getUnitPrice() { 471 const defail = window.app.info.productDetail 472 // å¦ææ¯ææ£å¹¶ä¸æåä»· 473 if (defail.is_discount == 1 && defail.discount_original_price) return defail.discount_original_price 474 // å¦ææ¯ææ£å¹¶ä¸æ²¡æåä»· 475 else if (defail.is_discount == 1 && !defail.discount_original_price) return defail.discount_sell_min_price 476 // 䏿¯ææ£è¿åæå°éå®ä»·æ ¼ 477 else return defail.min_price 478 } 479 getHtml(item) { 480 return ` 481 <div class="unit-detail-price__wholesale--prices col-md-6 col-xl-3
481col-12"> 482 <div class="unit-detail-price__wholesale--number">${item.quantity}+ ${window.app.utilts.$t('Pieces')}</div> 483 <div class="unit-detail-price__wholesale--discont">${item.discount_limit}% ${window.app.utilts.$t('Off')}</div> 484 <div class="unit-detail-price__wholesale--price"> 485 <span class="unit-detail-price__wholesale--i">$</span> 486 <span>${item.total_price}</span> 487 </div> 488 </div> 489 ` 490 } 491}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.