|
|
<template>
|
|
|
<div class="main">
|
|
|
<!-- Breadcrumb: Start -->
|
|
|
<div class="breadcrumb-section">
|
|
|
<div>
|
|
|
<el-breadcrumb separator="/">
|
|
|
<el-breadcrumb-item :to="{ path: '/' }">電商管理中心</el-breadcrumb-item>
|
|
|
<el-breadcrumb-item><a href="/">訂單信息</a></el-breadcrumb-item>
|
|
|
</el-breadcrumb>
|
|
|
</div>
|
|
|
<div>
|
|
|
<el-button type="danger" size="small" @click="$router.push('/list')">訂單列表</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- Breadcrumb: End -->
|
|
|
<hr />
|
|
|
<el-card class="top-action">
|
|
|
<el-button type="primary" class="default-button-style" @click="handleGetOrder(orderInfo.prev)"
|
|
|
:disabled="!orderInfo.prev">前一個訂單</el-button>
|
|
|
<el-button type="primary" class="default-button-style" @click="handleGetOrder(orderInfo.next)"
|
|
|
:disabled="!orderInfo.next">後一個訂單</el-button>
|
|
|
<el-button type="primary" class="default-button-style" @click="handlePrint">打印訂單</el-button>
|
|
|
</el-card>
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>商品信息</span>
|
|
|
<!-- <el-button class="button" text>編輯</el-button> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<el-table :data="orderInfo.goods_item" :summary-method="getSummaries" show-summary style="width: 100%">
|
|
|
<el-table-column prop="goods_name" label="商品名稱" />
|
|
|
<el-table-column prop="goods_sn" label="商品編號" />
|
|
|
<el-table-column prop="product_sn" label="貨品號" />
|
|
|
<el-table-column prop="goods_price" label="商品價格" />
|
|
|
<el-table-column prop="goods_number" label="購買數量" />
|
|
|
<el-table-column prop="goods_attr" label="屬性" />
|
|
|
<el-table-column prop="storage" label="庫存" />
|
|
|
<el-table-column prop="subtotal" label="小計" />
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>基本信息</span>
|
|
|
<!-- <el-button class="button" text>編輯</el-button> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<table>
|
|
|
<tr>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>訂單號:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.order_sn }}</td>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>訂單狀態:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">
|
|
|
{{ orderInfo.order_status_name }},{{
|
|
|
orderInfo.pay_status_name
|
|
|
}},{{ orderInfo.shipping_status_name }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>購貨人:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{ orderInfo.consignee }}
|
|
|
<!-- [
|
|
|
<a href="" onclick="staticbar();return false;">顯示購貨人信息</a>
|
|
|
] -->
|
|
|
</td>
|
|
|
<td>
|
|
|
<div align="right"><strong>下單時間:</strong></div>
|
|
|
</td>
|
|
|
<td>{{ orderInfo.add_time }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>支付方式:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{ orderInfo.pay_name }}
|
|
|
<!-- <a
|
|
|
href="order.php?act=edit&order_id=645&step=payment"
|
|
|
class="special"
|
|
|
>編輯</a
|
|
|
>
|
|
|
(備註:
|
|
|
<span onclick="listTable.edit(this, 'edit_pay_note', 645)"
|
|
|
>N/A</span
|
|
|
>) -->
|
|
|
</td>
|
|
|
<td>
|
|
|
<div align="right"><strong>付款時間:</strong></div>
|
|
|
</td>
|
|
|
<td>{{ orderInfo.pay_time }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>配送方式:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{ orderInfo.shipping_name }}
|
|
|
</td>
|
|
|
<td>
|
|
|
<div align="right"><strong>發貨時間:</strong></div>
|
|
|
</td>
|
|
|
<td>{{ orderInfo.shipping_time }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>發貨單號:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
<!-- <td>
|
|
|
<div align="right"><strong>訂單來源:</strong></div>
|
|
|
</td>
|
|
|
<td></td> -->
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>收貨人信息</span>
|
|
|
<!-- <el-button class="button" text>編輯</el-button> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<template v-if="orderInfo.shipping_id === 2">
|
|
|
<table>
|
|
|
<tr>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>超商類型:</strong></div>
|
|
|
</td>
|
|
|
<td colspan="3">{{ logisticType[orderInfo.address.type] }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>超商名稱:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.address.store_name }}</td>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>超商代碼:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.address.store_id }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>超商電話:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.address.store_tel }}</td>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>超商地址:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.address.store_address }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>收貨人姓名:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{ orderInfo.consignee }}
|
|
|
</td>
|
|
|
<td>
|
|
|
<div align="right"><strong>手機:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{ orderInfo.mobile }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
<table>
|
|
|
<tr>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>收貨人:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.consignee }}</td>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>電子郵件:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%">{{ orderInfo.email }}</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>地址:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{
|
|
|
orderInfo.address.city +
|
|
|
orderInfo.address.district +
|
|
|
orderInfo.address.address
|
|
|
}}
|
|
|
</td>
|
|
|
<td>
|
|
|
<div align="right"><strong>電話:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
{{ orderInfo.address.tel }}
|
|
|
</td>
|
|
|
</tr>
|
|
|
<!-- <tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>標誌性建築:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
<td>
|
|
|
<div align="right"><strong>最佳送貨時間:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
</tr> -->
|
|
|
</table>
|
|
|
</template>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>其他信息</span>
|
|
|
<!-- <el-button class="button" text>編輯</el-button> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<table>
|
|
|
<!-- <tr>
|
|
|
<td width="15%">
|
|
|
<div align="right"><strong>發票類型:</strong></div>
|
|
|
</td>
|
|
|
<td width="35%"></td>
|
|
|
<td width="15%"> </td>
|
|
|
<td width="35%"> </td>
|
|
|
</tr> -->
|
|
|
|
|
|
<!-- <tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>發票抬頭:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
<td>
|
|
|
<div align="right"><strong>發票內容:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
</tr> -->
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div><strong>客戶給商家的留言:</strong></div>
|
|
|
</td>
|
|
|
<td> </td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div><strong>缺貨處理:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div><strong>商家給客戶的留言:</strong></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>費用信息</span>
|
|
|
<!-- <el-button class="button" text>編輯</el-button> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<table>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right">
|
|
|
<strong>
|
|
|
商品總金額:NT${{ orderInfo.goods_amount }} - 折扣:NT${{
|
|
|
orderInfo.discount
|
|
|
}}
|
|
|
+ 配送費用:NT${{ orderInfo.shipping_fee }} + 支付費用:NT${{
|
|
|
orderInfo.pay_fee
|
|
|
}}
|
|
|
</strong>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right">
|
|
|
<strong>
|
|
|
= 訂單總金額:NT${{
|
|
|
parseInt(orderInfo.goods_amount) -
|
|
|
parseInt(orderInfo.discount) +
|
|
|
parseInt(orderInfo.shipping_fee) +
|
|
|
parseInt(orderInfo.pay_fee)
|
|
|
}}
|
|
|
</strong>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right">
|
|
|
<strong>
|
|
|
- 已付款金額:NT$0 - 使用餘額: NT$0 - 使用積分: NT$0 -
|
|
|
使用紅包: NT$0
|
|
|
</strong>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right">
|
|
|
<strong>
|
|
|
= 應付款金額:NT${{
|
|
|
parseInt(orderInfo.goods_amount) -
|
|
|
parseInt(orderInfo.discount) +
|
|
|
parseInt(orderInfo.shipping_fee) +
|
|
|
parseInt(orderInfo.pay_fee)
|
|
|
}}
|
|
|
</strong>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>訂單操作</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<table>
|
|
|
<tr>
|
|
|
<td width="25%">
|
|
|
<div align="right"><strong>操作備註:</strong></div>
|
|
|
</td>
|
|
|
<td width="75%">
|
|
|
<el-input v-model="orderInfo.action_note" :rows="2" type="textarea" />
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
<td>
|
|
|
<div align="right"><strong>當前可執行操作:</strong></div>
|
|
|
</td>
|
|
|
<td>
|
|
|
<el-button type="danger" v-for="(v, i) in orderInfo.op_list" :key="i" @click="handleOp(v)">{{ opName[v]
|
|
|
}}</el-button>
|
|
|
</td>
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
|
|
|
<el-card class="box-card">
|
|
|
<template #header>
|
|
|
<div class="card-header">
|
|
|
<span>操作紀錄</span>
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="card-body">
|
|
|
<el-table :data="orderAction" style="width: 100%">
|
|
|
<el-table-column prop="action_user" label="操作者" />
|
|
|
<el-table-column prop="log_time" label="操作時間" />
|
|
|
<el-table-column prop="order_status" label="訂單狀態" />
|
|
|
<el-table-column prop="pay_status" label="付款狀態" />
|
|
|
<el-table-column prop="shipping_status" label="發貨狀態" />
|
|
|
<el-table-column prop="action_note" label="備註" />
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
</div>
|
|
|
<el-dialog v-model="dialogPrintCardVisible" @open="handleOpenPrintCard" title="配貨">
|
|
|
<div class="dialog-message">
|
|
|
{{ dialogMessage }}
|
|
|
</div>
|
|
|
<div>
|
|
|
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
|
|
|
<el-tab-pane label="正面" name="front" />
|
|
|
<el-tab-pane label="反面" name="back" />
|
|
|
</el-tabs>
|
|
|
<div id="printMe">
|
|
|
<div class="card-preview" v-show="showCardType === 0">
|
|
|
<img src="@/pages/order/images/front.png" />
|
|
|
<div class="front">
|
|
|
<!-- <img class="front-bg" src="@/assets/images/card/front.png"> -->
|
|
|
<div class="front-cname">{{ cardInfo.cname }}</div>
|
|
|
<div class="front-ename">{{ cardInfo.ename }}</div>
|
|
|
<img class="front-logo" :src="cardInfo.image || cardImg" />
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="card-preview" v-show="showCardType === 1">
|
|
|
<img src="@/pages/order/images/back.png" />
|
|
|
<div class="back">
|
|
|
<div class="nfcimg">
|
|
|
<qrcode-vue :value="cardInfo.nfcurl" :size="size" level="L" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="action">
|
|
|
<el-button type="primary" v-print="printObj">列印卡片</el-button>
|
|
|
<el-button type="primary" @click="printLabel">列印標籤</el-button>
|
|
|
<el-button type="primary" @click="handleNfcCard">複製Nfc網址</el-button>
|
|
|
<el-button type="primary" @click="makeNfcCard">製卡</el-button>
|
|
|
<el-button type="success" @click="handleFinish">完成</el-button>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
<el-dialog v-model="dialogPrintVisible" @close="handleClosePrint" title="列印超商標籤">
|
|
|
<iframe id="printIframe" ref="printIframe" :src="printUrl" style="width: 340px; height: 520px" scrolling="no">
|
|
|
</iframe>
|
|
|
<el-button type="primary" v-print="'#printIframe'">列印</el-button>
|
|
|
</el-dialog>
|
|
|
<el-dialog v-model="dialogPrintAddrVisible" @close="handleClosePrintAddr" title="列印住址標籤">
|
|
|
<div id="printAddr">
|
|
|
<div class="addr">
|
|
|
<div class="address">
|
|
|
{{
|
|
|
orderInfo.address.city +
|
|
|
orderInfo.address.district +
|
|
|
orderInfo.address.address
|
|
|
}}
|
|
|
</div>
|
|
|
<div class="name">{{ orderInfo.address.consignee }}</div>
|
|
|
<div class="sender">匯康科技</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<el-button type="primary" v-print="'#printAddr'">列印</el-button>
|
|
|
</el-dialog>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
import useClipboard from "vue-clipboard3";
|
|
|
import QrcodeVue from "qrcode.vue";
|
|
|
|
|
|
import { ref, reactive, onMounted, watch, computed, nextTick } from "vue";
|
|
|
import { useRoute, useRouter } from "vue-router";
|
|
|
|
|
|
import { getCardInfo, updateOrder } from "@/api/order";
|
|
|
|
|
|
import { getOrderInfo, getOrderAction, updateOrderAction } from "@/api/order";
|
|
|
|
|
|
import defaultImg from "@/assets/images/logo.png";
|
|
|
import { ElMessage } from "element-plus";
|
|
|
|
|
|
const route = useRoute();
|
|
|
const router = useRouter();
|
|
|
|
|
|
const order_id = route.query.order_id;
|
|
|
|
|
|
const logisticType = {
|
|
|
1: "711",
|
|
|
2: "全家",
|
|
|
3: "萊爾富",
|
|
|
4: "OK",
|
|
|
}
|
|
|
|
|
|
const opName = {
|
|
|
confirm: "確認",
|
|
|
pay: "付款",
|
|
|
unpay: "未付款",
|
|
|
prepare: "配貨",
|
|
|
ship: "發貨",
|
|
|
unship: "未發貨",
|
|
|
arrive: "已到達",
|
|
|
unarrive: "未到達",
|
|
|
receive: "收貨",
|
|
|
cancel: "取消",
|
|
|
invalid: "無效",
|
|
|
return: "退貨",
|
|
|
after_service: "售後",
|
|
|
remove: "移除",
|
|
|
finish: "完成",
|
|
|
};
|
|
|
|
|
|
const orderInfo = ref({
|
|
|
address: {},
|
|
|
});
|
|
|
|
|
|
const dialogMessage = ref("");
|
|
|
|
|
|
const orderAction = ref([]);
|
|
|
|
|
|
onMounted(async () => {
|
|
|
getOrder(order_id);
|
|
|
});
|
|
|
|
|
|
const cardImg = computed(() => {
|
|
|
return orderInfo.value.card_image || defaultImg;
|
|
|
});
|
|
|
|
|
|
const getOrder = async (order_id) => {
|
|
|
let promise1 = getOrderInfo(order_id);
|
|
|
let promise2 = getOrderAction(order_id);
|
|
|
|
|
|
let [res1, res2] = await Promise.all([promise1, promise2]);
|
|
|
|
|
|
if (res1.code == 200) {
|
|
|
orderInfo.value = res1.data;
|
|
|
|
|
|
orderInfo.value.address = JSON.parse(orderInfo.value.address);
|
|
|
if (orderInfo.value.shipping_id === 14) {
|
|
|
switch (orderInfo.value.address.type) {
|
|
|
case "1":
|
|
|
orderInfo.value.address.type = "711";
|
|
|
break;
|
|
|
case "2":
|
|
|
orderInfo.value.address.type = "全家";
|
|
|
break;
|
|
|
case "3":
|
|
|
orderInfo.value.address.type = "萊爾富";
|
|
|
break;
|
|
|
case "4":
|
|
|
orderInfo.value.address.type = "OK";
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (res2.code == 200) {
|
|
|
orderAction.value = res2.data;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const handleGetOrder = (order_id) => {
|
|
|
if (!order_id || order_id === "null") return;
|
|
|
getOrder(order_id);
|
|
|
//不會rerender
|
|
|
router.push({ path: "/info", query: { order_id: order_id } });
|
|
|
};
|
|
|
|
|
|
const handlePrint = () => {
|
|
|
window.open(`order.php?act=info&order_id=${order_id}&print=1`);
|
|
|
};
|
|
|
|
|
|
const getSummaries = (param) => {
|
|
|
const { columns, data } = param;
|
|
|
|
|
|
const sums = [];
|
|
|
columns.forEach((column, index) => {
|
|
|
if (index === 0) {
|
|
|
sums[index] = "合計";
|
|
|
return;
|
|
|
}
|
|
|
//index 在 1-6之間 不顯示
|
|
|
if (index > 0 && index < 7) {
|
|
|
sums[index] = "";
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
const values = data.map((item) => Number(item[column.property]));
|
|
|
if (!values.every((value) => Number.isNaN(value))) {
|
|
|
sums[index] = `$ ${values.reduce((prev, curr) => {
|
|
|
const value = Number(curr);
|
|
|
if (!Number.isNaN(value)) {
|
|
|
return prev + curr;
|
|
|
} else {
|
|
|
return prev;
|
|
|
}
|
|
|
}, 0)}`;
|
|
|
} else {
|
|
|
sums[index] = "N/A";
|
|
|
}
|
|
|
});
|
|
|
return sums;
|
|
|
};
|
|
|
|
|
|
const dialogPrintCardVisible = ref(false);
|
|
|
const dialogPrintVisible = ref(false);
|
|
|
const dialogPrintAddrVisible = ref(false);
|
|
|
|
|
|
const handleOp = async (op) => {
|
|
|
console.log('op', op)
|
|
|
ElMessageBox.confirm("確認" + opName[op] + "?", "訂單操作", {})
|
|
|
.then(async () => {
|
|
|
let res = await updateOrderAction({
|
|
|
op,
|
|
|
order_id: orderInfo.value.order_id,
|
|
|
action_note: orderInfo.value.action_note,
|
|
|
});
|
|
|
if (res.code == 200) {
|
|
|
if (op === "remove") {
|
|
|
router.push({ path: "/list" });
|
|
|
} else {
|
|
|
getOrder(order_id);
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
.catch(() => {
|
|
|
return;
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
};
|
|
|
|
|
|
const showCardType = ref(0);
|
|
|
const activeName = ref("front");
|
|
|
|
|
|
const cardInfo = ref({
|
|
|
cname: "",
|
|
|
ename: "",
|
|
|
images: "",
|
|
|
user_id: "",
|
|
|
});
|
|
|
|
|
|
const size = ref(300);
|
|
|
|
|
|
const handleOpenPrintCard = async () => {
|
|
|
changePrintPage("1022px 652px");
|
|
|
let res = await getCardInfo(orderInfo.value.order_sn);
|
|
|
if (res.code === 200) {
|
|
|
cardInfo.value = res.data;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const handleClick = (tab, event) => {
|
|
|
if (tab.props.name === "front") {
|
|
|
showCardType.value = 0;
|
|
|
} else {
|
|
|
showCardType.value = 1;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const printObj = ref({
|
|
|
id: "printMe",
|
|
|
popTitle: "card print",
|
|
|
beforeOpenCallback(vue) { },
|
|
|
clickMounted() {
|
|
|
size.value = 300;
|
|
|
},
|
|
|
openCallback(vue) {
|
|
|
// vue.printLoading = false;
|
|
|
size.value = 300;
|
|
|
},
|
|
|
closeCallback(vue) {
|
|
|
// size.value = 100;
|
|
|
},
|
|
|
});
|
|
|
|
|
|
const handleFinish = async () => {
|
|
|
|
|
|
let res = await updateOrderAction({
|
|
|
op: "printcard",
|
|
|
order_id: orderInfo.value.order_id,
|
|
|
action_note: '完成配貨',
|
|
|
});
|
|
|
|
|
|
if (res.code === 200) {
|
|
|
dialogPrintCardVisible.value = false;
|
|
|
getOrder(order_id);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
//印標籤
|
|
|
const printUrl = ref("");
|
|
|
const printIframe = ref(null);
|
|
|
|
|
|
const printLabel = async () => {
|
|
|
switch (orderInfo.value.shipping_id) {
|
|
|
case 1:
|
|
|
changePrintPage("10cm 15cm landscape");
|
|
|
//列印住址標籤
|
|
|
dialogPrintAddrVisible.value = true;
|
|
|
|
|
|
break;
|
|
|
case 2:
|
|
|
if (orderInfo.value.address.type !== "2") {
|
|
|
let iWidth = 800; //視窗的寬度;
|
|
|
let iHeight = 600; //視窗的高度;
|
|
|
let iTop = (window.screen.availHeight - 30 - iHeight) / 2; //視窗的垂直位置;
|
|
|
let iLeft = (window.screen.availWidth - 10 - iWidth) / 2; //視窗的水平位置;
|
|
|
window.open(
|
|
|
`${import.meta.env.VITE_APP_BASE_URL}adminapi/v1/order/printlabel?order_id=${order_id}`,
|
|
|
"Print Label",
|
|
|
"height=" +
|
|
|
iHeight +
|
|
|
",,innerHeight=" +
|
|
|
iHeight +
|
|
|
",width=" +
|
|
|
iWidth +
|
|
|
",innerWidth=" +
|
|
|
iWidth +
|
|
|
",top=" +
|
|
|
iTop +
|
|
|
",left=" +
|
|
|
iLeft +
|
|
|
",status=no,location=no,status=no,menubar=no,toolbar=no,resizable=no,scrollbars=no"
|
|
|
);
|
|
|
} else {
|
|
|
changePrintPage("10cm 15cm");
|
|
|
//列印超商標籤
|
|
|
dialogPrintVisible.value = true;
|
|
|
printUrl.value = `${import.meta.env.VITE_APP_BASE_URL}adminapi/v1/order/printlabel?order_id=${order_id}`;
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
};
|
|
|
|
|
|
const handleClosePrint = () => {
|
|
|
changePrintPage("1022px 652px");
|
|
|
dialogPrintVisible.value = false;
|
|
|
};
|
|
|
|
|
|
const handleClosePrintAddr = () => {
|
|
|
changePrintPage("1022px 652px");
|
|
|
dialogPrintAddrVisible.value = false;
|
|
|
};
|
|
|
|
|
|
const changePrintPage = (page) => {
|
|
|
console.log("change pagesize");
|
|
|
var css = (css = `@page { size: ${page}; margin: 0; }`);
|
|
|
var head = document.head || document.getElementsByTagName("head")[0],
|
|
|
style = document.createElement("style");
|
|
|
style.media = "print";
|
|
|
|
|
|
if (style.styleSheet) {
|
|
|
style.styleSheet.cssText = css;
|
|
|
} else {
|
|
|
style.appendChild(document.createTextNode(css));
|
|
|
}
|
|
|
head.appendChild(style);
|
|
|
};
|
|
|
|
|
|
const makeNfcCard = async () => {
|
|
|
let nfcReaderUrl = 'http://localhost:8088'
|
|
|
const data = new URLSearchParams();
|
|
|
//將cardInfo去除掉https://
|
|
|
let cardInfoUrl = cardInfo.value.nfcurl.replace('https://', '')
|
|
|
data.append('data', cardInfoUrl);
|
|
|
|
|
|
try {
|
|
|
let res = await fetch(nfcReaderUrl + '/writenfc', {
|
|
|
method: 'POST',
|
|
|
body: data,
|
|
|
})
|
|
|
|
|
|
res = await res.json()
|
|
|
|
|
|
if (res.code !== 200) {
|
|
|
dialogMessage.value = res.error
|
|
|
setTimeout(() => {
|
|
|
dialogMessage.value = ""
|
|
|
}, 3000);
|
|
|
return
|
|
|
}
|
|
|
dialogMessage.value = "製卡成功"
|
|
|
setTimeout(() => {
|
|
|
dialogMessage.value = ""
|
|
|
}, 3000);
|
|
|
return
|
|
|
} catch (e) {
|
|
|
dialogMessage.value = "請確認NFCCard程式是否開啟"
|
|
|
setTimeout(() => {
|
|
|
dialogMessage.value = ""
|
|
|
}, 3000);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const handleNfcCard = async () => {
|
|
|
const { toClipboard } = useClipboard();
|
|
|
try {
|
|
|
await toClipboard(cardInfo.value.nfcurl);
|
|
|
dialogMessage.value = "複製成功"
|
|
|
setTimeout(() => {
|
|
|
dialogMessage.value = ""
|
|
|
}, 2000);
|
|
|
return;
|
|
|
} catch (e) {
|
|
|
dialogMessage.value = "複製失敗"
|
|
|
setTimeout(() => {
|
|
|
dialogMessage.value = ""
|
|
|
}, 2000);
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
.top-action {
|
|
|
text-align: center;
|
|
|
}
|
|
|
|
|
|
.box-card {
|
|
|
margin-bottom: 10px;
|
|
|
}
|
|
|
|
|
|
.el-card {}
|
|
|
|
|
|
table {
|
|
|
width: 100%;
|
|
|
}
|
|
|
|
|
|
.nav {
|
|
|
display: flex;
|
|
|
|
|
|
.nav-item {
|
|
|
margin-right: 10px;
|
|
|
// border: 1px solid #666;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.card-preview {
|
|
|
width: 345px;
|
|
|
height: 220px;
|
|
|
// border: 1px solid #000;
|
|
|
margin: 0px;
|
|
|
position: relative;
|
|
|
|
|
|
img {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: absolute;
|
|
|
top: 0;
|
|
|
left: 0;
|
|
|
}
|
|
|
|
|
|
.front {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: absolute;
|
|
|
|
|
|
.front-logo {
|
|
|
position: absolute;
|
|
|
width: 100px;
|
|
|
height: 100px;
|
|
|
top: 60px;
|
|
|
left: 20px;
|
|
|
}
|
|
|
|
|
|
.front-cname {
|
|
|
position: absolute;
|
|
|
top: 70px;
|
|
|
left: 180px;
|
|
|
font-size: 20px;
|
|
|
letter-spacing: 5px;
|
|
|
}
|
|
|
|
|
|
.front-ename {
|
|
|
position: absolute;
|
|
|
top: 110px;
|
|
|
left: 180px;
|
|
|
font-size: 12px;
|
|
|
letter-spacing: 5px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.back {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: absolute;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
|
|
|
.nfcimg {
|
|
|
width: 100px;
|
|
|
height: 100px;
|
|
|
|
|
|
canvas {
|
|
|
width: 100px !important;
|
|
|
height: 100px !important;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#printAddr {
|
|
|
width: 600px;
|
|
|
height: 400px;
|
|
|
|
|
|
.addr {
|
|
|
.address {
|
|
|
font-size: 20px;
|
|
|
font-weight: bold;
|
|
|
line-height: 100px;
|
|
|
}
|
|
|
|
|
|
.name {
|
|
|
font-size: 20px;
|
|
|
font-weight: bold;
|
|
|
line-height: 100px;
|
|
|
padding-left: 100px;
|
|
|
}
|
|
|
|
|
|
.sender {
|
|
|
text-align: right;
|
|
|
font-size: 20px;
|
|
|
line-height: 100px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@media print {
|
|
|
#printMe {
|
|
|
-webkit-print-color-adjust: exact !important;
|
|
|
color-adjust: exact !important;
|
|
|
}
|
|
|
|
|
|
.card-preview {
|
|
|
width: 1021px;
|
|
|
height: 651px;
|
|
|
// border: 1px solid #000;
|
|
|
margin: 0px;
|
|
|
position: relative;
|
|
|
|
|
|
img {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: absolute;
|
|
|
top: 0;
|
|
|
left: 0;
|
|
|
}
|
|
|
|
|
|
.front {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: absolute;
|
|
|
|
|
|
.front-logo {
|
|
|
position: absolute;
|
|
|
width: 300px;
|
|
|
height: 300px;
|
|
|
top: 150px;
|
|
|
left: 80px;
|
|
|
}
|
|
|
|
|
|
.front-cname {
|
|
|
position: absolute;
|
|
|
top: 210px;
|
|
|
left: 530px;
|
|
|
font-size: 72px;
|
|
|
letter-spacing: 5px;
|
|
|
}
|
|
|
|
|
|
.front-ename {
|
|
|
position: absolute;
|
|
|
top: 320px;
|
|
|
left: 530px;
|
|
|
font-size: 40px;
|
|
|
letter-spacing: 7px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.back {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: absolute;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
|
|
|
.nfcimg {
|
|
|
width: 300px;
|
|
|
height: 300px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#printIframe {}
|
|
|
|
|
|
#printAddr {
|
|
|
width: 1020px;
|
|
|
height: 649px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.action {
|
|
|
margin-top: 10px;
|
|
|
}
|
|
|
|
|
|
.message-override {
|
|
|
z-index: 9999 !important;
|
|
|
}
|
|
|
|
|
|
.dialog-message {
|
|
|
padding: 10px 5px;
|
|
|
margin-top: -40px;
|
|
|
margin-bottom: 10px;
|
|
|
color: #FF7575;
|
|
|
border: 1px solid #ccc;
|
|
|
}
|
|
|
</style>
|