food/src/components/QuestTabs.vue
air f7a52217a0 【类 型】:feat
【原  因】:根据学校要求 如站点改为地块管理 商铺改为单位
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2025-06-25 12:16:44 +08:00

299 lines
13 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>
<div class="p-15">
<!-- 退款设置弹出框 -->
<el-dialog :title="'设置退款金额'" :visible.sync="dialogVisible" :append-to-body="true" width="30%">
<el-form label-position="left">
<el-form-item label="退款金额" label-width="80px">
<el-input placeholder="输入金额,不可超过订单总金额" v-model="refundPrice">
<template slot="append"></template>
</el-input>
<div class="fc-w">{{ refundType === 'buyer' ? `买家申请退款金额${refundApply_price}元,此订单总额为${refundTotal_price}` :
`此订单总额为${refundTotal_price}`
}}</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="medium" @click="dialogVisible = false">关闭</el-button>
<el-button size="medium" type="danger" @click="refund">确认退款</el-button>
</span>
</el-dialog>
<!-- 任务tab -->
<el-collapse v-model="activeNames" accordion>
<template v-if="list.length != 0">
<el-collapse-item class="mainFontColor w-100 flex column mc ofa" v-for="(item, index) in list" :key="index" :name="item.id">
<template slot="title">
<div class="w-100" :class="activeNames === item.id ? 'fc-b fb' : ''">
<div class="l w-30">
订单ID{{ item.id }}
</div>
<div v-if="type == '未接单'" class="r w-70 fr p-r-15">
付款时间:{{ parseTime(item.paid_time, '{m}-{d} {h}:{i}') }}
</div>
<div v-else-if="type == '已接单'" class="r w-70 fr p-r-15">
接单时间:{{ parseTime(item.received_time, '{m}-{d} {h}:{i}') }}
</div>
<div v-else-if="type == '已发货'" class="r w-70 fr p-r-15">
发货时间:{{ parseTime(item.shipped_time, '{m}-{d} {h}:{i}') }}
</div>
<div v-else-if="type == '退款申请中'" class="r w-70 fr p-r-15">
申请时间:{{ parseTime(item.refundapply_time, '{m}-{d} {h}:{i}') }}
</div>
</div>
</template>
<el-descriptions direction="vertical" :column="3" border>
<el-descriptions-item label="状态">{{ item.shipment_status }}
</el-descriptions-item>
<el-descriptions-item label="订单号">{{ item.order_sn }}</el-descriptions-item>
<el-descriptions-item label="取餐号">{{ item.food_sn }}</el-descriptions-item>
<el-descriptions-item label="收货人">{{ item.receiver }}</el-descriptions-item>
<el-descriptions-item label="手机号">{{ item.tel }}</el-descriptions-item>
<el-descriptions-item label="收货地块">{{ item.receive_site_name }}</el-descriptions-item>
<el-descriptions-item label="总重量">{{ item.total_weight }}克</el-descriptions-item>
<el-descriptions-item label="总价">{{ item.total_price }}元</el-descriptions-item>
<el-descriptions-item label="货品总数">{{ item.total_num }}件</el-descriptions-item>
<el-descriptions-item label="订单详情" span="3">
<el-table v-for="spu, index in item.product_snapshot" :key="index" :data="spu.sku_arr" :stripe="true" class="w-100">
<el-table-column prop="sku_name" :label="spu.spu_name">
</el-table-column>
<el-table-column label="商品编号" min-width="140px" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.sku_number }}
</template>
</el-table-column>
<el-table-column label="数量" width="70px" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.sku_totol }}{{ scope.row.sku_unit }}
</template>
</el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item :label="item.refund_status == '未申请' ? '客户备注' : '退货缘由'" span="3">
{{ item.refund_status == '未申请' ? (item.remark || '无') : (item.refund_remark || '无') }}
</el-descriptions-item>
<el-descriptions-item label="操作" span="3">
<el-button-group v-if="type == '退款申请中'">
<el-button @click="setRefundItem(item, index, 'buyer'); dialogVisible = true"
:loading="refundIndex === index" :disabled="refundIndex === index" type="danger"
icon="iconfont icon-zhengque">
<font class="m-l-5">{{ refundIndex === index ? '退款中...' : '同意退款' }}</font>
</el-button>
<el-button @click="questAss(item.id, 'refund_status', '拒绝退')" type="warning" icon="iconfont icon-cuowu">
<font class="m-l-5">拒绝退款</font>
</el-button>
</el-button-group>
<el-button-group v-else-if="type == '未接单'">
<el-button @click="setRefundItem(item, index, 'seller'); dialogVisible = true"
:loading="refundIndex === index" :disabled="refundIndex === index" type="danger"
icon="iconfont icon-cuowu">
<font class="m-l-5">{{ refundIndex === index ? '退款中...' : '取消订单' }}</font>
</el-button>
<el-button @click="orderPrint(index)" type="info" icon="iconfont icon-dayin">
<font class="m-l-5">打印小票</font>
</el-button>
<el-button @click="questAss(item.id, 'shipment_status', '已接单')" type="primary"
icon="iconfont icon-chengjie">
<font class="m-l-5">确认接单</font>
</el-button>
</el-button-group>
<el-button-group v-else-if="type == '已接单'">
<el-button @click="setRefundItem(item, index, 'seller'); dialogVisible = true"
:loading="refundIndex === index" :disabled="refundIndex === index" type="danger"
icon="iconfont icon-cuowu">
<font class="m-l-5">{{ refundIndex === index ? '退款中...' : '取消订单' }}</font>
</el-button>
<el-button @click="orderPrint(index)" type="info" icon="iconfont icon-dayin">
<font class="m-l-5">打印小票</font>
</el-button>
</el-button-group>
<el-button-group v-else-if="type == '已发货'">
<template v-for="plane in planes">
<el-button v-if="plane.id===item.by_plane_id" @click="handlerRouterPlane(`/planes/index/${plane.id}/${plane.name}`)" type="primary" icon="iconfont icon-wurenji">
<font class="m-l-5">{{ plane.name }}</font>
</el-button>
</template>
</el-button-group>
</el-descriptions-item>
</el-descriptions>
</el-collapse-item>
</template>
<div v-else class="p-t-60 p-b-60 seatFontColor fc">
<i class="iconfont icon-meiyoushuju f-s-100"></i>
<div>空空如也</div>
</div>
</el-collapse>
</div>
</template>
<script>
import { parseTime } from '@/utils/index'
import { questAss, refund } from '@/utils/api/table'
export default {
data () {
return {
activeNames: [],
dialogVisible: false, // 弹出窗口 显隐
refundIndex: null, // 标记 索引 操作对应索引的按钮ui样式等
tempRefundIndex: null,
refundTotal_price: null, // 退款订单的总额
refundApply_price: null, // 客户申请退款 的金额
refundPrice: null, // 退款额 ps:传订单总价 为退款的默认值
refundOrder_sn: null, // 退款订单号
refundShop_id: null, // 退款单位id
refundType: null // 退款类型
}
},
props: {
list: {
type: Array,
required: true
},
type: {
type: String,
required: true,
default: ''
}
},
computed: {
planes () {
const planes = this.$store.state.airList
if (planes.length > 0) {
return planes
}
return []
}
},
methods: {
parseTime, // 时间戳格式化
questAss, // 修改订单
/**
* 跳转到执行飞机的控制页面
* @param path 飞机控制页面路由
*/
handlerRouterPlane (path) {
this.$router.push(path)
this.$emit('close-drawer')
},
/**
* 封装退款函数 同步后续操作
*/
async refund () {
const res = await refund(this.refundOrder_sn, this.refundShop_id, this.refundPrice, this.refundType)
if (res.data.status === 1) { // 退款申请成功时
this.dialogVisible = false // 退款弹出框 关闭
this.refundIndex = this.tempRefundIndex // 标记退款订单 的索引 方便做ui样式
}
},
/**
* 退款事件 设置对应订单信息 到“标记退款订单”
* @param item 订单信息
* @param index 订单索引
* @param refundType 退款类型 'buyer'买家申请 'seller'卖家主动
*/
setRefundItem (item, index, refundType) {
this.tempRefundIndex = index
this.refundTotal_price = Number(item.total_price) + Number(item.transport_price) + Number(item.pack_price)
this.refundApply_price = item.apply_price
if (refundType === 'buyer') { // 如果买家申请 默认退款表单显示买家申请值
this.refundPrice = item.apply_price
} else { // 否则 主动退 默认退款表单 显示为退款额上限 即订单总价+打包费+运费
this.refundPrice = Number(item.total_price) + Number(item.transport_price) + Number(item.pack_price)
}
this.refundOrder_sn = item.order_sn
this.refundShop_id = item.shop_id
this.refundType = refundType
},
/**
* @description: 通过蓝牙打印机并打印小票
* @param {number} index 订单列表下标索引
*/
orderPrint (index) {
// 订单文本编辑
// console.log(this.list[index])
// let con
// con = '无人机外卖送餐#' + this.list[index].food_sn + '\n\n'
// this.btPrint(con, '10', '1')
// con = ''
// con += '------------客户信息------------\n'
// con += '昵称:' + this.list[index].name + '\n'
// const tel = this.list[index].tel.substr(0, 3) + '****' + this.list[index].tel.substr(7)
// con += '电话:' + tel + '\n\n'
// con += '------------订单信息------------\n'
// this.btPrint(con, '0', '0')
// con = ''
// con += '取餐号:' + this.list[index].food_sn + '\n'
// this.btPrint(con, '31', '0')
// con = ''
// con += '单号:' + this.list[index].order_sn + '\n'
// con += '收货地块:' + this.list[index].receive_site_name + '\n'
// con += '下单时间:' + this.parseTime(this.list[index].addtime) + '\n\n'
// if (this.list[index].remark !== '') {
// con += '------------客户备注------------\n'
// con += this.list[index].remark + '\n\n'
// }
// con += '--------------商品--------------\n'
// this.list[index].products.forEach(element => {
// con += 'ID' + element.pid + '\n'
// con += '品名:' + element.name + '\n'
// if (element.pro_buff !== '') {
// con += '规格: ' + element.pro_buff + '\n'
// }
// con += '数量:' + element.num + '\n'
// con += '单价:' + element.price + '\n'
// con += '················\n'
// })
// con += '货品总数:' + this.list[index].product_num + '\n'
// con += '货品总额:' + this.list[index].price + '\n\n'
// con += '---------加盟无人机送餐---------\n'
// this.btPrint(con, '0', '0')
// con = ''
// var data = 'https://flicube.com'
// var align = 1
// var model = 49
// var size = 32
// var eclevel = 50
// BTPrinter.printQRCode(function (data) {
// console.log('Success')
// console.log(data)
// }, function (err) {
// console.log('Error')
// console.log(err)
// }, data, align, model, size, eclevel)
// con += '\n请扫上列二维码关注我们\n\n\n'
// this.btPrint(con, '0', '1')
},
/**
* @description: cordova 打印api接口
* @param {string} str 内容
* @param {string} size 字体大小预设
* @param {string} algin 对齐
*/
btPrint (str, size = '0', align = '0') {
// BTPrinter.printTitle(function (data) {
// console.log('Success')
// console.log(data)
// }, function (err) {
// console.log('Error')
// console.log(err)
// }, str, size, align)// string, size, align
}
},
watch: {
list () {
this.refundIndex = null
this.tempRefundIndex = null
}
},
created () {
}
}
</script>
<style lang="scss" scoped>
@import "@/styles/theme.scss";
.orterTit {
display: flex;
justify-content: space-between;
}
</style>