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

801 lines
23 KiB

7 months ago
<template>
<div class="main">
<div class="banner">
<div class="order-information">
<div class="header">接单中心</div>
<div class="condition-scarch">
<ul>
<li>
<div class="label">收货地址</div>
<el-cascader placeholder="请输入收获区域" size="large" :options="addressData" v-model="form.address">
</el-cascader>
<el-input style="width: 1.4583rem; margin-left: 0.0521rem" size="large" v-model="form.addressInfo"
placeholder="详细地址街道..." />
<div class="search-btn" @click="searchOrder">搜索</div>
</li>
<li>
<div class="label">成交价</div>
<div class="price-whel">
<div v-for="(item, index) in priceWhel" :key="index" @click="priceWhelChange(index)"
:class="priceWhelIndex === index ? 'active' : ''">
{{ item }}
</div>
</div>
</li>
<li>
<div class="label">收货时间</div>
<div class="price-whel">
<div v-for="(item, index) in addressTime" :key="index" @click="addressTimeChange(index)"
:class="addressTimeIndex === index ? 'active' : ''">
{{ item }}
</div>
</div>
</li>
<li id="tp-con"></li>
</ul>
</div>
</div>
<div class="tabs">
<div :class="activeNoT === 0 ? 'standard active' : 'standard'" @click="() => { activeNoT = 0 }">鲜花订单</div>
<div :class="activeNoT === 1 ? 'standard active' : 'standard'" @click="() => { activeNoT = 1 }"
style="margin-left: .0781rem;">蛋糕订单</div>
<Teleport v-if="isTp" to="#tp-con">
<div :class="active === 1 ? 'standard active' : 'standard'" @click="tabSort(1)">按配送时间</div>
<div :class="active === 2 ? 'standard active' : 'standard'" @click="tabSort(2)">按下单时间</div>
<div :class="active === 3 ? 'standard active sort' : 'standard sort'" @click="tabSort(3)">
按订单金额
<div v-if="active == 3" class="sort-box">
<div :class="activeSort == 0 ? 'ascending-orde active-sort' : 'ascending-orde'" @click="priceSort(0)">
<el-icon>
<CaretTop />
</el-icon>
</div>
<div @click="priceSort(1)" :class="activeSort == 1 ? 'descending active-sort' : 'descending'">
<el-icon>
<CaretBottom />
</el-icon>
</div>
</div>
<div v-else class="sort-box">
<div class="ascending-orde">
<el-icon>
<CaretTop />
</el-icon>
</div>
<div class="descending">
<el-icon>
<CaretBottom />
</el-icon>
</div>
</div>
</div>
</Teleport>
</div>
<div class="line-items" v-loading="loading">
<div class="item" v-for="(item, index) in orderList" :key="item.id" @click.stop="goToOrderInfo(item.orderNo)">
<div class="header">
<div class="address">
{{ item.province }} {{ item.city }} {{ item.district }}{{ item.street }}{{ item.detail }}
</div>
<div class="map-box" @click.stop="showMap(item)">
<div class="icon">
<el-icon>
<MapLocation />
</el-icon>
</div>
<div class="map">查看地图</div>
</div>
<div class="time">下单时间{{ item.createTime }}</div>
<div class="time" v-if="true"
style="margin-left: .0521rem;font-size: .0938rem;font-weight: 900;display: flex;align-items: center;"><img
src="/images/诚信.png" alt="" style="height: .0885rem; vertical-align: middle;">诚信保证金用户</div>
<img v-if="item.orderMode == 2" style="height: .2813rem;position: absolute;right: 0;top: -0.0313rem;"
src="/images/报价单_.png" alt="">
</div>
<div class="order-info">
<div class="image">
<img :src="item.image" style="width: 100%; height: 100%" />
<div class="tag" v-if="false">普通订单</div>
</div>
<div class="iine-info">
<div class="receipt-time">
<div class="label">
收货时间<span class="time">{{ item.deliveryDate }} {{ item.deliveryTime }}</span>
<span class="timeout">离接单结束还剩{{ setTimeOutEvent(item.deliveryDate, item.deliveryTime) }}</span>
</div>
</div>
<div class="goods-type">
<div class="label">
商品类型<span class="type">{{ item.productType }}</span>
</div>
</div>
<div class="content">
<div class="label">
商品总数<span class="number">{{ item.totalNum }}</span>
</div>
</div>
<div class="audit-information">
<div class="label">
商品描述<span class="information">
<!-- {{item.audit == 1 ? '需要完成下单方审核鲜花实拍图' : '审核'}} -->
{{ item.remark || '无备注' }}
</span>
</div>
</div>
<div class="order-description">
<div class="label">
备注<span class="description">{{ item.orderRemark || '无备注' }}</span>
</div>
</div>
<div class="order-description">
<div class="label">
贺卡<span class="description">{{ item.cardInfo || '无贺卡' }}</span>
</div>
</div>
</div>
<template v-if="true">
<div style="position: absolute;right: .1755rem; color: #8a8e99;width: .9375rem;text-align: center;">
<div style="color: #ff4e8d;font-size: .1563rem;">
{{ item.otPrice }}
</div>
<div style="margin-top: 10px;font-size: .0729rem;font-weight: 400;color: #575d6c;">已付款</div>
</div>
</template>
<div class="submit-box">
<placerBtn v-if="true" :goodsinfo="item" />
</div>
</div>
</div>
</div>
<el-empty v-if="!orderList.length" description="无数据" style="background-color: #fff" />
<div class="page">
<div style="display: flex; justify-content: center">
<el-pagination @current-change="currentChange" background layout="prev, pager, next" :total="total"
:page-size="pages.pageSize" />
</div>
<div class="txt">为了提高查询效率仅显示近期订单</div>
</div>
</div>
</div>
<delivery-map v-if="isMapFlog" @closeChange="closeChangeEvent" :goodsinfo="goodsInfo"></delivery-map>
</template>
<script lang="ts" setup>
import { onMounted, reactive, ref, toRefs, watch } from 'vue'
import { CaretTop, CaretBottom, MapLocation } from '@element-plus/icons-vue'
import { useCounterStore } from '@/stores/nav'
//@ts-ignore
import { regionData, CodeToText } from 'element-china-area-data' // 地址数据
import { getReceiveOrderList } from '@/server/orderApi'
import { linkNavigateTo } from '~/utils/util'
const userIndex = useCounterStore()
onMounted(() => {
userIndex.increment(4)
getReceiveOrderListEvent()
})
// ===============================
const isTp = ref(false)
onMounted(() => isTp.value = true)
// ===============================
const addressData: any = regionData // 解决地址数据报错的问题
const loading = <any>ref(false)
const priceWhel = <any>ref(['不限', '100元以下', '100-200元', '200-300元', '300-400元', '400元以上'])
const addressTime = <any>ref(['不限', '今天', '1-3天', '4-7天', '1周以上'])
const active = ref(0)
const activeSort = ref(0)
const form = <any>ref({
address: [],
addressInfo: '',
max: '', // 最高价
min: '', //最低价
maxTime: '', // 最晚收货时间
minTime: '', // 最早收货时间
deliveryTimeSort: false, // 收货时间排序
createTimeSort: false, // 下单时间排序
priceOrder: null, // 订单金额排序
})
const pages = <any>ref({
page: 1, // 页码
pageSize: 3, //每条页数
})
const orderList = <any>ref([])
const currentChange = (page: any) => {
console.log(page)
pages.value.page = page
getReceiveOrderListEvent()
}
// 成交价变化
const priceWhelIndex = <any>ref(0)
const priceWhelChange = (index: number) => {
if (priceWhelIndex.value === index) return
priceWhelIndex.value = index
console.log(index)
switch (index) {
case 0:
form.value.max = ''
form.value.min = ''
break
case 1:
form.value.max = 100
form.value.min = 0
break
case 2:
form.value.max = 200
form.value.min = 100
break
case 3:
form.value.max = 300
form.value.min = 200
break
case 4:
form.value.max = 400
form.value.min = 300
break
case 5:
form.value.max = ''
form.value.min = 400
break
}
getReceiveOrderListEvent()
}
const addressTimeIndex = <any>ref(0)
// 收货时间变化
const addressTimeChange = (index: number) => {
if (addressTimeIndex.value === index) return
addressTimeIndex.value = index
console.log(index)
switch (index) {
case 0:
form.value.maxTime = ''
form.value.minTime = ''
break
case 1:
form.value.maxTime = '今天'
form.value.minTime = '今天'
break
case 2:
form.value.maxTime = formatTime(3)
form.value.minTime = formatTime()
break
case 3:
form.value.maxTime = formatTime(7)
form.value.minTime = formatTime(4)
break
case 4:
form.value.maxTime = ''
form.value.minTime = formatTime(7)
break
}
getReceiveOrderListEvent()
}
const total = <any>ref(null)
const getReceiveOrderListEvent = async () => {
// console.log(CodeToText);
loading.value = true
const data: any = {
limit: pages.value.pageSize, // 每页条数
page: pages.value.page, // 页码
maxPrice: form.value.max, // 最大金额
minPrice: form.value.min, // 最小金额
minReceiveDate: form.value.minTime, // 最早收货时间
maxReceiveDate: form.value.maxTime, // 最晚收货时间
deliveryTimeSort: form.value.deliveryTimeSort, // 收货时间排序
createTimeSort: form.value.createTimeSort, // 下单时间排序
receiveAddressProvince: form.value.address.length ? CodeToText[form.value.address[0]] : '',
receiveAddressCity: form.value.address.length ? CodeToText[form.value.address[1]] : '',
receiveAddressDistrict: form.value.address.length ? CodeToText[form.value.address[2]] : '',
receiveAddressDetail: form.value.addressInfo,
}
console.log(data, 'data')
// 删除多余字段
for (const key in data) {
if (!data[key]) {
delete data[key]
}
}
if (active.value === 3) {
data.priceOrder = activeSort.value ? 'desc' : 'asc' // priceOrder:form.value.priceOrder,
}
const res = await getReceiveOrderList(data)
orderList.value = res.list
total.value = res.total
loading.value = false
console.log(res)
}
// 格式化时间
const formatTime = (DAY: any = 0) => {
const date = new Date()
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
date.setDate(day + DAY) // 设置日期对象的天数,会自动处理超出当月天数的情况
const updatedYear = date.getFullYear()
const updatedMonth = date.getMonth() + 1
const updatedDay = date.getDate()
return `${updatedYear}-${updatedMonth}-${updatedDay}`
}
const activeNoT = ref(0)
// 排序
const tabSort = (index: any) => {
if (active.value === index) return
active.value = index
switch (index) {
case 0:
form.value.deliveryTimeSort = false
form.value.createTimeSort = false
break
case 1:
form.value.deliveryTimeSort = true
form.value.createTimeSort = false
break
case 2:
form.value.deliveryTimeSort = false
form.value.createTimeSort = true
break
case 3:
form.value.deliveryTimeSort = false
form.value.createTimeSort = false
break
}
getReceiveOrderListEvent()
}
const priceSort = (index: any) => {
// form.value.priceOrder = 'asc' : form.value.priceOrder = 'desc'
activeSort.value = index
getReceiveOrderListEvent()
}
// 搜索订单
const searchOrder = () => {
getReceiveOrderListEvent()
console.log(form.value)
}
// 前往详情页
const goToOrderInfo = (id: any) => {
console.log(id)
linkNavigateTo('/homeIndex/orderdetails', { GoodsId: id })
}
// 接单
import { merchantOffers } from '@/server/orderApi'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const submitEvent = async (monry: any, orderNo: any) => {
const data: any = {
merId: userStore.$state.userInfos.id,
offerAmount: monry,
orderNo: orderNo,
}
console.log(data)
const res = await merchantOffers(data)
}
// 报价
import { ElMessage, ElMessageBox } from 'element-plus'
const instantlyQuote = async (monry: any, orderNo: any) => {
ElMessageBox.prompt('请输入金额', 'Tip', {
confirmButtonText: '确认',
cancelButtonText: '取消',
inputPattern: /^(?!$)(?=^[0-9]{1,6}$)(?!^0+$)^[1-9][0-9]{0,4}$|100000$/,
inputErrorMessage: '请输入正确的金额',
})
.then(({ value }) => {
if (value <= monry) {
return ElMessage({
type: 'error',
message: `涨价金额不能小于当前金额`,
})
}
const data: any = {
merId: userStore.$state.userInfos.id,
offerAmount: value,
orderNo: orderNo,
}
console.log(data)
merchantOffers(data)
ElMessage({
type: 'success',
message: `请求成功`,
})
})
.catch(() => {
// ElMessage({
// type: 'info',
// message: 'Input canceled',
// })
})
}
const isMapFlog = <any>ref(false)
const goodsInfo = <any>ref({})
const showMap = (item: any) => {
goodsInfo.value = item
isMapFlog.value = true
}
const closeChangeEvent = (e: boolean) => {
isMapFlog.value = e
}
// 计算时间
const setTimeOutEvent = (date: any, time: any) => {
// console.log(date,time,'deliveryTime');
if (time == '不限时段') {
time = '23:00'
}
const strTime = `${date} ${time}`
// console.log(strTime)
var currentTime = new Date()
var deliveryDate = new Date(strTime)
var difference = deliveryDate.getTime() - currentTime.getTime()
// console.log(difference, deliveryDate)
if (difference <= 0) {
return '已过期'
}
var days = Math.floor(difference / (1000 * 60 * 60 * 24))
difference -= days * (1000 * 60 * 60 * 24)
var hours = Math.floor(difference / (1000 * 60 * 60))
difference -= hours * (1000 * 60 * 60)
var minutes = Math.floor(difference / (1000 * 60))
difference -= minutes * (1000 * 60)
// console.log(days, hours, minutes, seconds)
if (days) {
return `${days}`
} else if (hours) {
return `${hours}小时`
} else {
; `${minutes}分钟`
}
}
</script>
<style lang="scss" scoped>
#tp-con {
&>* {
margin-left: .1563rem;
}
&>*:first-of-type {
margin-left: 0;
}
.sort {
display: flex;
justify-content: center;
align-items: center;
.sort-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-left: 0.0365rem;
color: #b1b6c1;
div {
line-height: 0;
display: inline-block;
}
.active-sort {
color: #4d4949;
}
.descending {
margin-top: -0.026rem;
}
}
}
}
.main {
width: 100%;
.banner {
width: 6.25rem;
margin: 0 auto;
.order-information {
width: 100%;
// height: 3.4896rem;
margin-top: 0.026rem;
background-color: #fff;
.header {
// background-color: #f3f4f8;
height: 0.2083rem;
color: #252b3a;
font-size: 0.0833rem;
line-height: 0.2083rem;
padding: 0 0.2604rem;
display: flex;
align-items: center;
font-weight: 700;
border-bottom: 1px solid #e1e1e3;
}
.header::before {
content: ' ';
display: block;
background-color: #ff4e8d;
width: 0.0156rem;
height: 0.0833rem;
margin-right: 0.026rem;
}
.condition-scarch {
padding: 0.1042rem 0.3542rem;
ul {
li {
list-style: none;
display: flex;
align-items: center;
color: #252b3a;
font-size: 0.0729rem;
margin: 0.1042rem 0;
.label {
width: 0.3646rem;
text-align: right;
}
.search-btn {
width: 0.4167rem;
height: 0.1771rem;
color: #fff;
text-align: center;
font-size: 0.0729rem;
line-height: 0.1771rem;
border-radius: 0.1042rem;
background: linear-gradient(90deg, #ff94d4 0%, #ffddbe 100%);
margin-left: 0.0521rem;
cursor: pointer;
}
.price-whel {
display: flex;
align-items: center;
div {
margin-right: 0.2135rem;
cursor: pointer;
}
.active {
color: #ff4e8d;
}
// div:focus,
// div:hover {
// color: #ff4e8d;
// }
}
}
}
}
}
.tabs {
width: 100%;
height: 0.2083rem;
background-color: #fff;
display: flex;
margin-top: 0.2344rem;
margin-bottom: 0.1302rem;
.standard {
width: 0.7292rem;
height: 100%;
color: #252b3a;
font-size: 0.0729rem;
text-align: center;
line-height: 0.2083rem;
border-radius: 0.0313rem;
cursor: pointer;
}
.active {
color: #fff;
background: linear-gradient(90deg, #ff94d4 0%, #ffddbe 100%);
}
.sort {
display: flex;
justify-content: center;
.sort-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-left: 0.0365rem;
color: #b1b6c1;
div {
line-height: 0;
display: inline-block;
}
.active-sort {
color: #fff;
}
.descending {
margin-top: -5px;
}
}
}
}
.line-items {
margin-top: 0.1719rem;
.item {
position: relative;
padding: 0.1198rem 0.1771rem;
background-color: #fff;
margin: 0.0521rem 0;
.header {
display: flex;
align-items: center;
.address {
width: 2.8125rem;
color: #252b3a;
font-size: 0.0833rem;
font-weight: 600;
overflow: hidden;
/* 隐藏溢出的部分 */
white-space: nowrap;
/* 将文本折叠成单行 */
text-overflow: ellipsis;
/* 添加省略号 */
}
.time {
color: #8a8e99;
font-size: 0.0625rem;
}
.map-box {
display: flex;
color: #ff4e8d;
margin-right: 0.0521rem;
cursor: pointer;
}
}
.order-info {
display: flex;
width: 100%;
padding: 0.0781rem 0 0 0.0521rem;
.image {
width: 0.7292rem;
height: 0.7292rem;
background-color: #d9d9d9;
position: relative;
.tag {
position: absolute;
bottom: 0;
width: 100%;
height: 0.125rem;
color: #fff;
text-align: center;
line-height: 0.125rem;
background: linear-gradient(90deg, #ff94d4 0%, #ffddbe 100%);
}
}
.iine-info {
// width: 4.1667rem;
margin-left: 0.0521rem;
display: flex;
flex-direction: column;
justify-content: space-between;
.label {
color: #8a8e99;
font-size: 0.0625rem;
}
.receipt-time {
.time {
color: #ff4e8d;
font-size: 0.0729rem;
font-weight: 600;
margin-right: 0.1042rem;
}
}
.goods-type {
.type {
color: #252b3a;
}
}
.content {
.number {
color: #ff4e8d;
font-size: 0.0729rem;
font-weight: 600;
}
}
.audit-information {
.information {
color: #252b3a;
}
}
.order-description {
.description {
color: #252b3a;
}
}
}
.submit-box {
position: absolute;
right: .1563rem;
bottom: .1563rem;
// height: 100%;
display: flex;
// flex-direction: column;
align-items: end;
margin-left: 0.2604rem;
.submit {
width: 0.5833rem;
height: 0.1667rem;
color: #fff;
margin: 0 10px;
text-align: center;
line-height: 0.1667rem;
background: linear-gradient(90deg, #ff94d4 0%, #ffddbe 100%);
}
.submit-tow {
width: 0.5833rem;
height: 0.1667rem;
color: #ff94d4;
margin: 0 10px;
text-align: center;
line-height: 0.1667rem;
border: 1px solid #ff94d4;
// background: linear-gradient(90deg, #ff94d4 0%, #ffddbe 100%);
}
}
}
}
}
.page {
height: 1.0417rem;
display: flex;
flex-direction: column;
justify-content: center;
align-content: center;
.txt {
text-align: center;
color: #252b3a;
margin-top: 0.1563rem;
}
}
}
}
</style>