web/src/components/charge/OrderDetail.vue

388 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<Mask :width="1000" :height="560" :is-show="show" @close="show = false" title="订单详情">
<div class="container">
<div class="title">
<CloseBtn @click="show = false"></CloseBtn>
</div>
<div class="content">
<div class="left">
<div class="goods-detail">
<div class="title">药品详情</div>
<el-table border :header-cell-style="{ backgroundColor: '#f5f7fa' }" :data="orderInfo.goodsDetail" style="height: 100%">
<el-table-column label="商品" prop="name" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="数量" prop="number" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单位" prop="unit" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.preUnitPrice }}
</template>
</el-table-column >
<el-table-column label="实价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.unitPrice }}
</template>
</el-table-column>
<el-table-column label="小计" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.subTotalPrice }}
</template>
</el-table-column>
<el-table-column label="追溯码" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.traceabilityCode?.length ==2 ?"未绑定追溯码":scope.row.traceabilityCode}}
</template>
</el-table-column>
</el-table>
</div>
<div class="service-detail">
<div class="title">服务详情</div>
<el-table border :header-cell-style="{ backgroundColor: '#f5f7fa' }" :data="orderInfo.serviceDetail" style="height: 100%">
<el-table-column label="商品" prop="name" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="数量" prop="number" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单位" prop="unit" width="100" show-overflow-tooltip></el-table-column>
<el-table-column label="单价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.preUnitPrice }}
</template>
</el-table-column >
<el-table-column label="实价" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.unitPrice }}
</template>
</el-table-column>
<el-table-column label="小计" width="100" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.subTotalPrice }}
</template>
</el-table-column>
<el-table-column label="追溯码" show-overflow-tooltip>
<template #default="scope">
-
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="right">
<div class="right_head">
<div class="title">支付信息</div>
<div class="info">
<div class="item">
<div class="label">开单时间</div>
<div class="value">{{formatDate(orderInfo.createDatetime)}}</div>
</div>
<div class="item">
<div class="label">完成时间</div>
<div class="value">{{ formatDate(orderInfo.payTime)}}</div>
</div>
<div class="item">
<div class="label">收费员</div>
<div class="value">{{ orderInfo.salePersonName }}</div>
</div>
<div class="item">
<div class="label">药师</div>
<div class="value">{{ orderInfo.dockerName}}</div>
</div>
<div class="item">
<div class="label">销售人</div>
<div class="value">{{ orderInfo.salePersonName }}</div>
</div>
<div class="item">
<div class="label">原价</div>
<div class="value">{{ orderInfo.preTotalPrice }}</div>
</div>
<div class="item">
<div class="label">优惠</div>
<div class="value">{{ (orderInfo.preTotalPrice-orderInfo.totalPrice).toFixed(2)}}</div>
</div>
<div class="item">
<div class="label">应收</div>
<div class="value">{{ orderInfo.totalPrice }}</div>
</div>
<div class="item">
<div class="label">实收</div>
<div class="value">{{ orderInfo.totalPrice }}</div>
</div>
<div class="item">
<div class="label">支付方式</div>
<div class="value">{{ orderInfo.orderId }}</div>
</div>
<div class="item">
<div class="label">零售备注</div>
<div class="value">{{ orderInfo.orderId }}</div>
</div>
</div>
</div>
<div class="right_body">
<div class="label">发票状态</div>
<div class="value">未开票</div>
</div>
<div class="right_foot">
<div class="label">
<div class="pay">-{{ orderInfo.payType ? getPayTypeStr(orderInfo.payType) : "" }}</div>
<div class="name">{{ orderInfo.salePersonName }}</div>
<div>备注-</div>
</div>
<div class="value">{{orderInfo.totalPrice}}</div>
</div>
</div>
</div>
<div class="footer">
<!-- <el-button type="primary" plain>追溯码</el-button>-->
<div>
<!-- <el-button type="danger" plain @click="cancel" v-if="orderInfo.status == 0">取消</el-button>-->
<el-button type="danger" plain @click="refund" v-if="orderInfo.status == 1">退款</el-button>
<el-button type="primary" @click="print" v-if="orderInfo.status == 1">
打印<el-icon class="el-icon--right"><Upload /></el-icon>
</el-button>
</div>
</div>
</div>
</Mask>
</template>
<script setup lang="ts">
import {onMounted, onUnmounted, ref} from "vue";
import Mask from "@/components/common/Mask.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {Upload} from "@element-plus/icons-vue";
import {post} from "@/utils/request.ts";
import {useWsStore} from "@/stores/wsStore.ts";
import type {Request, Response} from "@/utils/ws.ts";
import {ElMessage} from "element-plus";
import {medTypeJson} from "@/assets/config/constants.ts";
const show = ref<boolean>(false);
const orderInfo = ref<any>({});
const init = (code: any) => {
show.value = true;
post("charge/getByCode", {code: code}).then((res: any)=>{
orderInfo.value = res;
})
}
//修改时间格式化
const formatDate = (isoStr: any) => {
if (!isoStr) {
return ""
}
const date = new Date(isoStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const payTypeObj = {
0: "微信",
1: "支付宝",
2: "现金",
3: "医保"
}
type PayTypeKey = 0 | 1 | 2 | 3;
const emit = defineEmits(['updateOrderList'])
const getPayTypeStr = (payType: number): string => {
if (Object.keys(payTypeObj).includes(String(payType))) {
return payTypeObj[payType as PayTypeKey] || "未知";
}
return "未知";
};
const close = () => {
show.value = false;
emit('updateOrderList')
}
defineExpose({init})
const refund = () => {
console.log(orderInfo.value)
post("charge/refund",{changeOrderCode:orderInfo.value.code}).then((res:any)=>{
close()
})
}
// const cancel = () => {
// post("retail/cancelOrder",{orderId:orderInfo.value.id}).then((res:any)=>{
// close()
// })
//
// }
const wsStore = useWsStore();
// 定义 medType 的合法键类型
type MedTypeKey = keyof typeof medTypeJson;
const print = () => {
if (!orderInfo.value.code){
return
}
let code = orderInfo.value.code;
const printConfig = {} as any;
post("common/config/getPrintConfig").then((res:any)=>{
printConfig.printName=res.printName
printConfig.pageType=res.pageType
if (!printConfig.printName || !printConfig.pageType){
ElMessage.error("打印机未设置,请先到设置-打印管理中设置")
return;
}
post("charge/getPrintInfoByCode", {code}).then((res: any) => {
res.printerName = printConfig.printName
res.pageType = printConfig.pageType
if (res.chargeSocialPayLog){
res.chargeSocialPayLog.medTypeStr = medTypeJson[res.chargeSocialPayLog.medType as MedTypeKey];
}
console.log(res)
wsStore.sendMessage({
type: "PrintReceipt",
config: null,
data: res
})
})
})
}
let request: Request = {
type: "getPrintList",
config: null,
data: null
}
wsStore.sendMessage(request);
const reciceMessage = (response: Response) => {
}
onMounted(async () => {
wsStore.setMessageCallback(reciceMessage)
})
onUnmounted(() => {
wsStore.removeAllMessageCallback()
})
</script>
<style scoped lang="scss">
@use "@/assets/scss/base";
:deep(.el-scrollbar__view){
height: 100%;
}
.container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
min-height: 0;
padding:0 24px;
.title {
height: 35px;
}
.content {
flex: 1;
display: flex;
.left {
flex: 2;
height: 100%;
margin-right: 10px;
min-height: 0;
.goods-detail{
height: 40%;
.title{
font-weight: bold;
}
}
.service-detail{
height: 40%;
margin-top: 50px;
.title{
font-weight: bold;
}
}
}
.right {
min-width: 100px;
height: 100%;
flex: 1;
min-height: 0;
border: solid 1px #e6e6e6;
display: flex;
flex-direction: column;
.right_head {
padding: 10px;
.title {
font-size: 12px;
font-weight: 600;
height: 25px;
}
.info {
font-size: 12px;
font-weight: 400;
color: #999ca1;
.item {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
.value {
color: #000;
}
}
}
}
.right_body {
padding: 0 10px;
font-size: 12px;
font-weight: 400;
height: 30px;
color: #999ca1;
border-top: 1px solid #e6e6e6;
display: flex;
justify-content: space-between;
align-items: center;
.value {
color: base.$warning-color;
}
}
.right_foot {
flex: 1;
padding: 0 10px;
font-size: 12px;
font-weight: 400;
color: #999ca1;
border-top: 1px solid #e6e6e6;
display: flex;
justify-content: space-between;
align-items: center;
.label {
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
.pay{
color: #000;
}
.name{
margin: 5px 0;
}
}
.value {
color: #000;
}
}
}
}
.footer {
height: 40px;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
}
}
</style>