fuyuan-housekeeping-admin/src/views/order/lists/index.vue

270 lines
12 KiB
Vue

<template>
<el-card shadow="never" class="!border-none">
<el-form :model="formData" inline>
<el-form-item label="订单编号">
<el-input class="ls-input" v-model="formData.sn" placeholder="请输入订单编号" />
</el-form-item>
<el-form-item label="用户信息">
<el-input class="ls-input" v-model="formData.userInfo" placeholder="请输入用户信息" />
</el-form-item>
<el-form-item label="服务名称">
<el-input class="ls-input" v-model="formData.goodsName" placeholder="请输入服务名称" />
</el-form-item>
<!-- <el-form-item label="师傅信息">
<el-input class="ls-input" v-model="formData.staffInfo" placeholder="请输入师傅信息" clearable />
</el-form-item> -->
<el-form-item label="支付状态">
<el-select v-model="formData.payStatus" placeholder="请选择" class="ls-input">
<el-option v-for="option in optionMap.payStatusOptions" :key="option.value" :label="option.label" :value="option.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="派单状态">
<el-select v-model="formData.isDispatch" placeholder="请选择" class="ls-input">
<el-option v-for="option in optionMap.dispatchOptions" :key="option.value" :label="option.label" :value="option.value" />
</el-select>
</el-form-item> -->
<el-form-item label="下单时间">
<data-picker
class="ls-input"
style="width: 280px"
v-model:startTime="formData.orderTimeStart"
v-model:endTime="formData.orderTimeEnd"
></data-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card shadow="never" class="mt-4 !border-none">
<el-tabs class="-mt-2" v-model="formData.orderStatus" @tab-change="resetPage">
<el-tab-pane :label="`全部(${countData?.totalCount || '0'})`" name="" />
<el-tab-pane :label="`待支付(${countData?.waitPayCount || '0'})`" :name="0" />
<!-- <el-tab-pane :label="`预约中(${countData?.reserveCount || '0'})`" :name="1" />
<el-tab-pane :label="`服务中(${countData?.servicingCount || '0'})`" :name="2" /> -->
<el-tab-pane :label="`已预约(${countData?.servicingCount || '0'})`" :name="2" />
<el-tab-pane :label="`已完成(${countData?.finishedCount || '0'})`" :name="3" />
<el-tab-pane :label="`退款单(${countData?.closeCount || '0'})`" :name="4" />
</el-tabs>
<div class="mt-4">
<el-table ref="tableData" size="large" :data="pager.lists" v-loading="pager.loading">
<el-table-column property="sn" label="订单编号" min-width="200" />
<el-table-column label="用户信息" min-width="120">
<template #default="scope">
<el-popover placement="top-start" width="200px" trigger="hover">
<div class="flex">
<span class="flex-none mr-2">头像:</span>
<el-image :src="scope.row.avatar" style="width: 40px; height: 40px; border-radius: 50%" />
</div>
<div class="flex mt-2">
<span class="flex-none mr-2">昵称:</span>
<span>{{ scope.row.nickname }}</span>
</div>
<div class="flex mt-2">
<span class="flex-none mr-2">编号:</span>
<span>{{ scope.row.userSn }}</span>
</div>
<template #reference>
<router-link :to="`/user/userList/detail?id=${scope.row.userId}`">
<div class="pointer normal text-primary">
{{ scope.row.nickname }}
</div>
</router-link>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column label="服务名称" min-width="260">
<template #default="{ row }">
<div class="flex items-center goods-box">
<div class="w-[60px] h-[60px]">
<el-image
style="width: 60px; height: 60px"
:src="row.goodsImage"
:preview-src-list="[row.goodsImage]"
:hide-on-click-modal="true"
:preview-teleported="true"
:fit="'contain'"
/>
</div>
<router-link :to="`/service/lists/edit?id=${row.goodsId}`" class="ml-2 xs">
<div class="goods-name truncate w-44">{{ row.goodsName }}</div>
<div class="form-tips">{{ row.goodsPrice }} {{ row.unitName }}</div>
</router-link>
</div>
</template>
</el-table-column>
<el-table-column label="实付金额" min-width="100">
<template #default="scope">¥{{ scope.row.orderAmount }}</template>
</el-table-column>
<el-table-column label="预约日期" min-width="160">
<template #default="scope">
{{ scope.row.appointTime }} {{ scope.row.weekDay }} {{ scope.row.appointTimeStartStr }}-{{ scope.row.appointTimeEndStr }}
</template>
</el-table-column>
<el-table-column property="contact" label="联系人" min-width="100" />
<!-- <el-table-column property="staffName" label="服务师傅" min-width="100">
<template #default="{ row }">{{ parseEmpty(row, 'staffName') }}</template>
</el-table-column> -->
<el-table-column label="订单状态" min-width="100">
<template v-slot="{ row }">
<span
:class="{
error: setStatusColor(row.orderStatusName)
}"
>
{{ row.orderStatusName }}
</span>
</template>
</el-table-column>
<!-- <el-table-column label="派单状态" width="100" prop="isDispatchName">
<template v-slot="{ row }">
<el-tag type="success" v-if="row.isDispatch === 1">已派单</el-tag>
<el-tag type="danger" v-if="row.isDispatch === 0">未派单</el-tag>
</template>
</el-table-column> -->
<el-table-column label="操作" min-width="140" fixed="right">
<template #default="scope">
<router-link
class="mr-2"
:to="{
path: 'lists/detail',
query: {
id: scope.row.id
}
}"
>
<el-link type="primary" :underline="false"></el-link>
</router-link>
<operation
btnStyle="text"
:id="scope.row.id"
:verificationCode="scope.row.verificationCode"
:cancelBtn="scope.row.cancelBtn"
:deleteBtn="scope.row.deleteBtn"
:verificationBtn="scope.row.verificationBtn"
:orderRemarks="scope.row.orderRemarks ?? ''"
@refresh="resetPage"
@cancelOrder="handleCancelOrder(scope.row, resetPage)"
/>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</template>
<script lang="ts" setup name="orderList">
import { apiOrderLists, apiOrderStatis } from '@/api/order/lists'
import { reactive, onMounted, computed } from 'vue'
import { useRoute } from 'vue-router'
import { OrderMode } from '@/enums/modeEnum'
import Operation from './components/operation.vue'
import Pagination from '@/components/pagination/index.vue'
import DataPicker from '@/components/daterange-picker/index.vue'
import cancelOrderDialog from './components/cancelOrderDialog.vue'
import { usePaging } from '@/hooks/usePaging'
import { parseEmpty } from '@/utils/util'
import { optionMap } from '@/config/status'
import { useCancelOrderAction } from './hook'
interface formDataObj {
sn: string // string
userInfo: string // string
goodsName: string // string
payStatus: string | number // int ;0-;1-;
orderTimeStart: string // string
orderTimeEnd: string // string
orderStatus: string | number // int ;0-;1-;2-;3-;4-
staffInfo: string //
isDispatch: string | number // int ;0-;1-
}
const route = useRoute()
const orderMode: any = reactive<any>(OrderMode)
const formData = reactive<formDataObj>({
sn: '',
userInfo: '',
goodsName: '',
payStatus: '',
orderTimeStart: '',
orderTimeEnd: '',
orderStatus: '',
staffInfo: route.query.staffInfo ?? '',
isDispatch: ''
})
const getOrderAmount = async () => {
countData.value = await apiOrderStatis(formData)
}
const setStatusColor = computed(() => {
return function (val: string) {
return val === '待支付' || val === '已退款' || val === '退款中'
}
})
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: apiOrderLists,
params: formData,
nextFetchFun: getOrderAmount
})
const countData = ref<any>({})
getLists()
getOrderAmount()
onMounted(initParams)
const { handleCancelOrder } = useCancelOrderAction(cancelOrderDialog)
/**设置路由传递过来的参数 */
function initParams() {
if (Object.keys(route.query).length === 0) return
formData.staffInfo = JSON.parse(route.query.staffInfo)
}
/**页面缓存 */
onActivated(() => {
getLists()
})
</script>
<style lang="scss" scoped>
:deep() .el-tabs__content {
padding: 0;
}
.ls-input {
width: 280px;
}
.error {
color: #db2828;
}
.goods-box {
.goods-name {
color: #333333;
}
}
.goods-box:hover {
.goods-name {
color: #4a5dff;
text-decoration: underline;
}
}
a {
text-decoration: none !important; //去掉原有链接文字下划线
}
.el-tabs__nav-wrap::after {
height: 1px !important;
}
</style>