|
@@ -1,24 +1,37 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <div id="pdfDom" ref="pdfDom">
|
|
|
+ <div id="pdfDom" ref="pdfDom" style="padding: 30px 60px">
|
|
|
<table border="1" style="width: 100%" class="table">
|
|
|
<tr>
|
|
|
- <td style="width: 150px">图片</td>
|
|
|
- <td>
|
|
|
+ <td style="width: 120px">
|
|
|
+ <img
|
|
|
+ :src="pdfData.companyPic"
|
|
|
+ alt=""
|
|
|
+ fit="scale-down"
|
|
|
+ style="height: 60px; width: 60px"
|
|
|
+ />
|
|
|
+ </td>
|
|
|
+ <td style="padding: 10px">
|
|
|
+ <div style="font-size: 18px" class="color-class">
|
|
|
+ {{ pdfData.sellCorporationNameEn }}
|
|
|
+ </div>
|
|
|
<div style="font-size: 18px" class="color-class">
|
|
|
- {{ printDetails.sellCorporationNameEn }}
|
|
|
+ {{ pdfData.sellCorporationName }}
|
|
|
</div>
|
|
|
+
|
|
|
<div style="font-size: 14px; color: #000">
|
|
|
- Address: {{ printDetails.sellDetailedAddress }}
|
|
|
+ Address: {{ pdfData.sellDetailedAddress }}
|
|
|
</div>
|
|
|
<div style="font-size: 14px; color: #000; margin-top: 5px">
|
|
|
- {{ printDetails.sellCityName }},{{
|
|
|
- printDetails.sellProvinceName
|
|
|
- }},{{ printDetails.sellCountryName }}
|
|
|
+ {{ pdfData.sellCityName }} , {{ pdfData.sellProvinceName }} ,
|
|
|
+ {{ pdfData.sellCountryName }}
|
|
|
</div>
|
|
|
<div style="margin: 8px 0; color: black">
|
|
|
- Tel: <span>{{ printDetails.sellContactNumber }}</span> Fax:
|
|
|
- <span></span> Website: <span></span>
|
|
|
+ Tel: <span>{{ pdfData.sellContactNumber }}</span>
|
|
|
+ <!-- Fax:
|
|
|
+ <span>{{ pdfData.fax }}</span>
|
|
|
+ Website:
|
|
|
+ <span>{{ pdfData.Website }}</span> -->
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
@@ -37,33 +50,37 @@
|
|
|
<table border="1" style="width: 100%" class="table">
|
|
|
<tr>
|
|
|
<td style="width: 50%; text-align: left">
|
|
|
- Buyer: {{ printDetails.buyCorporationName }}
|
|
|
+ Buyer: {{ pdfData.buyCorporationName }}
|
|
|
</td>
|
|
|
<td style="width: 50%; text-align: left">
|
|
|
- Seller: {{ printDetails.sellCorporationNameEn }}
|
|
|
+ Seller: {{ pdfData.sellCorporationNameEn }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
<table border="1" style="width: 100%; border-top: none" class="table">
|
|
|
<tr>
|
|
|
<td style="width: 15%">PI No.</td>
|
|
|
- <td style="width: 35%">{{ printDetails.contractCode }}</td>
|
|
|
+ <td style="width: 35%">{{ pdfData.contractCode }}</td>
|
|
|
<td style="width: 15%">Date:</td>
|
|
|
- <td style="width: 35%">{{ printDetails.createTimeEn }}</td>
|
|
|
+ <td style="width: 35%">{{ pdfData.createTimeEn }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
+ <!-- 客户PO -->
|
|
|
<td style="width: 15%">PO No.</td>
|
|
|
- <td style="width: 35%">客户PO</td>
|
|
|
+ <td style="width: 35%"></td>
|
|
|
+ <!-- 贸易方式 -->
|
|
|
<td style="width: 15%">Price Term:</td>
|
|
|
- <td style="width: 35%" rowspan="2">
|
|
|
- {{ dictValueLabel(printDetails.transportMethod, shippingMethod) }}
|
|
|
+ <td style="width: 35%">
|
|
|
+ {{ dictValueLabel(pdfData.tradeMethods, tradeMethods) }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
+ <!-- 最终目的地 -->
|
|
|
<td style="width: 15%">Final Destination:</td>
|
|
|
- <td style="width: 35%"></td>
|
|
|
+ <td style="width: 35%">{{ pdfData.buyCityName }}</td>
|
|
|
+ <!-- 装货港 -->
|
|
|
<td style="width: 15%">Loading Port:</td>
|
|
|
- <!-- <td style="width: 35%">{{ printDetails.createTimeEn }}</td> -->
|
|
|
+ <td style="width: 35%"></td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
<div style="height: 15px; background: #7f197f"></div>
|
|
@@ -72,54 +89,64 @@
|
|
|
<td style="width: 15%">Image</td>
|
|
|
<td style="width: 20%">Description</td>
|
|
|
<td style="width: 15%">Size</td>
|
|
|
- <td style="width: 10%">Packaging</td>
|
|
|
- <td style="width: 10%">
|
|
|
+ <td style="width: 12%">Packaging</td>
|
|
|
+ <td style="width: 12%">
|
|
|
Order <br />
|
|
|
Quantity
|
|
|
</td>
|
|
|
- <td style="width: 10%">Carton <br />Quantity</td>
|
|
|
- <td style="width: 10%">Unit <br />Price</td>
|
|
|
- <td style="width: 10%">Total <br />Amount</td>
|
|
|
+
|
|
|
+ <td style="width: 13%">Unit <br />Price</td>
|
|
|
+ <td style="width: 13%">Total <br />Amount</td>
|
|
|
</tr>
|
|
|
|
|
|
<tr
|
|
|
- v-if="
|
|
|
- printDetails.productInfoList &&
|
|
|
- printDetails.productInfoList.length > 0
|
|
|
- "
|
|
|
- v-for="(item, index) in printDetails.productInfoList"
|
|
|
+ v-if="pdfData.productInfoList && pdfData.productInfoList.length > 0"
|
|
|
+ v-for="(item, index) in pdfData.productInfoList"
|
|
|
:key="item.productId"
|
|
|
>
|
|
|
- <td style="width: 15%">图片</td>
|
|
|
- <td style="width: 20%">{{ item.productName }}</td>
|
|
|
- <td style="width: 15%">{{ item.spec }}</td>
|
|
|
- <td style="width: 10%">包装方式</td>
|
|
|
- <td style="width: 10%">
|
|
|
+ <td style="width: 15%">
|
|
|
+ <img
|
|
|
+ :src="item.fileList[0].fileUrl"
|
|
|
+ alt=""
|
|
|
+ fit="scale-down"
|
|
|
+ style="height: 60px; width: 60px"
|
|
|
+ v-if="item.fileList && item.fileList.length > 0"
|
|
|
+ />
|
|
|
+ </td>
|
|
|
+ <td style="width: 20%">{{ item.productRemark }}</td>
|
|
|
+ <td style="width: 15%">{{ item.productSpec }}</td>
|
|
|
+ <td style="width: 12%">{{ item.packMethod }}</td>
|
|
|
+ <td style="width: 12%">
|
|
|
{{ item.productQuantity }}
|
|
|
</td>
|
|
|
- <td style="width: 10%">总箱数</td>
|
|
|
- <td style="width: 10%">
|
|
|
- {{ printDetails.currency }} {{ moneyFormat(item.productPrice, 2) }}
|
|
|
+ <td style="width: 13%">
|
|
|
+ {{ pdfData.currency }} {{ moneyFormat(item.productPrice, 2) }}
|
|
|
</td>
|
|
|
- <td style="width: 10%">
|
|
|
- {{ printDetails.currency }} {{ moneyFormat(item.amount, 2) }}
|
|
|
+ <td style="width: 13%">
|
|
|
+ {{ pdfData.currency }} {{ moneyFormat(item.amount, 2) }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
- <td colspan="7" style="text-align: right">Total Amount:</td>
|
|
|
+ <td colspan="6" style="text-align: right">Total Amount:</td>
|
|
|
<td style="width: 10%">
|
|
|
- {{ printDetails.currency }}
|
|
|
- {{ moneyFormat(printDetails.totalAmount, 2) }}
|
|
|
+ {{ pdfData.currency }}
|
|
|
+ {{ moneyFormat(pdfData.totalAmount, 2) }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
- <td colspan="7" style="text-align: right">Deposit(30.00%):</td>
|
|
|
- <td style="width: 10%">{{ printDetails.advanceRatio }}%</td>
|
|
|
+ <td colspan="6" style="text-align: right">
|
|
|
+ Deposit( {{ pdfData.advanceRatio }} %):
|
|
|
+ </td>
|
|
|
+ <td style="width: 10%">
|
|
|
+ {{ pdfData.currency }} {{ getBalance(pdfData.advanceRatio) }}
|
|
|
+ </td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
- <td colspan="7" style="text-align: right">Balance(70.00%):</td>
|
|
|
+ <td colspan="6" style="text-align: right">
|
|
|
+ Balance( {{ pdfData.advanceRatioOne }} %):
|
|
|
+ </td>
|
|
|
<td style="width: 10%">
|
|
|
- 剩余比例:剩余比例 = 最终价格 * (100% - 预付比例)
|
|
|
+ {{ pdfData.currency }} {{ getBalance(pdfData.advanceRatioOne) }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
</table>
|
|
@@ -127,16 +154,18 @@
|
|
|
<table border="1" style="width: 100%" class="table">
|
|
|
<tr>
|
|
|
<td class="width-one" style="text-align: left">1.Lead Time:</td>
|
|
|
- <td style="text-align: left">{{ printDetails.deliveryTime }} Days</td>
|
|
|
+ <td style="text-align: left">{{ pdfData.deliveryTime }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td class="width-one" style="text-align: left">2.Payment Term:</td>
|
|
|
- <td style="text-align: left">{{ printDetails.remark }}</td>
|
|
|
+ <td style="text-align: left">
|
|
|
+ <div v-html="pdfData.remark"></div>
|
|
|
+ </td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td class="width-one" style="text-align: left">3.Shipping Mode</td>
|
|
|
<td style="text-align: left">
|
|
|
- {{ dictValueLabel(printDetails.transportMethod, shippingMethod) }}
|
|
|
+ {{ dictValueLabel(pdfData.transportMethod, shippingMethod) }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
@@ -147,20 +176,18 @@
|
|
|
<tr>
|
|
|
<td class="width-one" style="text-align: left">5.Banking Info</td>
|
|
|
<td style="text-align: left">
|
|
|
- <div>Beneficiary Name: {{ printDetails.beneficiaryName }}</div>
|
|
|
- <div>Beneficiary Bank: {{ printDetails.beneficiaryBank }}</div>
|
|
|
+ <div>Beneficiary Name: {{ pdfData.beneficiaryName }}</div>
|
|
|
+ <div>Beneficiary Bank: {{ pdfData.beneficiaryBank }}</div>
|
|
|
<div>
|
|
|
Beneficiary Bank Address:
|
|
|
- {{ printDetails.beneficiaryBankAddress }}
|
|
|
+ {{ pdfData.beneficiaryBankAddress }}
|
|
|
</div>
|
|
|
<div>
|
|
|
Beneficiary Account Number:
|
|
|
- {{ printDetails.beneficiaryAccountNumber }}
|
|
|
- </div>
|
|
|
- <div>Swift Code: {{ printDetails.swiftCode }}</div>
|
|
|
- <div>
|
|
|
- Beneficiary Address: {{ printDetails.beneficiaryAddress }}
|
|
|
+ {{ pdfData.beneficiaryAccountNumber }}
|
|
|
</div>
|
|
|
+ <div>Swift Code: {{ pdfData.swiftCode }}</div>
|
|
|
+ <div>Beneficiary Address: {{ pdfData.beneficiaryAddress }}</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
@@ -200,8 +227,22 @@
|
|
|
</table>
|
|
|
<table border="1" style="width: 100%; border-top: none" class="table">
|
|
|
<tr>
|
|
|
- <td style="width: 50%; text-align: left">The Buyer's Signature</td>
|
|
|
- <td style="width: 50%; text-align: left">The Seller's Signature</td>
|
|
|
+ <td style="width: 50%; text-align: left">
|
|
|
+ The Buyer's Signature
|
|
|
+ <div style="width: 200px; height: 200px"></div>
|
|
|
+ </td>
|
|
|
+ <td style="width: 50%; text-align: left">
|
|
|
+ The Seller's Signature
|
|
|
+ <div style="width: 200px; height: 200px">
|
|
|
+ <img
|
|
|
+ v-if="pdfData.companySeal"
|
|
|
+ :src="pdfData.companySeal"
|
|
|
+ alt=""
|
|
|
+ fit="scale-down"
|
|
|
+ style="height: 200px; width: 200px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
@@ -212,43 +253,65 @@
|
|
|
import { NumberToChinese } from "@/utils/util.js";
|
|
|
import { watch } from "vue";
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
-const printDetails = ref({});
|
|
|
+const pdfData = ref({});
|
|
|
const props = defineProps({
|
|
|
rowData: Object,
|
|
|
});
|
|
|
const getPdfData = (query) => {
|
|
|
proxy.post("/contract/getContractPdfInfo", query).then((res) => {
|
|
|
- printDetails.value = res;
|
|
|
+ pdfData.value = res;
|
|
|
+ if (pdfData.value.advanceRatio) {
|
|
|
+ pdfData.value.advanceRatio = parseFloat(
|
|
|
+ pdfData.value.advanceRatio
|
|
|
+ ).toFixed(2);
|
|
|
+ pdfData.value.advanceRatioOne = (
|
|
|
+ 100 - Number(pdfData.value.advanceRatio)
|
|
|
+ ).toFixed(2);
|
|
|
+ }
|
|
|
+ if (pdfData.value.sellCorporationId) {
|
|
|
+ proxy
|
|
|
+ .post("/fileInfo/getList", {
|
|
|
+ businessIdList: [pdfData.value.sellCorporationId],
|
|
|
+ fileType: 1,
|
|
|
+ })
|
|
|
+ .then((fileObj) => {
|
|
|
+ pdfData.value.companyPic =
|
|
|
+ fileObj[pdfData.value.sellCorporationId][0].fileUrl;
|
|
|
+ });
|
|
|
+ proxy
|
|
|
+ .post("/fileInfo/getList", {
|
|
|
+ businessIdList: [pdfData.value.sellCorporationId],
|
|
|
+ fileType: 4,
|
|
|
+ })
|
|
|
+ .then((fileObj) => {
|
|
|
+ pdfData.value.companySeal =
|
|
|
+ fileObj[pdfData.value.sellCorporationId][0].fileUrl;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 拿取产品图
|
|
|
+ if (
|
|
|
+ pdfData.value.productInfoList &&
|
|
|
+ pdfData.value.productInfoList.length > 0
|
|
|
+ ) {
|
|
|
+ let arr = pdfData.value.productInfoList.map((x) => x.productId);
|
|
|
+ proxy
|
|
|
+ .post("/fileInfo/getList", {
|
|
|
+ businessIdList: arr,
|
|
|
+ })
|
|
|
+ .then((fileObj) => {
|
|
|
+ for (let i = 0; i < pdfData.value.productInfoList.length; i++) {
|
|
|
+ const e = pdfData.value.productInfoList[i];
|
|
|
+ for (const key in fileObj) {
|
|
|
+ if (e.productId === key) {
|
|
|
+ e.fileList = fileObj[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
});
|
|
|
};
|
|
|
-const statistics = (label, index) => {
|
|
|
- let num = 0;
|
|
|
- if (
|
|
|
- printDetails.value.productInfoList &&
|
|
|
- printDetails.value.productInfoList.length > 0
|
|
|
- ) {
|
|
|
- printDetails.value.productInfoList.map((item) => {
|
|
|
- if (item[label]) {
|
|
|
- num = parseFloat(Number(num) + Number(item[label])).toFixed(index);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- return num;
|
|
|
-};
|
|
|
-const statisticsTwo = (label, index) => {
|
|
|
- let num = 0;
|
|
|
- if (
|
|
|
- printDetails.value.contractProjectList &&
|
|
|
- printDetails.value.contractProjectList.length > 0
|
|
|
- ) {
|
|
|
- printDetails.value.contractProjectList.map((item) => {
|
|
|
- if (item[label]) {
|
|
|
- num = parseFloat(Number(num) + Number(item[label])).toFixed(index);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- return num;
|
|
|
-};
|
|
|
+
|
|
|
const productUnit = ref([]);
|
|
|
const tradeMethods = ref([]);
|
|
|
const shippingMethod = ref([]);
|
|
@@ -269,6 +332,11 @@ const getDict = () => {
|
|
|
});
|
|
|
};
|
|
|
getDict();
|
|
|
+const getBalance = (val) => {
|
|
|
+ if (val) {
|
|
|
+ return parseFloat(pdfData.value.totalAmount * (val / 100)).toFixed(2);
|
|
|
+ }
|
|
|
+};
|
|
|
watch(
|
|
|
props.rowData,
|
|
|
() => {
|