You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1199 lines
45 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div
  3. class="service-content tw-mb-[60px] tw-grid tw-grid-cols-1 tw-gap-[30px] md:tw-mb-[100px] xl:tw-px-[60px] xl:tw-max-w-screen-xl xl:tw-mx-auto xl:tw-grid-cols-[auto_364px]">
  4. <mobileFixTopBar ref="stickySwiper" :fixBar="fixBar" :currStep="currStep" :list="fixBarList"></mobileFixTopBar>
  5. <section class="step sercion-1 tw-w-full md:tw-px-[30px] xl:tw-px-0 xl:tw-col-span-2">
  6. <div class="tw-mt-[20px] md:tw-mb-[11px] md:tw-mt-[40px]">
  7. <Breadcrumbs></Breadcrumbs>
  8. </div>
  9. <div v-if="content.banners.length" class="tw-w-full">
  10. <slideshow :banners="content.banners"></slideshow>
  11. </div>
  12. </section>
  13. <section class="sercion-2 tw-px-[30px] md:tw-px-[30px] xl:tw-px-0 xl:tw-col-start-1 xl:tw-row-start-2">
  14. <h1 class="t16 tw-mb-[18px] md:t24">{{ content.name }}</h1>
  15. <div v-if="content.supplier"
  16. class="supplier tw-flex tw-items-center tw-mb-[20px] tw-text-base-primary t14 md:tw-mb-[30px] md:t16 md:tw-font-normal">
  17. <img :src="content.supplier.logo" class="tw-max-w-[40px] md:tw-max-w-[80px]" />
  18. <div class="t14 tw-font-normal tw-ml-[10px] md:t18 md:tw-font-normal">
  19. {{ content.supplier.brand }}
  20. </div>
  21. </div>
  22. <div class="editor-styleguide tw-text-base-primary" v-html="content.highlights"></div>
  23. </section>
  24. <section
  25. class="sercion-3 tw-grid tw-grid-cols-1 tw-gap-[30px] md:tw-gap-[40px] md:tw-px-[30px] xl:tw-px-0 xl:tw-col-start-1 xl:tw-row-start-3">
  26. <div ref="packageOptions" id="packageOptions" class="step">
  27. <div class="tw-px-[30px] md:tw-px-0">
  28. <h2 class="title-icon-left t16 tw-mb-[20px] md:t24">
  29. {{ $t("Package Options") }}
  30. </h2>
  31. <p class="text-slate-600 t12 md:t16">{{ $t("Select the exhibition you want to attend, and add the storage and delivery service of exhibits or truck pickup service") }}</p>
  32. </div>
  33. <div class="tw-w-full tw-bg-neutrals-100 tw-px-[20px] tw-py-[30px] md:tw-p-[30px] tw-rounded-[20px]">
  34. <div class="">
  35. <div class="group tw-mb-[40px] tw-px-[20px] tw-py-[30px] tw-rounded-[20px] tw-bg-white">
  36. <h3 class="t14 tw-font-bold tw-mb-[30px] md:t16 tw-block">
  37. {{ $t("Select Exhibition") }}
  38. </h3>
  39. <selectExhibition ref="ref_selectExhibition" :selectYearList="selectYearList" :selectMonthList="selectMonthList"></selectExhibition>
  40. </div>
  41. <div class="group tw-mb-[20px] tw-p-[20px] tw-rounded-[20px] tw-bg-white">
  42. <h3 class="t14 tw-font-bold tw-mb-[20px] md:t16 tw-block">
  43. {{ $t("Select exhibition hall service") }}
  44. </h3>
  45. <div class="tw-mb-[20px]">
  46. <p class="tw-text-neutrals-500 tw-font-normal md:t16">{{ $t("Storage service of exhibits in the exhibition hall, and assistance in transportation to the designated booth") }}</p>
  47. </div>
  48. <selectExhibitionService v-for="(item,index) in selectExhibitionServiceList"
  49. :key="item.id" :ref="'ref_selectExhibitionitem'+item.id" @ChangeCosts="ChangeCosts($event)"
  50. :selectQuantityList="selectQuantityList"
  51. :selectPackageList="selectPackageList"
  52. :typeGroupList="typeGroupList"
  53. :sort="index+1"
  54. :show = "item.id == showServiceItem"
  55. @delExhibitionService="delExhibitionService(item.id)">
  56. </selectExhibitionService>
  57. <v-btn outlined class="tw-rounded-[16px] remove-upper tw-border-primary-2 tw-text-primary-1 tw-flex tw-items-center"
  58. style="padding: 24px 10px" width="100%" @click="addExhibitionService">
  59. <v-img max-width="20" class="tw-mr-[8px]" :src="require(`@/assets/svg/new.svg`)"></v-img>
  60. <span class="t18 tw-font-normal">{{ $t("New exhibit specifications") }}</span>
  61. </v-btn>
  62. </div>
  63. <div v-show="showCardItem" class="group tw-mb-[20px] tw-p-[20px] tw-rounded-[20px] tw-bg-white">
  64. <div class="tw-flex tw-justify-between tw-items-center">
  65. <h3 class="t14 tw-font-bold tw-mb-[20px] md:t16">
  66. {{ $t("Select truck pickup service") }}
  67. </h3>
  68. <v-img v-show="pickupServiceShow" max-width="18" max-height="19" class="tw-mr-[8px] tw-cursor-pointer" :src="require(`@/assets/svg/delete_default.svg`)" @click="deletePickupSerivce()"></v-img>
  69. </div>
  70. <div class="tw-mb-[20px]">
  71. <p class="tw-text-neutrals-500 tw-font-normal md:t16">{{ $t("Pick up the goods at the designated place and transport them to the exhibition hall") }}</p>
  72. </div>
  73. <div v-show="pickupServiceShow">
  74. <div>
  75. <quantitySelectGroup ref="ref_quantitySelectGroup" :label="'Select quantity'" :quantitySelectList="quantitySelectList" @ChangeCosts="ChangeCosts($event)">
  76. </quantitySelectGroup>
  77. </div>
  78. <h3 class="t14 tw-font-bold tw-mb-[20px] md:t16 tw-block">
  79. {{ $t("Fill in the picking information") }}<span class="required t12 md:t14">*</span>
  80. </h3>
  81. <pickupInformation :selectAddressList="selectAddressList" ref="ref_pickupService" @ChangeCosts="ChangeCosts($event)"></pickupInformation>
  82. </div>
  83. <v-btn v-show="pickupServiceShow==false" outlined class="tw-rounded-[16px] remove-upper tw-border-primary-2 tw-text-primary-1 t18"
  84. style="padding: 24px 10px" width="100%" @click="pickupServiceShow = true">
  85. <v-img max-width="20" class="tw-mr-[8px]" :src="require(`@/assets/svg/new.svg`)"></v-img>
  86. <span class="t18 tw-font-normal">{{ $t("New pickup service") }}</span>
  87. </v-btn>
  88. </div>
  89. <div class="md:tw-flex md:tw-justify-between md:tw-items-center">
  90. <div class="tw-flex tw-justify-between tw-items-start md:tw-w-full md:tw-basis-10/12">
  91. <div class="tw-flex tw-flex-col tw-justify-center">
  92. <div class="tw-flex tw-items-center tw-mb-[8px] md:tw-mb-0">
  93. <div class="tw-body-4 tw-text-neutrals-900 tw-mr-[10px] md:t24">
  94. ${{ finalPrice }} {{ currencyName }}
  95. </div>
  96. </div>
  97. <!-- <div class="tw-hidden tw-body-4 tw-text-neutrals-600 md:tw-hidden">
  98. Deposit fee: $5 {{ currency }} (10%)
  99. </div> -->
  100. </div>
  101. <like></like>
  102. </div>
  103. <button
  104. class="tw-transition tw-btn-md tw-text-white tw-border tw-border-solid tw-border-primary-default tw-bg-primary-default tw-py-[8.5px] tw-mt-[20px] tw-w-full tw-rounded-xl md:tw-mt-0 md:tw-ml-[36px] md:tw-w-auto md:tw-basis-2/12 disabled:tw-bg-neutral-100 disabled:tw-text-base-disable disabled:tw-border-neutral-200"
  105. @click="bookNow" :disabled="btnDisabled">
  106. {{ $t("Book Now") }}
  107. </button>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <div id="serviceDetails" class="serviceDetails step">
  113. <div class="tw-px-[30px] md:tw-px-0">
  114. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  115. {{ $t("Service Details") }}
  116. </h2>
  117. <div v-for="(item,index) in expenseRules" :key="index">
  118. <h3 class="t16 tw-mb-[20px] md:18 xl:t18 xl:tw-font-bold tw-pl-[10px]">
  119. {{ index+1 }}.&nbsp;{{ item.ItemName }}
  120. </h3>
  121. <table class="tablecss" width="100%" v-if="item.ItemType=='01'">
  122. <thead class="tw-bg-[#343434]">
  123. <tr>
  124. <th class="tw-text-[#fefefe]">{{$t('Weight')}}</th>
  125. <th class="tw-text-[#fefefe]">{{$t('Price (NT $, tax included)')}}</th>
  126. </tr>
  127. </thead>
  128. <tbody>
  129. <template v-if="item.StackerCostRules && item.StackerCostRules.length>0">
  130. <tr v-for="item2 in item.StackerCostRules" :key="item2.Guid">
  131. <td width="50%">{{item2.Weight_Min}}{{$t('More than tons to')}}{{item2.Weight_Max}}{{$t('Less than tons')}}</td>
  132. <td width="50%">{{item2.Price}}<span v-if="item2.PricingMode=='N'">{{$t('NTD/piece')}}</span><span v-else>{{$t('NTD/ton')}}</span></td>
  133. </tr>
  134. </template>
  135. </tbody>
  136. </table>
  137. <div ref="details" class="editor-styleguide tw-text-base-primary t14 md:t16 md:tw-font-normal"
  138. v-html="item.ExpensesMemo"></div>
  139. </div>
  140. <!-- <div v-if="content.details.length < 800">
  141. <div ref="details" class="editor-styleguide tw-text-base-primary t14 md:t16 md:tw-font-normal"
  142. v-html="content.details"></div>
  143. </div>
  144. <div v-else>
  145. <div :class="[
  146. button.details ? 'seeMore-hide' : 'seeMore-show',
  147. 'editor-styleguide tw-text-base-primary tw-transition t14 md:t16 md:tw-font-normal',
  148. ]" ref="details" v-html="content.details"></div>
  149. <button v-show="seeMore.details" :class="[
  150. 'seeMore tw-transition tw-btn-md tw-text-primary-1 tw-border tw-border-solid tw-border-primary-1 tw-px-[30px] tw-py-[8.5px] tw-mt-[20px] tw-w-full tw-rounded-xl hover:tw-bg-primary-3 xl:hover:tw-bg-transparent xl:tw-border-none',
  151. button.details ? '' : 'open',
  152. ]" @click="opendetail()">
  153. {{ $t(seeMoreDetailsText) }}
  154. </button>
  155. </div> -->
  156. </div>
  157. </div>
  158. <div id="cancellationPolicy" class="cancellationPolicy step tw-px-[30px] md:tw-px-0">
  159. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  160. {{ $t("Cancellation Policy") }}
  161. </h2>
  162. <div v-if="content.cancellation_policy.length < 800">
  163. <div ref="cancellation_policy" class="editor-styleguide tw-text-base-primary t14 md:t16 md:tw-font-normal"
  164. v-html="content.cancellation_policy">
  165. </div>
  166. </div>
  167. <div v-else>
  168. <div :class="[
  169. button.cancellation_policy ? 'seeMore-hide' : 'seeMore-show',
  170. 'editor-styleguide tw-text-base-primary tw-transition t14 md:t16 md:tw-font-normal',
  171. ]" ref="cancellation_policy" v-html="content.cancellation_policy"></div>
  172. <button v-show="seeMore.cancellation_policy" :class="[
  173. 'seeMore tw-transition tw-btn-md tw-text-primary-1 tw-border tw-border-solid tw-border-primary-1 tw-px-[30px] tw-py-[8.5px] tw-mt-[20px] tw-w-full tw-rounded-xl hover:tw-bg-primary-3 xl:hover:tw-bg-transparent xl:tw-border-none',
  174. button.cancellation_policy ? '' : 'open',
  175. ]" @click="openCancellationPolicy()">
  176. {{ $t(seeMoreCancellationPolicyText) }}
  177. </button>
  178. </div>
  179. </div>
  180. <div id="faq" ref="faq" class="step tw-px-[30px] md:tw-px-0">
  181. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  182. {{ $t("FAQ") }}
  183. </h2>
  184. <faq :faq="content.faq" class="tw-z-[8]"></faq>
  185. </div>
  186. <div id="contactUs" class="step tw-px-[30px] md:tw-px-0">
  187. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  188. {{ $t("Contact Us") }}
  189. </h2>
  190. <div class="tw-body-3 tw-text-base-primary tw-mb-[20px]">
  191. 886-2-2725-5000
  192. </div>
  193. <div class="tw-body-3 tw-text-base-primary">info@showeasy.com</div>
  194. </div>
  195. <div :class="[
  196. 'tw-bg-white tw-flex tw-flex-cols tw-justify-between tw-items-center tw-px-[30px] tw-py-[16px] tw-w-full',
  197. fixBar
  198. ? 'tw-fixed tw-left-[0px] tw-bottom-[0px] tw-z-[8] tw-shadow-[1px_0px_2px_rgba(0,0,0,0.25)]'
  199. : 'tw-hidden',
  200. ]">
  201. <div :class="[
  202. 'tw-flex tw-flex-col tw-justify-between tw-items-start tw-grow md:tw-w-full md:tw-flex-row md:tw-items-center',
  203. ]">
  204. <div class="tw-flex tw-items-center tw-mb-[12px] md:tw-mb-0">
  205. <div class="t16 tw-text-neutrals-900 tw-mr-[10px] md:t20 md:tw-mr-0">
  206. ${{ finalPrice }} {{ currencyName }}
  207. </div>
  208. </div>
  209. <div class="tw-flex tw-justify-center tw-items-center tw-w-full md:tw-w-fit">
  210. <like></like>
  211. <button
  212. class="tw-transition tw-whitespace-nowrap tw-body-4 tw-text-white tw-border tw-border-solid tw-border-primary-default tw-bg-primary-default tw-ml-[22px] tw-px-[24px] tw-py-[8.5px] tw-rounded-xl tw-w-full md:tw-body-2 md:tw-min-w-[130px] md:tw-max-w-[130px] md:tw-mt-0 disabled:tw-bg-neutral-100 disabled:tw-text-base-disable disabled:tw-border-neutral-200"
  213. @click="bookNow" :disabled="btnDisabled">
  214. {{ $t("Book Now") }}
  215. </button>
  216. </div>
  217. </div>
  218. </div>
  219. </section>
  220. <section
  221. class="sercion-4 tw-px-[30px] tw-grid tw-grid-cols-1 tw-gap-[40px] tw-z-[8] md:tw-px-[30px] xl:tw-px-0 xl:tw-col-start-1 xl:tw-row-start-4">
  222. <detailsModal :detail="content.details"></detailsModal>
  223. <cancellationPolicyModal :cancellationPolicy="content.cancellation_policy"></cancellationPolicyModal>
  224. </section>
  225. <section class="sercion-5 tw-hidden md:tw-px-[30px] xl:tw-px-0 xl:tw-block xl:tw-row-start-2 xl:tw-row-end-5">
  226. <div class="tw-mb-[40px]">
  227. <sidebarSelectOption :totalPrice="finalPrice" :currency="currencyName" :confirmationTime="content.confirmationTime">
  228. </sidebarSelectOption>
  229. </div>
  230. <sideBarMenu :fixBarList="fixBarList" :currStep="currStep"></sideBarMenu>
  231. </section>
  232. <loading :isLoading="isLoading"></loading>
  233. </div>
  234. </template>
  235. <script>
  236. import Breadcrumbs from "@/components/Breadcrumbs";
  237. import slideshow from "@/components/swiper/serviceContent.vue";
  238. import detailsModal from "@/components/service/contentModal/DetailsModal.vue";
  239. import cancellationPolicyModal from "@/components/service/contentModal/cancellationPolicyModal.vue";
  240. import selectExhibition from "@/components/service/content/selectExhibition.vue";
  241. import selectExhibitionService from "@/components/service/content/selectExhibitionService.vue";
  242. import quantitySelectGroup from "@/components/service/content/quantitySelectGroup.vue";
  243. import pickupInformation from "@/components/service/content/pickupInformation.vue";
  244. import faq from "@/components/service/content/faq.vue";
  245. import sidebarSelectOption from "@/components/service/content/sidebarSelectOption.vue";
  246. import sideBarMenu from "@/components/service/content/sideBarMenu.vue";
  247. import Swiper from "swiper/bundle";
  248. import { scrollama } from "scrollama";
  249. import mobileFixTopBar from "@/components/swiper/mobileFixTopBar.vue";
  250. import like from "@/components/newComponent/like/like.vue";
  251. import { filterData,dateIsInWeekend } from "~/utils/common";
  252. import loading from "@/components/newComponent/loading/loading.vue";
  253. export default {
  254. name: 'ServiceContent',
  255. layout: "login",
  256. auth: false,
  257. components: {
  258. Swiper,
  259. scrollama,
  260. Breadcrumbs,
  261. slideshow,
  262. detailsModal,
  263. cancellationPolicyModal,
  264. selectExhibition,
  265. selectExhibitionService,
  266. quantitySelectGroup,
  267. pickupInformation,
  268. faq,
  269. sidebarSelectOption,
  270. sideBarMenu,
  271. mobileFixTopBar,
  272. like,
  273. loading,
  274. },
  275. data() {
  276. return {
  277. isLoading: false,
  278. showCardItem: false,
  279. pickupServiceShow: false,
  280. apiUrl: process.env.SERVICE_CONSOLE,
  281. btnDisabled: process.env.ENV == 'production',
  282. currStep: null,
  283. stickySwiper: null,
  284. content: {
  285. banners: [],
  286. country: null,
  287. city: null,
  288. name: "",
  289. highlights: '',
  290. details: '',
  291. cancellation_policy: "",
  292. saved: false,
  293. confirmation_time: 24,
  294. supplier: {
  295. logo: require('/assets/img/Footer.png'),
  296. brand: 'ShowEasy'
  297. },
  298. available_sections: null,
  299. timeStatus: 'active',
  300. dateStatus: 'active',
  301. times: [{
  302. start_time: '2023-02-06',
  303. end_time: '2023-03-06',
  304. },{
  305. start_time: '2023-02-06',
  306. end_time: '2023-03-06',
  307. },{
  308. start_time: '2023-02-06',
  309. end_time: '2023-03-06',
  310. }],
  311. start: '2023-02-06',
  312. end: '2023-06-06',
  313. faq: [],
  314. confirmationTime: '',
  315. additionalServices: [
  316. {
  317. name: '司機英文服務'
  318. },{
  319. name: '兒童安全座椅'
  320. },{
  321. name: '增加一個停靠點'
  322. },{
  323. name: '協助飯店入住(每個人,限接機)'
  324. }
  325. ],
  326. },
  327. list: [],
  328. choicesIndex: 0,
  329. countrycode: [],
  330. regionName: [],
  331. elementHeight: {
  332. details: null,
  333. cancellation_policy: null,
  334. faq: null,
  335. },
  336. seeMore: {
  337. details: true,
  338. cancellation_policy: true,
  339. },
  340. button: {
  341. details: true,
  342. cancellation_policy: true,
  343. },
  344. offset: {
  345. packageOptions: 0,
  346. faq: 0,
  347. },
  348. contentId: "",
  349. packageId: "",
  350. packageName: "",
  351. window: {
  352. width: 0,
  353. },
  354. fixBar: false,
  355. fixBarList: [
  356. { id: "packageOptions", title: "Package Options", show: true },
  357. { id: "serviceDetails", title: "Service Details", show: true },
  358. { id: "cancellationPolicy", title: "Cancellation Policy", show: true },
  359. { id: "faq", title: "FAQ", show: true },
  360. { id: "contactUs", title: "Contact Us", show: true },
  361. ],
  362. activePackage: 0,
  363. totalPrice: 0,
  364. additionTotalPrice: [],
  365. customPlanPrice: [],
  366. selectDates: '',
  367. typeGroupList: [],
  368. selectQuantityList: [],
  369. selectYearList: [],
  370. selectMonthList: [],
  371. selectAddressList: [],
  372. selectExhibitionServiceList: [{id: 0,show: true}],
  373. selectPackageList: [],
  374. quantitySelectList: [],
  375. deliveryType: '',
  376. expenseRules: [],
  377. finalPrice: "0",
  378. showServiceItem: 0,
  379. currencyName: '',
  380. };
  381. },
  382. async created() {
  383. this.isLoading = true;
  384. let arr = [];
  385. for(let i=1;i<11;i++){
  386. let target = {
  387. id: i+"",
  388. name: i+"",
  389. };
  390. arr.push(target);
  391. }
  392. let query = this.$route.query;
  393. if(query && query.MinPrice!=null && query.MinPrice!="null"){
  394. this.finalPrice = query.MinPrice+"";
  395. }
  396. if(query && query.CurrencyName){
  397. this.currencyName = decodeURIComponent(query.CurrencyName)+"";
  398. }
  399. this.selectQuantityList = arr;
  400. await this.getBanners();
  401. await this.getServiceData();
  402. await this.getExtensionYear();
  403. await this.getExtensionMonth();
  404. // await this.getExhibitions();
  405. await this.getQuantitySelects();
  406. await this.getServiceItems();
  407. await this.getReceivingCitys();
  408. // await this.getFaq();
  409. await this.getPackages();
  410. await this.getInfoItem();
  411. // await this.addViewCount();
  412. // await this.getYouMightLikeData();
  413. // await this.getRegionName();
  414. // await this.getCountryCode();
  415. if (process.browser) {
  416. window.addEventListener("resize", this.handleResize);
  417. }
  418. this.handleResize();
  419. this.$nextTick(()=>{
  420. this.isLoading = false;
  421. });
  422. },
  423. mounted() {
  424. let vm = this;
  425. vm.contentId = vm.$route.params.id;
  426. vm.offset.packageOptions = vm.$refs.packageOptions.offsetTop;
  427. vm.offset.faq = vm.$refs.faq.offsetTop;
  428. vm.$nextTick(function () {
  429. // instantiate the scrollama
  430. const scrollama = require("scrollama");
  431. const scroller = scrollama();
  432. // setup the instance, pass callback functions
  433. scroller
  434. .setup({
  435. step: ".service-content .step",
  436. offset: 0.6,
  437. })
  438. .onStepEnter((response) => {
  439. // { element, index, direction }
  440. vm.currStep = response.element.id;
  441. let fb_messenger = document.querySelector(".fb_dialog_content");
  442. if (response.index > 3) {
  443. vm.$refs.stickySwiper.slideTo(4);
  444. } else {
  445. vm.$refs.stickySwiper.slideTo(0);
  446. }
  447. if (response.index >= 1 && response.index < 6) {
  448. vm.fixBar = true;
  449. if (fb_messenger) {
  450. fb_messenger.classList.add("hasBar");
  451. }
  452. } else {
  453. vm.fixBar = false;
  454. if (fb_messenger) {
  455. fb_messenger.classList.remove("hasBar");
  456. }
  457. }
  458. })
  459. .onStepExit((response) => {
  460. // { element, index, direction }
  461. vm.currStep = response.element.id;
  462. let fb_messenger = document.querySelector(".fb_dialog_content");
  463. if (response.index >= 1 && response.index < 6) {
  464. vm.fixBar = true;
  465. if (fb_messenger) {
  466. fb_messenger.classList.add("hasBar");
  467. }
  468. } else {
  469. vm.fixBar = false;
  470. if (fb_messenger) {
  471. fb_messenger.classList.remove("hasBar");
  472. }
  473. }
  474. });
  475. })
  476. },
  477. computed: {
  478. currency() {
  479. return this.$store.getters.getCurrency;
  480. },
  481. seeMoreDetailsText() {
  482. if (this.button.details == false) {
  483. return "See less";
  484. } else {
  485. return "See more";
  486. }
  487. },
  488. seeMoreCancellationPolicyText() {
  489. if (this.button.cancellation_policy == false) {
  490. return "See less";
  491. } else {
  492. return "See more";
  493. }
  494. },
  495. // finalPrice() {
  496. // let option = 0;
  497. // let custom = 0;
  498. // let addition = 0;
  499. // if (this.additionTotalPrice) {
  500. // this.additionTotalPrice.forEach((item) => {
  501. // addition += Number(item.total);
  502. // });
  503. // }
  504. // if (this.customPlanPrice) {
  505. // this.customPlanPrice.forEach((item) => {
  506. // custom += Number(item.total);
  507. // });
  508. // }
  509. // if (this.totalPrice) {
  510. // this.totalPrice.forEach((item) => {
  511. // option += Number(item.total);
  512. // });
  513. // }
  514. // if (this.currency == 'USD') {
  515. // return Number(addition + custom + option).toFixed(2).toLocaleString();
  516. // } else {
  517. // return Number(addition + custom + option).toLocaleString();
  518. // }
  519. // },
  520. },
  521. watch: {
  522. currency: {
  523. handler: function () {
  524. this.getServiceData();
  525. // this.getPackages();
  526. },
  527. },
  528. // activePackage: {
  529. // handler: function (newVal, oldVal) {
  530. // if (newVal !== oldVal) {
  531. // this.customPlanPrice = [];
  532. // this.totalPrice = [];
  533. // }
  534. // },
  535. // },
  536. // choicesIndex: {
  537. // handler: function (newVal, oldVal) {
  538. // if (newVal !== oldVal) {
  539. // this.customPlanPrice = [];
  540. // this.totalPrice = [];
  541. // }
  542. // },
  543. // }
  544. },
  545. destroyed() {
  546. if (process.browser) {
  547. window.removeEventListener("resize", this.handleResize);
  548. }
  549. },
  550. methods: {
  551. async getBanners() {
  552. await this.$axios.get(`/trending/api/Onsite/BannerFiles?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  553. .then((response) => {
  554. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  555. let data = response.data.DATA.rel
  556. if(data.length>0){
  557. this.content.banners = data.map((item) => {
  558. return {
  559. banner_id: item.FileID,
  560. image: item.FilePath,
  561. };
  562. });
  563. }
  564. }
  565. })
  566. .catch((error) => console.log(error));
  567. },
  568. async getExtensionYear() {
  569. await this.$axios.get(`/trending/api/Onsite/ExtensionYear?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  570. .then((response) => {
  571. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  572. let data = response.data.DATA.rel
  573. if(data.length>0){
  574. this.selectYearList = data.map((item) => {
  575. return {
  576. id: item.ArgumentID,
  577. name: item.ArgumentValue,
  578. };
  579. });
  580. }
  581. }
  582. })
  583. .catch((error) => console.log(error));
  584. },
  585. async getExtensionMonth() {
  586. await this.$axios.get(`/trending/api/Onsite/ExtensionMonth?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  587. .then((response) => {
  588. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  589. let data = response.data.DATA.rel
  590. if(data.length>0){
  591. this.selectMonthList = data.map((item) => {
  592. return {
  593. id: item.ArgumentID,
  594. name: item.ArgumentValue,
  595. };
  596. });
  597. }
  598. }
  599. })
  600. .catch((error) => console.log(error));
  601. },
  602. async getServiceItems() {
  603. this.showCardItem = false;
  604. await this.$axios
  605. .get(`trending/api/Onsite/ServiceItems?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  606. .then((response) => {
  607. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  608. let data = response.data.DATA.rel
  609. if(data.length>0){
  610. this.typeGroupList = data.map((item) => {
  611. if(item.ItemType=="02"){
  612. this.showCardItem = true;
  613. }
  614. return {
  615. package_id: item.ArgumentID,
  616. name: item.ArgumentValue,
  617. itemType: item.ItemType
  618. };
  619. });
  620. }
  621. }
  622. })
  623. .catch((error) => console.log(error));
  624. },
  625. // async getFaq() {
  626. // await this.$axios
  627. // .get(
  628. // `${this.apiUrl}/user-services/faqs?service_id=${this.$route.params.id}&lang_code=${this.$i18n.localeProperties["langQuery"]}`
  629. // )
  630. // .then((res) => {
  631. // this.content.faq = res.data;
  632. // })
  633. // .catch((error) => console.log(error));
  634. // },
  635. async getPackages() {
  636. await this.$axios
  637. .get(`trending/api/Onsite/PackingTypes?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  638. .then((response) => {
  639. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  640. let data = response.data.DATA.rel
  641. if(data.length>0){
  642. this.selectPackageList = data.map((item) => {
  643. return {
  644. id: item.ArgumentID,
  645. name: item.ArgumentValue,
  646. };
  647. });
  648. }
  649. }
  650. })
  651. .catch((error) => console.log(error));
  652. },
  653. async getQuantitySelects() {
  654. await this.$axios
  655. .get(`trending/api/Onsite/TruckTypes?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  656. .then((response) => {
  657. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  658. let data = response.data.DATA.rel
  659. if(data.length>0){
  660. this.quantitySelectList = data;
  661. }
  662. }
  663. })
  664. .catch((error) => console.log(error));
  665. },
  666. async getReceivingCitys() {
  667. await this.$axios
  668. .get(`trending/api/Onsite/ReceivingCitys?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  669. .then((response) => {
  670. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  671. let data = response.data.DATA.rel
  672. if(data.length>0){
  673. this.selectAddressList = data.map((item) => {
  674. return {
  675. id: item.ArgumentID,
  676. name: item.ArgumentValue,
  677. };
  678. });
  679. }
  680. }
  681. })
  682. .catch((error) => console.log(error));
  683. },
  684. async getServiceData() {
  685. await this.$axios
  686. .get(`/trending/api/Onsite/Info?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  687. .then((response) => {
  688. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  689. let data = response.data.DATA.rel
  690. if(data){
  691. this.content.name = data.ServiceName;
  692. this.content.highlights = data.Features;
  693. this.content.details = data.Details;
  694. this.content.cancellation_policy = data.CancelPolicy;
  695. this.content.faq = data.FQAs;
  696. this.content.confirmationTime = data.ConfirmDays;
  697. }
  698. }
  699. // this.content.country = res.data.country;
  700. // this.content.city = res.data.city;
  701. // this.content.highlights = res.data.highlights;
  702. // this.content.details = res.data.details;
  703. // this.content.cancellation_policy = res.data.cancellation_policy;
  704. // this.content.supplier = res.data.supplier;
  705. // this.content.available_sections = res.data.available_sections;
  706. // this.content.times = res.data.available_sections.times;
  707. // this.content.timeStatus = res.data.available_sections.time_status;
  708. // this.content.dateStatus = res.data.available_sections.date_status;
  709. // this.content.start = res.data.available_sections.start;
  710. // this.content.end = res.data.available_sections.end;
  711. // this.content.payment_currency = res.data.payment_currency;
  712. // this.content.confirmationTime = res.data.confirmation_time.toString();
  713. })
  714. .catch((error) => console.log(error));
  715. },
  716. async getInfoItem() {
  717. await this.$axios
  718. .get(`/trending/api/Onsite/InfoItem?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  719. .then((response) => {
  720. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  721. let data = response.data.DATA.rel
  722. if(data.length>0){
  723. this.expenseRules = data;
  724. }
  725. }
  726. })
  727. .catch((error) => console.log(error));
  728. },
  729. async addViewCount() {
  730. let Obj = {
  731. service_id: `${this.$route.params.id}`,
  732. lang_code: `${this.$i18n.localeProperties["langQuery"]}`,
  733. add_number: 1,
  734. };
  735. await this.$axios
  736. .put(`${this.apiUrl}/user-services/view-counts`, Obj)
  737. .then((res) => { })
  738. .catch((error) => console.log(error));
  739. },
  740. opendetail() {
  741. if (this.window.width >= 1366) {
  742. this.button.details = !this.button.details;
  743. } else {
  744. this.$modal.show("Details");
  745. }
  746. },
  747. openCancellationPolicy() {
  748. if (this.window.width >= 1366) {
  749. this.button.cancellation_policy = !this.button.cancellation_policy;
  750. } else {
  751. this.$modal.show("cancellationPolicy");
  752. }
  753. },
  754. handleResize() {
  755. if (process.browser) {
  756. this.window.width = window.innerWidth;
  757. }
  758. },
  759. bookNow() {
  760. let validators = this.$refs.ref_selectExhibition.validators();
  761. if(validators==false){
  762. return false;
  763. }
  764. if(this.selectExhibitionServiceList.length>0){
  765. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  766. let ref = eval("this.$refs.ref_selectExhibitionitem"+this.selectExhibitionServiceList[i].id)[0];
  767. if(ref !=undefined){
  768. validators = ref.validators();
  769. if(validators==false){
  770. ref.show = true;
  771. return false;
  772. }
  773. }
  774. }
  775. }
  776. let selectExhibitionData = this.$refs.ref_selectExhibition.formData;
  777. let selectExhibitionServiceData = [];
  778. if(this.selectExhibitionServiceList.length>0){
  779. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  780. let ref = eval("this.$refs.ref_selectExhibitionitem"+this.selectExhibitionServiceList[i].id)[0];
  781. if(ref !=undefined){
  782. let target = ref.formData;
  783. selectExhibitionServiceData.push(target);
  784. }
  785. }
  786. }
  787. let quantityData = this.$refs.ref_quantitySelectGroup.formData;
  788. if(quantityData.selectList.length>0){
  789. if(this.showCardItem){
  790. validators = this.$refs.ref_quantitySelectGroup.validators();
  791. if(validators==false){
  792. this.pickupServiceShow = true;
  793. return false;
  794. }
  795. validators = this.$refs.ref_pickupService.validators();
  796. if(validators==false){
  797. this.pickupServiceShow = true;
  798. return false;
  799. }
  800. }
  801. }
  802. // let pickupServiceData = this.$refs.ref_pickupService.formData;
  803. let previewFile = "";
  804. let query = this.$route.query;
  805. if(query && query.PreviewFile){
  806. previewFile = decodeURIComponent(query.PreviewFile);
  807. }
  808. if(query && query.PreviewFile){
  809. previewFile = decodeURIComponent(query.PreviewFile);
  810. }
  811. let title = "";
  812. if(query && query.Title){
  813. title = decodeURIComponent(query.Title);
  814. }
  815. this.$router.push(
  816. {
  817. path: this.localePath("/service/checkout/" + this.$route.params.id),
  818. //携带需要传递的参数
  819. query: {
  820. selectExhibitionData: encodeURIComponent(JSON.stringify(selectExhibitionData)),
  821. selectExhibitionServiceData: encodeURIComponent(JSON.stringify(selectExhibitionServiceData)),
  822. quantityData: encodeURIComponent(JSON.stringify(quantityData)),
  823. // pickupServiceData: encodeURIComponent(JSON.stringify(pickupServiceData)),
  824. totalPrice: this.totalPrice,
  825. currencyName: encodeURIComponent(this.currencyName),
  826. previewFile: encodeURIComponent(previewFile),
  827. title: encodeURIComponent(title)
  828. }
  829. });
  830. },
  831. // choicesIdx(data) {
  832. // let vm = this;
  833. // vm.choicesIndex = data;
  834. // },
  835. addExhibitionService(){
  836. const arr = this.selectExhibitionServiceList.map(({id})=> id);
  837. let max = arr.length>0 ? Math.max.apply(null, arr) : 0;
  838. this.selectExhibitionServiceList.push({id: max+1,show:true});
  839. this.showServiceItem = max+1;
  840. },
  841. delExhibitionService(value){
  842. if(this.selectExhibitionServiceList.length>0){
  843. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  844. if(value == this.selectExhibitionServiceList[i].id){
  845. // let index = this.selectExhibitionServiceList.indexOf(this.selectExhibitionServiceList[i]);
  846. this.selectExhibitionServiceList.splice(i, 1);
  847. break;
  848. }
  849. }
  850. }
  851. this.ChangeCosts(null);
  852. },
  853. deletePickupSerivce(){
  854. this.pickupServiceShow = false;
  855. if(this.$refs.ref_quantitySelectGroup){
  856. this.$refs.ref_quantitySelectGroup.clearAll();
  857. }
  858. },
  859. ChangeCosts(data){
  860. let totalPrice = 0;
  861. this.totalPrice = 0;
  862. // let selectExhibitionData = this.$refs.ref_selectExhibition.formData;
  863. let selectExhibitionServiceData = [];
  864. if(this.selectExhibitionServiceList.length>0){
  865. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  866. let ref = eval("this.$refs.ref_selectExhibitionitem"+this.selectExhibitionServiceList[i].id)[0];
  867. if(ref !=undefined){
  868. let target = ref.formData;
  869. selectExhibitionServiceData.push(target);
  870. }
  871. }
  872. }
  873. if(selectExhibitionServiceData.length>0){
  874. for(let i=0;i<selectExhibitionServiceData.length;i++){
  875. let arr = selectExhibitionServiceData[i].selectServiceItems;
  876. if(arr.length>0){
  877. for(let j=0;j<arr.length;j++){
  878. if(arr[j].itemType == "01"){
  879. totalPrice += this.stackerCostRules(selectExhibitionServiceData[i],arr[j]);
  880. }else if(arr[j].itemType == "02"){
  881. }else if(arr[j].itemType == "03" || arr[j].itemType == "04" || arr[j].itemType == "05" || arr[j].itemType == "06"){
  882. totalPrice += this.OtherCostRules(selectExhibitionServiceData[i],arr[j]);
  883. }
  884. }
  885. }
  886. }
  887. }
  888. let quantityData = this.$refs.ref_quantitySelectGroup.formData;
  889. if(quantityData.selectList.length>0){
  890. totalPrice += this.TruckCostRules();
  891. }
  892. this.totalPrice = totalPrice;
  893. this.finalPrice = Number(totalPrice).toLocaleString();
  894. },
  895. // 堆高機
  896. stackerCostRules(data1,data2){
  897. let price = 0;
  898. let tmpWeight = 0;//Number(data1.weight)/1000;
  899. // 材積重 長x寬x高/6000 得到噸
  900. if((data1.length =="" && data1.width=="" && data1.height=="") && data1.weight!=""){
  901. tmpWeight = Number(data1.weight)/1000;
  902. }else if((data1.length !="" && data1.width!="" && data1.height!="") && data1.weight==""){
  903. tmpWeight = Number(data1.length)*Number(data1.width)*Number(data1.height)/6000/1000;
  904. }else if(data1.length !="" && data1.width!="" && data1.height!="" && data1.weight!=""){
  905. let volumeWeight = Number(data1.length)*Number(data1.width)*Number(data1.height)/6000/1000;
  906. // 比較誰大
  907. if(volumeWeight>Number(data1.weight)/1000){
  908. tmpWeight = volumeWeight;
  909. }else{
  910. tmpWeight = Number(data1.weight)/1000;
  911. }
  912. }
  913. if(tmpWeight==0){
  914. return price;
  915. }
  916. if(this.expenseRules.length>0){
  917. for(let i=0;i<this.expenseRules.length;i++){
  918. let subArr = this.expenseRules[i].StackerCostRules;
  919. if(this.expenseRules[i].Guid == data2.package_id && subArr.length>0){
  920. for(let j=0;j<subArr.length;j++){
  921. // 需要判斷按數量還是重量
  922. if(subArr[j].Weight_Min!="" && subArr[j].Weight_Max!=""){
  923. if(Number(subArr[j].Weight_Min)<=tmpWeight && Number(subArr[j].Weight_Max)>=tmpWeight){
  924. if(subArr[j].PricingMode=="N"){
  925. price = subArr[j].Price;
  926. }else{
  927. price = subArr[j].Price*tmpWeight;
  928. }
  929. break;
  930. }
  931. }
  932. }
  933. break;
  934. }
  935. }
  936. }
  937. let num = (data1.quantity =="" || data1.quantity =="0") ? 0 : Number(data1.quantity);
  938. price = price*num;
  939. return price;
  940. },
  941. TruckCostRules(){
  942. let price = 0;
  943. let quantityData = this.$refs.ref_quantitySelectGroup.formData;
  944. let pickupServiceData = this.$refs.ref_pickupService.formData;
  945. if(this.expenseRules.length>0){
  946. let list = filterData({ItemType: '02'},this.expenseRules);
  947. if(list.length>0){
  948. if(list[0].TruckCostRules.length>0 && quantityData.selectList.length>0 && pickupServiceData.address1!="" && pickupServiceData.address1!="0"){
  949. price += this.updateForData(quantityData.selectList,list[0].TruckCostRules,pickupServiceData.address1);
  950. }
  951. if(list[0].TruckMarkupByModel.length>0 && quantityData.truckList.length>0){
  952. price += this.updateForData(quantityData.truckList,list[0].TruckMarkupByModel,null);
  953. }
  954. // 壓車費
  955. if(list[0].TruckEscortCostRules.length>0 && pickupServiceData.delivery_type=="2" && quantityData.selectList.length>0
  956. && list[0].EscortFreeCityID!="" && pickupServiceData.address1!="0"){
  957. price += this.updateForData(quantityData.selectList,list[0].TruckEscortCostRules,list[0].EscortFreeCityID);
  958. }
  959. if(list[0].TruckHolidayPay.length>0 && pickupServiceData.select_date!=""){
  960. let inWeekend = dateIsInWeekend(pickupServiceData.select_date);
  961. if(inWeekend==5 && pickupServiceData.delivery_type=="2"){
  962. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  963. }else if(inWeekend==6 && pickupServiceData.delivery_type=="2"){
  964. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null)*2;
  965. }else if(inWeekend==0 && pickupServiceData.delivery_type=="2"){
  966. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  967. }else if(inWeekend==6 && pickupServiceData.delivery_type=="1"){
  968. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  969. }else if(inWeekend==0 && pickupServiceData.delivery_type=="1"){
  970. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  971. }
  972. }
  973. }
  974. }
  975. return price;
  976. },
  977. updateForData(data1,data2,address1){
  978. let price = 0;
  979. if(data1.length>0 && data2.length>0){
  980. for(let n=0;n<data1.length;n++){
  981. let truckID = data1[n].id;
  982. let num = data1[n].number;
  983. for(let i=0;i<data2.length;i++){
  984. if(data2[i].CityID!=undefined && data2[i].CityID!="" && data2[i].TruckID!=""){
  985. if(data2[i].CityID==address1 && data2[i].TruckID == truckID){
  986. price += data2[i].Price*num;
  987. break;
  988. }
  989. }else if(data2[i].CityID ==undefined && data2[i].TruckID!=""){
  990. if(data2[i].TruckID == truckID){
  991. price += data2[i].Price*num;
  992. break;
  993. }
  994. }
  995. }
  996. }
  997. }
  998. return price;
  999. },
  1000. OtherCostRules(data1,data2){
  1001. let price = 0;
  1002. let tmpValue = 0;
  1003. if(data1.length =="" && data1.width=="" && data1.height==""){
  1004. return price;
  1005. }else{
  1006. tmpValue = Number(data1.length)*Number(data1.width)*Number(data1.height)/1000000;
  1007. }
  1008. if(this.expenseRules.length>0){
  1009. for(let i=0;i<this.expenseRules.length;i++){
  1010. let subArr = this.expenseRules[i].OtherCostRules;
  1011. if(this.expenseRules[i].Guid == data2.package_id && subArr.length>0){
  1012. for(let j=0;j<subArr.length;j++){
  1013. if(subArr[j].Unit_Min!=""){
  1014. if(Number(subArr[j].Unit_Min)<tmpValue){
  1015. price = subArr[j].Price*tmpValue;
  1016. }else{
  1017. price = subArr[j].Price*subArr[j].Unit_Min;
  1018. }
  1019. break;
  1020. }
  1021. }
  1022. break;
  1023. }
  1024. }
  1025. }
  1026. let num = (data1.quantity =="" || data1.quantity =="0") ? 0 : Number(data1.quantity);
  1027. price = price*num;
  1028. return price;
  1029. }
  1030. },
  1031. };
  1032. </script>
  1033. <style lang="scss" scoped>
  1034. :deep() {
  1035. // .serviceDetails,
  1036. // .cancellationPolicy {
  1037. // p {
  1038. // margin-bottom: 6px;
  1039. // }
  1040. // }
  1041. }
  1042. .service-content {
  1043. .serviceDetails img {
  1044. width: 100%;
  1045. height: auto;
  1046. }
  1047. .fix-right {
  1048. position: fixed;
  1049. top: 120px;
  1050. right: 0 px;
  1051. max-width: 400px;
  1052. height: auto;
  1053. z-index: 100;
  1054. }
  1055. .title-icon-left {
  1056. background-position: left 0px center;
  1057. }
  1058. ul {
  1059. padding-left: 24px;
  1060. }
  1061. img {
  1062. // image-rendering: pixelated;
  1063. }
  1064. }
  1065. .seeMore {
  1066. &-hide {
  1067. position: relative;
  1068. max-height: 295px;
  1069. overflow: hidden;
  1070. &::after {
  1071. content: "";
  1072. display: block;
  1073. position: absolute;
  1074. background: url("~/assets/img/gradient_white.png") repeat-x left bottom;
  1075. width: 100%;
  1076. height: 130px;
  1077. left: 0;
  1078. bottom: 0;
  1079. z-index: 1;
  1080. transition: bottom 0.5s;
  1081. }
  1082. }
  1083. &-show {
  1084. position: relative;
  1085. max-height: 100%;
  1086. overflow: initial;
  1087. &::after {
  1088. display: none;
  1089. }
  1090. }
  1091. @media screen and (min-width: 1366px) {
  1092. position: relative;
  1093. display: flex;
  1094. align-items: center;
  1095. justify-content: center;
  1096. &::after {
  1097. content: "";
  1098. display: inline-block;
  1099. position: relative;
  1100. background-image: url("~/assets/svg/arrow-down-primary.svg");
  1101. background-position: center center;
  1102. background-repeat: no-repeat;
  1103. background-size: 100%;
  1104. width: 9px;
  1105. height: 6px;
  1106. margin-left: 16px;
  1107. }
  1108. &.open {
  1109. &::after {
  1110. transform: rotate(180deg);
  1111. }
  1112. }
  1113. }
  1114. }
  1115. .section-7 {
  1116. >div {
  1117. box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.25), 0px 1px 2px rgba(0, 0, 0, 0.1);
  1118. }
  1119. }
  1120. .tablecss{
  1121. line-height: 36px;
  1122. text-align: center;
  1123. color: #343434;
  1124. // border-radius: 10px;
  1125. }
  1126. table{
  1127. border: 1px solid #cecece;
  1128. border-collapse: separate;
  1129. border-radius: 10px;
  1130. text-align: center;
  1131. border-spacing: 0px;
  1132. // padding: 10px;
  1133. }
  1134. table thead{
  1135. border-radius: 10px;
  1136. }
  1137. th{
  1138. border: 1px solid #343434;
  1139. text-align: center;
  1140. }
  1141. td{
  1142. border-top: 1px solid #cecece;
  1143. text-align: center;
  1144. }
  1145. table thead>tr:first-of-type>th:first-of-type{
  1146. border-top-left-radius: 10px;
  1147. }
  1148. table thead>tr:first-of-type>th:last-of-type{
  1149. border-top-right-radius: 10px;
  1150. }
  1151. table tfoot>tr:last-of-type>td:first-of-type{
  1152. border-bottom-left-radius: 10px;
  1153. }
  1154. table tfoot>tr:last-of-type>td:last-of-type{
  1155. border-bottom-right-radius: 10px;
  1156. }
  1157. table::before{
  1158. border-radius: 10px;
  1159. }
  1160. // table tr:first-child th:first-child {
  1161. // border-top-left-radius: 10px; /* 设置table左下圆角 */
  1162. // }
  1163. // table tr:first-child th:last-child {
  1164. // border-top-right-radius: 10px; /* 设置table右下圆角 */
  1165. // }
  1166. table tr:last-child td:first-child {
  1167. border-bottom-left-radius: 10px; /* 设置table左下圆角 */
  1168. }
  1169. table tr:last-child td:last-child {
  1170. border-bottom-right-radius: 10px; /* 设置table右下圆角 */
  1171. }
  1172. </style>