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

584 lines
15 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script setup>
/**
* name
* usersa0ChunLuyu
* date2022年12月25日 20:50:25
*/
import {
UserOrderCancelAction,
UserOrderRefundAction,
UserOrderListAction,
HospitalSelectListAction,
$response, HospitalInfoAction,
} from '~/api'
import $router from '~/router'
import {h} from "vue";
import {NTag, NSpace} from 'naive-ui'
import {onBeforeRouteUpdate} from "vue-router";
const hospital_info = ref(false)
const HospitalInfo = async () => {
const response = await HospitalInfoAction()
$response(response, () => {
hospital_info.value = response.data.info
UserOrderList()
})
}
const default_page_options = {
page: 1,
start_time: null,
end_time: null,
time: 1,
search: '',
status: 0,
}
const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => {
routerChange(to.query)
})
const routerChange = (query) => {
page_options.value = {
start_time: query.start_time || default_page_options.start_time,
end_time: query.end_time || default_page_options.end_time,
time: Number(query.time || default_page_options.time),
search: query.search || default_page_options.search,
status: Number(query.status || default_page_options.status),
page: Number(query.page || default_page_options.page),
}
user_order_active.value = []
if (!hospital_info.value) {
HospitalInfo()
} else {
UserOrderList()
}
}
onMounted(() => {
routerChange($router.currentRoute.value.query)
})
const user_order_active = ref([])
const user_order_list = ref([])
const user_order_list_last_page = ref(0)
const UserOrderList = async () => {
const response = await UserOrderListAction({
...page_options.value,
hospital: hospital_info.value.id
})
$response(response, () => {
user_order_list.value = response.data.data.map((item) => {
item.buy_info = JSON.parse(item.buy_info)
return item
})
user_order_list_last_page.value = response.data.last_page
})
}
const pay_arr = ['暂未指定', '微信', '会员卡', '免费']
const pay_color_arr = ['default', 'success', 'error', 'info']
const status_arr = ['待支付', '已支付', '已取消', '已完成', '已退款', '已到检', '仅退款']
const status_color_arr = ['default', 'success', 'default', 'info', 'error']
const user_order_columns = [{
type: 'selection',
multiple: false
}, {
title: '体检人信息',
key: 'name',
render(row) {
let children = [
h('div', null, {
default: () => {
return [
h(
NSpace,
{align: 'center', justify: 'space-between'},
{
default: () => {
return [
h('div', null, [
h('b', '姓名: '),
row.name,
]),
]
}
}
)
]
}
}),
h('div', null, [
h('b', '性别:'),
h(
NTag,
{
size: 'small',
type: Number(row.sex) === 1 ? 'info' : 'error'
},
{
default: () => {
return Number(row.sex) === 1 ? '男' : '女'
}
}
),
]),
h('div', null, [
h('b', '手机号: '),
h('span', row.phone),
]),
h('div', null, [
h('b', '证件号: '),
h('span', row.id_number),
]),
]
if (row.type === 2) {
children.push(h('div', null, [
h('b', '单位名称: '),
h('span', null, row.buy_info.group.group_name),
]))
}
return children
}
}, {
title: '检测信息',
key: 'type',
render(row) {
let name = '-'
if (row.combo !== '0') {
name = row.buy_info.combo.name
} else {
if (Number(row.type) === 2) {
name = row.buy_info.group.combo_name
}
}
return [
h('div', null, [
h('b', '检测类型: '),
h(
NTag,
{
size: 'small',
type: Number(row.type) === 1 ? 'success' : 'error'
},
{
default: () => {
return Number(row.type) === 1 ? '个检' : '团检'
}
}
),
]),
h('div', null, [
h('b', '套餐名称: '),
h('span',{ onClick: ()=>combo_name_click(row.buy_info) }, null, name),
]),
h('div', {class: ['line_wrapper']}, [
h('b', '自选项目: '),
h('div', {class: ['items_content_wrapper']}, !!row.buy_info.items.length ? row.buy_info.items.map((item) => {
return item.name+'(¥'+ item.price+')'
}).join('、') : '无'),
]),
]
}
}, {
title: '支付信息',
key: 'status',
render(row) {
let zixuan_price=0
let price = row.price
if (row.price !== row.true_price) {
price = price
}
row.buy_info.items.map((item) => {
zixuan_price=Number(zixuan_price) +Number(item.price) })
let children = [
h('div', null, [
h('b', '订单编号: '),
h('span', row.show),
]),
h(
NSpace,
{align: 'center'},
{
default: () => {
return [
h('b', '支付方式: '),
h(
NTag,
{
size: 'small',
type: pay_color_arr[row.pay_type]
},
{
default: () => {
return pay_arr[row.pay_type]
}
}
),
]
}
}
),
h('div', null, [
h('b', '订单金额: '),
h('span', price),
h('b', !!row.buy_info.combo.id != 0 ? "套餐金额: " : null),
h('span', !!row.buy_info.combo.id != 0 ? row.buy_info.combo.price : null),
h('span', !!row.buy_info.items.length > 0 ? [
h('b',"自选金额: "),
h('span',zixuan_price)
] : null),
]),
h('div', null, [
h('b', '实际支付金额: '),
h('span', row.true_price),
]),
h(
NSpace,
{align: 'center'},
{
default: () => {
return [
h('b', '支付状态: '),
h(
NTag,
{
size: 'small',
type: ((!!row.refund_time && row.status === 2) || (!row.appointment_number && row.status === 2))
? 'error'
: status_color_arr[row.status - 1]
},
{
default: () => {
if (!!row.refund_time && row.status === 2) return '仅退款'
if (!row.appointment_number && row.status === 2) return '仅退订'
return status_arr[row.status - 1]
}
}
),
]
}
}
),
]
if (row.status !== 1 && row.status !== 3) {
children.push(h('div', null, [
h('b', '支付时间: '),
h('span', row.pay_time),
]))
}
if (!!row.transaction) {
children.splice(1,0,h('div', null, [
h('b', '支付编号: '),
h('span', row.transaction),
]))
}
if (!!row.refund_time) {
children.push(h('div', null, [
h('b', '退款时间: '),
h('span', row.refund_time),
]))
}
return children
}
}, {
title: '体检信息',
key: 'appointment',
render(row) {
let children = [
h('div', null, [
h('b', '预约时间: '),
h('span', row.appointment_time),
]),
h('div', null, [
h('b', '预约编号: '),
h('span', !!row.appointment_number ? row.appointment_number : '-'),
]),
h('div', null, [
h('b', '到检状态: '),
h(
NTag,
{
size: 'small',
type: row.check_status === 2 ? 'success' : 'error'
},
{
default: () => {
return row.check_status === 2 ? '已到检' : '未到检'
}
}
),
]),
]
if (row.check_status === 2) {
children.push(h('div', null, [
h('b', '到检时间: '),
h('span', row.check_time),
]))
}
if (!!row.exam_number) {
children.push(h('div', null, [
h('b', '体检编号: '),
h('span', row.exam_number),
]))
}
children.push(h('div', null, [
h('b', '介绍人: '),
h('span', row.referral ? row.referral : '-'),
]))
return children
}
},{
title: '结算信息',
key: 'receivers',
render(row) {
let s_info=JSON.parse(row.receivers)
if(s_info)
console.log(s_info)
let children = [
h('div', null, [
h('b', '订单总金额: '),
h('span', row.price),
]),
h('div', null, [
h('b', '各方应收: '),
h('div', !!s_info ? s_info.map((item) => {
if(item.account!='代理'){
return item.account + ' ¥'+(item.amount/100)
}
}).join('\r\n') : ''),
]),
h('div', null, [
h('b', '结算状态: '),
h(
NTag,
{
size: 'small',
type: row.sharing_status ===1 ? 'success' : 'error'
},
{
default: () => {
return row.sharing_status === 1 ? '已结算' : '未结算'
}
}
),
]),
]
return children
}
}]
const pagePush = () => {
$router.push({
query: page_options.value
})
}
const searchClick = () => {
updatePage(1)
}
const updatePage = (page) => {
page_options.value.page = page
pagePush()
}
const clearSearchClick = () => {
$router.push({
query: JSON.parse(JSON.stringify({
...default_page_options
}))
})
}
const refund_show = ref(false)
const refund_type = ref(1)
const RefundShow = (type) => {
if (user_order_active.value.length === 0) return window.$message().error('请选择一个订单')
refund_type.value = type
refund_show.value = true
}
const UserOrderRefund = async () => {
const response = await UserOrderRefundAction({
id: user_order_active.value[0],
type: refund_type.value
})
$response(response, () => {
window.$message().success('操作成功')
refund_show.value = false
UserOrderList()
})
}
const cancel_show = ref(false)
const cancel_type = ref(1)
const CancelShow = (type) => {
if (user_order_active.value.length === 0) return window.$message().error('请选择一个订单')
cancel_type.value = type
cancel_show.value = true
}
const UserOrderCancel = async () => {
const response = await UserOrderCancelAction({
id: user_order_active.value[0],
type: cancel_type.value
})
$response(response, () => {
window.$message().success('操作成功')
cancel_show.value = false
UserOrderList()
})
}
let comboinfo_show=ref(false)
let comboItemList=ref('')
const combo_name_click=(combo)=>{
console.log(combo.combo);
if(combo.combo.name!='自选项目'){
comboinfo_show.value=true
comboItemList.value=combo.combo.items
}
}
</script>
<template>
<div>
<n-modal v-model:show="comboinfo_show" preset="card" :style="{width: '400px'}"
title="套餐项目" :auto-focus="false"
:bordered="false">
<div>
<div v-for="(item,index) in comboItemList" :key="index">
{{item.name}} ¥{{item.price}}
</div>
<n-space justify="center">
<!-- <n-button @click="UserOrderCancel()" type="info">确定</n-button> -->
<!-- <n-button @click="comboinfo_show = false">确定</n-button> -->
</n-space>
</div>
</n-modal>
<n-modal v-model:show="cancel_show" preset="card" :style="{width: '400px'}"
:title="`取消${cancel_show === 2 ? '订单' : '预约'}确认`" :auto-focus="false"
:bordered="false">
<div>
<n-space justify="center">
<n-button @click="UserOrderCancel()" type="info">确定</n-button>
<n-button @click="cancel_show = false">取消</n-button>
</n-space>
</div>
</n-modal>
<n-modal v-model:show="refund_show" preset="card" :style="{width: '400px'}"
:title="`退款${refund_type === 2 ? '&取消预约' : ''}确认`" :auto-focus="false"
:bordered="false">
<div>
<n-space justify="center">
<n-button @click="UserOrderRefund()" type="info">确定</n-button>
<n-button @click="refund_show = false">取消</n-button>
</n-space>
</div>
</n-modal>
<n-card title="订单管理">
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">时间类型</div>
</n-tag>
<n-select class="form_input_wrapper" v-model:value="page_options.time"
:options="[
{value:1,label:'创建时间'},
{value:2,label:'支付时间'},
{value:3,label:'预约时间'},
]"/>
<n-tag>
<div class="form_tag_wrapper">开始时间</div>
</n-tag>
<n-date-picker v-model:formatted-value="page_options.start_time" type="datetime"/>
<n-tag>
<div class="form_tag_wrapper">结束时间</div>
</n-tag>
<n-date-picker v-model:formatted-value="page_options.end_time" type="datetime"/>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">搜索</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="page_options.search" placeholder="身份证、手机号、订单号"/>
<n-tag>
<div class="form_tag_wrapper">状态</div>
</n-tag>
<n-radio-group v-model:value="page_options.status" name="status_radio">
<n-space>
<n-radio :value="0"></n-radio>
<n-radio v-for="(i,k) in status_arr" :key="k" :value="k+1">{{ i }}</n-radio>
</n-space>
</n-radio-group>
<n-button @click="searchClick()" type="info">搜索</n-button>
<n-button @click="clearSearchClick()" type="warning">清空</n-button>
</n-space>
<n-space mt-2>
<n-button v-if="false" @click="RefundShow(1)" type="error">退款</n-button>
<n-button v-if="false" @click="CancelShow(1)" type="warning">取消预约</n-button>
<n-button @click="RefundShow(2)" type="error">退款&取消预约</n-button>
<n-button @click="CancelShow(2)" type="warning"></n-button>
</n-space>
<n-data-table mt-2 striped v-model:checked-row-keys="user_order_active"
:columns="user_order_columns"
:row-key="row=>row.id" :data="user_order_list"/>
<n-pagination v-if="user_order_list_last_page > 1" @update:page="updatePage" mt-2
v-model:page="page_options.page"
:page-count="user_order_list_last_page"/>
</div>
</n-card>
</div>
</template>
<style>
.line_wrapper {
display: flex;
}
.items_content_wrapper {
width: 200px;
}
</style>
<style scoped>
.op0 {
opacity: 0;
}
.date_box_wrapper {
background: #ffffff;
margin-top: 2px;
cursor: pointer;
border-radius: 6px;
}
.month_wrapper {
display: flex;
}
.month_box_title_wrapper {
height: 40px;
line-height: 40px;
font-size: 20px;
background: #00000005;
}
.month_box_wrapper {
background: #00000010;
border: 1px #00000010 solid;
text-align: center;
border-radius: 6px;
overflow: hidden;
}
.form_checkbox_wrapper {
width: 300px;
}
.create {
background: #4b9d5f60;
}
</style>
<route>
{"meta":{"title":"订单管理"}}
</route>