<template> <div class="pdf-wrap"> <table id="pdfTarget" style=" width: 850px; line-height: 20px; font-size: 12px; font-family: 'Source Han Sans', 'Open Sans', 'WebFont-Open Sans', Arial, sans-serif; " > <tbody> <tr> <td style="vertical-align: bottom"> <img style="position: relative; left: -10pt" src="http://zohocrmapi.promocollection.com.au/static/uploads/logo/pdf_logo.png" height="50px" /> </td> <td style="vertical-align: top; text-align: right"> <h1>Quotation</h1> </td> </tr> <tr> <td style="vertical-align: top"> <template v-if="city2 === 'US'"> <p>Promocollection, LLC</p> <p>1309 COFFEEN AVE STE 1200</p> <p>SHERIDAN</p> <p>WY 82801</p> </template> <template v-else> <p>FAIR OCEAN TRADING AUSTRALIA</p> <p>PTY LTD</p> <p>15/10 Chilvers Road,</p> <p>THORNLEIGH NSW 2120,</p> <p>AUSTRALIA</p> </template> </td> <td style="vertical-align: top; text-align: right"> <table style="width: 250px; float: right"> <colgroup> <col width="100px" /> <col width="150px" /> </colgroup> <tr> <td><strong>Sales Person:</strong></td> <td>{{ computedCreator }}</td> </tr> <tr> <td><strong>Order Date:</strong></td> <td>{{ dayjs().format('DD MMM YYYY') }}</td> </tr> </table> </td> </tr> <tr> <td style="vertical-align: top"> <template v-if="city2 !== 'US'"> <p> Email: accounts@promocollection.com.au </p> <p>Phone Number: 02 9008 1152</p> <p>Fax Number: 02 9008 1157</p> </template> </td> <td rowspan="3" style="vertical-align: top; text-align: right" > <img :src="mainPicture" width="300px" /> </td> </tr> <tr> <td style="vertical-align: top"> <p><strong>Information</strong></p> <p> <strong>{{ productInfo.product_name }}</strong> </p> <p v-if="productInfo.package_size"> <strong>Size:</strong> {{ productInfo.product_size }} </p> <p v-if="productInfo.product_hd"> <strong>Thickness:</strong> {{ productInfo.product_hd }} </p> <p v-if="productInfo.product_capacity"> <strong>Capacity:</strong> {{ productInfo.product_capacity }} </p> <p v-if="productInfo.product_material"> <strong>Material:</strong> {{ productInfo.product_material }} </p> <p v-if="productInfo.product_require_print"> <strong>Print:</strong> {{ productInfo.product_require_print }} </p> <p v-if="productInfo.product_require_color"> <strong>Color requirements:</strong> {{ productInfo.product_require_color }} </p> <p v-if="productInfo.product_color"> <strong>Product Colours Available:</strong> {{ productInfo.product_color }} </p> <p v-if="productInfo.product_battery"> <strong>Whether with battery:</strong> {{ productInfo.product_battery }} </p> <p v-if="productInfo.package_info"> <strong>Packaging:</strong> {{ productInfo.package_info }} </p> <p v-if="productInfo.product_other"> <strong>More Details:</strong> {{ productInfo.product_other }} </p> </td> </tr> <tr style="vertical-align: top"> <td><p></p></td> </tr> <tr style="vertical-align: top"> <td colspan="2"> <table style="width: 800px; border-spacing: 0"> <tbody> <tr style=" background-color: #eee; line-height: 45px; border-top: solid 1px #ccc; font-weight: bold; text-align: center; " > <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; width: 20px; height: 45px; " > # </td> <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; text-align: left; width: 230px; height: 45px; " > Items </td> <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; width: 120px; height: 45px; " > Qty </td> <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; width: 120px; height: 45px; " > Setup cost </td> <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; width: 120px; height: 45px; " > Unit cost </td> <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; width: 120px; height: 45px; " > Local Freight </td> <td style=" border-top: solid 1px #ccc; border-bottom: solid 1px #ccc; width: 120px; height: 45px; " > {{ exportForm.gst_name ? 'Total(ex-GST)($)' : 'Total($)' }} </td> </tr> <tr v-for="(row, index) in step3FormList" :key="index" style="text-align: center; line-height: 45px" > <td style="border-bottom: solid 1px #ccc; height: 45px"> {{ index + 1 }} </td> <td style=" border-bottom: solid 1px #ccc; text-align: left; height: 45px; " > {{ productInfo.product_name }} <br /> By {{ getFreightType(row) }} - {{ exportForm[`zdy_date_${row.typeNumber}_${row.number}`] }}{{ exportForm[`cycle_name_${row.typeNumber}_${row.number}`] }} </td> <td style="border-bottom: solid 1px #ccc; height: 45px"> {{ row.number }} units </td> <td style="border-bottom: solid 1px #ccc; height: 45px"> ${{ row.setup_cost }} {{ exportForm.gst_name ? '+GST' : '' }} </td> <td style="border-bottom: solid 1px #ccc; height: 45px"> ${{ row.sold_unit }} {{ exportForm.gst_name ? '+GST' : '' }} </td> <td style="border-bottom: solid 1px #ccc; height: 45px"> ${{ row.add_freight_cost }} {{ exportForm.gst_name ? '+GST' : '' }} </td> <td style="border-bottom: solid 1px #ccc; height: 45px"> ${{ row.sold_price }} {{ exportForm.gst_name ? '+GST' : '' }} </td> </tr> <tr> <td colspan="7" style="text-align: left; line-height: 45px" > Freight to {{ city_short[city] || city }} is included.Price based on exchange rate of {{ exportForm.exchange }}.Price is only valid for {{ exportForm.days }} days. </td> </tr> </tbody> </table> </td> </tr> <!-- <tr> <td colspan="2"> <p style="line-height: 45px"> <strong style="border-bottom: dashed 2px #000; padding: 10px"> Notes </strong> </p> </td> </tr> <tr> <td colspan="2"> <p style="padding-top: 20px">{php}echo $notes;{/php}</p> </td> </tr> --> <tr> <td colspan="2"> <p style="padding-top: 20px"> <img v-for="(item, index) in otherPicture" :key="index" :src="item" width="250px" style="padding-right: 10px" /> </p> </td> </tr> <tr> <td colspan="2"> <p> <a :href="mainPicture">{{ mainPicture }}</a> </p> </td> </tr> <tr> <td colspan="2"> <p v-for="p in otherPicture" :key="p" > <a :href="p" target="_blank" > {{ p }} </a> </p> </td> </tr> <tr> <td colspan="2" style="text-align: center" > <img style="margin-top: 10px" src="http://zohocrmapi.promocollection.com.au/static/uploads/logo/pdf_end.png" /> </td> </tr> </tbody> </table> </div> </template> <script lang="ts" setup> import { defineComponent, computed } from 'vue' import jspdf from 'jspdf' import html2canvas from 'html2canvas' import dayjs from 'dayjs' import { downloadPDF } from '@/api/indent' defineComponent({ name: 'ComponentExportQuota2', }) const { city = '', city2 = '', productInfo = {} as any, exportForm = {} as any, step2FormList = [], step3FormList = [], creatorOptions = [], } = defineProps<{ city: string city2: string productInfo: object exportForm: object step2FormList: any[] step3FormList: any[] creatorOptions: any[] }>() const city_short = { SYD: 'Sydney', Melb: 'Melbourne', Brisbane: 'Brisbane', SA: 'Adelaide', WA: 'Perth', US: 'US', '': '', } as any const getLogoPath = () => { return new URL('/assets/logo.png', import.meta.url).href } const getFreightType = (row: any) => { let result = 'Sea' if (row.typeNumber < 2) { result = 'Air' } if (row.typeNumber === 3) { const temp: any[] = step2FormList.filter( (i: any) => i.number === row.number, ) if ( temp.length && temp[0].fclData?.method_fcl && ['快递', '空运'].includes(temp[0].fclData.method_fcl) ) { result = 'Air' } } return result } const generatePDF = () => { downloadPDF({ content: document.getElementById('pdfTarget')?.outerHTML, title: 'test_pdf', create_time: '', }).then((res: any) => { console.log(res, 'res pdf') if (res.result?.length) { window.open(import.meta.env.VITE_API_PREFIX + '/' + res.result) } }) } // 把这个方法暴露给父组件, 否则无法在父组件被调用 defineExpose({ generatePDF }) const shouldSplit = ( nodes: HTMLElement[], index: number, pageHeight: number, ) => { // 计算当前这块dom是否跨越了a4大小,以此分割 // console.log(index, 'index start') if ( nodes[index].offsetTop + nodes[index].clientHeight < pageHeight && nodes[index + 1] && nodes[index + 1].offsetTop + nodes[index + 1].clientHeight > pageHeight ) { return true } return false } const mainPicture = computed(() => { if ( Array.isArray(productInfo.product_image) && productInfo.product_image.length ) { return productInfo.product_image[0] } return '' }) const otherPicture = computed(() => { if ( Array.isArray(productInfo.product_image) && productInfo.product_image.length > 1 ) { return productInfo.product_image.slice(1) } return [] }) const computedCreator = computed(() => { let result = '' if (creatorOptions.length) { const a: any[] = creatorOptions.filter( (i: any) => i.value === exportForm.saleperson, ) if (a.length) result = a[0].label } return result }) </script> <style lang="scss" scoped> $subColor: #777; .pdf-wrap { position: fixed; // top: 0; // left: 0; // z-index: 9999; top: -9999px; right: -9999px; box-sizing: border-box; width: 21cm; margin: 0 auto 12px; box-shadow: 1px 1px 2pt 0px $subColor; } </style>