Commit e57c8e76 authored by lihui's avatar lihui

fix: bug 8月2日

parents 114b91a0 704ca965
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -19,5 +19,6 @@ module.exports = {
API_INTERNAL_URI: API_INTERNAL_URI[env],
PANDORA_URI: PANDORA_URI[env],
GOODS_URI: API_INTERNAL_URI[env],
WITHDRAWAL_URI: API_INTERNAL_URI[env]
WITHDRAWAL_URI: API_INTERNAL_URI[env],
GROUPMEAL_URI: API_INTERNAL_URI[env],
};
const GROUPMEAL_URI = require("../config.js").GROUPMEAL_URI;
const req = require("../utils/request").httpReq;
// 获取订单管理列表
exports.getOrderList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 获取主页配送列表
exports.getList = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/list_day_deliverer_conf`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 获取配送列表
exports.getDelivererList = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/list_day_deliverer`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 添加骑手
exports.getAddDeliverer = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/add_deliverer`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 分配骑手
exports.getSaveDeliverer = async ctx => {
const opts = {
url: `${GROUPMEAL_URI}/order/deliverer/save_day_deliverer`,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 获取活动名称
exports.getMarketingList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/marketing_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 获取商品名称
exports.getGoodsList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/goods_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 获取自提点
exports.getSubShopList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/sub_shop_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 导出订单
exports.orderExport = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_export`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 打印订单
exports.orderPrint = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_print`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 订单退款列表
exports.orderItemList = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_item_list`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
// 订单退款列表
exports.orderRefund = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_refund`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body
};
ctx.body = await req(ctx, opts);
};
// 订单驳回
exports.orderRefundReject = async ctx => {
const url = `${GROUPMEAL_URI}/order/background/order_refund_reject`;
const opts = {
url,
method: "GET"
};
ctx.body = await req(ctx, opts);
};
......@@ -7,6 +7,7 @@ const role = require('./controllers/role')
const life = require('./controllers/life-no');
const goods = require('./controllers/goods');
const withdrawal = require('./controllers/withdrawal');
const groupmeal = require('./controllers/groupmeal');
const router = Router();
const API_VERSION = "/api/v1";
......@@ -62,6 +63,23 @@ router.post(`${API_VERSION}/merchant/lifeinner/life_info`, life.get_life_info)
router.get(`${API_VERSION}/merchant/lifeinner/life_list`, life.get_life_list)
//用户
router.post(`${API_VERSION}/merchant/authority/get_user_info`, user.getUser_detail)
// 团餐运营--配送
router.post(`${API_VERSION}/order/deliverer/list_day_deliverer_conf`, groupmeal.getList)
router.post(`${API_VERSION}/order/deliverer/list_day_deliverer`, groupmeal.getDelivererList)
router.post(`${API_VERSION}/order/deliverer/add_deliverer`, groupmeal.getAddDeliverer)
router.post(`${API_VERSION}/order/deliverer/save_day_deliverer`, groupmeal.getSaveDeliverer)
// 订单管理
router.get(`${API_VERSION}/order/background/order_list`, groupmeal.getOrderList);
router.get(`${API_VERSION}/order/background/marketing_list`, groupmeal.getMarketingList);
router.get(`${API_VERSION}/order/background/goods_list`, groupmeal.getGoodsList);
router.get(`${API_VERSION}/order/background/sub_shop_list`, groupmeal.getSubShopList);
router.get(`${API_VERSION}/order/background/order_export`, groupmeal.orderExport);
router.get(`${API_VERSION}/order/background/order_export`, groupmeal.orderExport);
router.get(`${API_VERSION}/order/background/order_print`, groupmeal.orderPrint);
router.get(`${API_VERSION}/order/background/order_item_list`, groupmeal.orderItemList);
router.get(`${API_VERSION}/order/background/order_refund_reject`, groupmeal.orderRefundReject);
router.post(`${API_VERSION}/order/background/order_refund`, groupmeal.orderRefund);
// 钱包提现审核 wallet/background/apply_detail
router.get(`${API_VERSION}/get_withdrawal_apply_list`, withdrawal.getApplyList)
......
.goods {
width: 100%;
height: 100%;
padding: 0 30px;
.header {
text-align: right;
margin-bottom: 30px;
}
.dioFor {
margin-left: 5%;
width: 70%;
}
.diotab {
margin-left: 5%;
margin-top: 10px;
}
.dialog-footer {
display: flex;
align-items: center;
justify-content: center;
}
.commodity_list {
margin-top: 30px;
}
.pagination {
margin-top: 30px;
}
}
<template>
<Layout>
<el-card class="goods">
<div class="header">
<el-button type="primary" @click="assignDeliverer"
>分配配送员</el-button
>
<el-button type="primary" @click="dialogFormAdd = true"
>添加配送员</el-button
>
</div>
<el-table :data="distribList" border stripe style="width: 100%">
<el-table-column
align="center"
prop="activeName"
label="活动名称"
width="width"
>
</el-table-column>
<el-table-column align="center" label="配送员数量" width="width">
<template #default="scope">
{{ scope.row.list.length }}
</template>
</el-table-column>
<el-table-column
align="center"
prop="deliverer_name"
label="配送人员"
width="width"
>
<template #default="scope">
{{ scope.row.list.map((item) => item.deliverer_name).join("、") }}
</template>
</el-table-column>
<el-table-column prop="prop" label="操作" width="width" align="center">
<template #default="scope">
<el-button type="primary" @click="handleModify(scope.row)"
>修改</el-button
>
<el-button
type="primary"
v-show=scope.row.url
@click="handleDownload(scope.row.url)"
>下载配送路线</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 页码区 -->
<Pagination
@current-change="handleCurrentChange"
v-model:current-page="page"
:page-size="pageSize"
:total="total"
></Pagination>
<!-- 添加配送员弹框 -->
<el-dialog
title="添加配送员"
v-model="dialogFormAdd"
width="70%"
:show-close="false"
>
<el-form class="dioFor" :model="addDeliverer" :rules="rules">
<el-form-item label="姓名" label-width="100px" prop="name">
<el-input
v-model="addDeliverer.name"
maxlength="10"
type="text"
show-word-limit
clearable
autocomplete="off"
@input="
addDeliverer.name = $event
.replace(/[^a-z0-9A-Z\u4e00-\u9fa5()()\\-]+/g, '')
.replace(/\s/g, '')
"
></el-input>
</el-form-item>
<el-form-item
label="配送上限"
label-width="100px"
prop="max_capacity"
>
<el-input
v-model.number="addDeliverer.max_capacity"
onkeyup="value=value.replace(/[^\d]/g,'')"
clearable
autocomplete="off"
@input="
addDeliverer.max_capacity = $event
.replace(/[^a-z0-9A-Z\u4e00-\u9fa5()()\\-]+/g, '')
.replace(/\s/g, '')
"
></el-input>
</el-form-item>
<el-form-item
label="最小配送量"
label-width="100px"
prop="min_capacity"
>
<el-input
v-model.number="addDeliverer.min_capacity"
onkeyup="value=value.replace(/[^\d]/g,'')"
clearable
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="配送工具" label-width="100px" prop="tool_type">
<el-select
v-model="addDeliverer.tool_type"
clearable
placeholder="请选择配送工具"
>
<el-option label="电动车" value="1"></el-option>
<el-option label="摩托车" value="2"></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="addCancel">取 消</el-button>
<el-button type="primary" @click="addSave">保 存</el-button>
</span>
</template>
</el-dialog>
<!-- 分配配送员弹框 -->
<el-dialog
title="分配配送员"
v-model="dialogFormAssign"
width="70%"
:show-close="false"
>
<el-form class="dioFor">
<el-form-item label="活动名称" label-width="100px">
<el-select
v-model="selectActivity"
:disabled="isEdit"
clearable
filterable
>
<el-option :label="item.label" :value="item.value" v-for="item in marketingList" :key="item.value"></el-option>
</el-select>
</el-form-item>
<span class="dioFor">已选:{{ multipleSelection.length }}人</span>
<el-table
ref="multipleTable"
class="diotab"
align="center"
:data="deliverer"
max-height="300"
border
size="small"
style="width: 100%"
@selection-change="selectGoodsChange"
>
<el-table-column
width="60"
align="center"
type="selection"
>
</el-table-column>
<el-table-column
align="center"
prop="deliverer_name"
label="配送员姓名"
>
</el-table-column>
<el-table-column
align="center"
prop="deliverer_max_capacity"
label="配送上限"
width="130"
>
</el-table-column>
<el-table-column
align="center"
prop="deliverer_min_capacity"
label="最小配送量"
>
</el-table-column>
<el-table-column
align="center"
prop="deliverer_tool_type"
label="配送工具"
>
<template #default="scope">
{{scope.row.deliverer_tool_type==0 ? "电动车" : "摩托车"}}
</template>
</el-table-column>
</el-table>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="assignCancel">取 消</el-button>
<el-button type="primary" @click="save">保 存</el-button>
</span>
</template>
</el-dialog>
</el-card>
</Layout>
</template>
<script>
import Layout from "../layout/index.vue";
import Pagination from "../components/Pagination/index.vue";
import {
getDelivererList,
getList,
getSaveDeliverer,
getAddDeliverer,
getMarketingList
} from "../../../service/Groupmeal/groupmeal";
import { ElMessage } from "element-plus";
export default {
name: "Distrib",
components: {
Layout,
Pagination
},
data() {
return {
rules: {
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
max_capacity: [
{ required: true, message: "请填写配送上限", trigger: "blur" },
// { type: "number", message: "请填写数值哦", trigger: "change" },
],
min_capacity: [
{ type: "number", message: "请填写数值哦", trigger: "change" },
],
},
dialogFormAdd: false,
// 列表
distribList: [],
// 添加配送员弹框
addDeliverer: {
name: "",
max_capacity: "", //配送上限
min_capacity: "", //最小配送量
tool_type: [], //配送工具
},
//分配配送员弹框
dialogFormAssign: false,
deliverer: [],
multipleSelection: [],
selectActivity: "", //活动下拉框
total: 0,
page: 1,
pageSize: 20,
isEdit: false,
marketingList:[]
};
},
created() {
this.getList();
this.getDelivererList();
this.getMarketingList()
},
methods: {
selectGoodsChange(val) {
this.multipleSelection = val;
},
// 页码变化
handleCurrentChange(e) {
this.page = e;
this.getList();
},
// 清空
resetDate() {
// 添加配送员弹框
(this.addDeliverer = {
name: "",
max_capacity: "", //配送上限
min_capacity: "", //最小配送量
tool_type: [], //配送工具
}),
this.deliverer= [],
this.multipleSelection = [];
this.selectActivity = ""; //活动下拉框
},
// 获取主页列表
async getList() {
const {page, pageSize} = this
const params={
page,
pageSize
}
try {
const res = await getList(params);
this.distribList = res.response.list;
this.total = res.response.total;
} catch (error) {
console.log(error);
}
},
// 添加配送员
async addSave() {
const { name, max_capacity, min_capacity, tool_type } = this.addDeliverer;
if (!name) return ElMessage("请填写配送员姓名");
if (!max_capacity) return ElMessage("请填写配送上限");
if (min_capacity !== '' && min_capacity <= 0) return ElMessage("最小配送量不能为0或小于0");
if (!min_capacity) return ElMessage("请填写最小配送量");
if (!tool_type) return ElMessage("请选择配送工具");
const params = {
name,
max_capacity: +max_capacity,
min_capacity: +min_capacity,
tool_type: +tool_type,
};
try {
const {code, reason} = await getAddDeliverer(params);
if(code !== 0) return this.$message.error(reason || "添加配送员失败")
ElMessage("添加配送员成功");
this.getDelivererList();
this.dialogFormAdd = false;
this.addDeliverer = {
name: "",
max_capacity: "", //配送上限
min_capacity: "", //最小配送量
tool_type: [], //配送工具
};
} catch (error) {
ElMessage("请求添加配送员失败");
}
},
// 添加的取消
addCancel(){
this.dialogFormAdd = false
this.resetDate()
},
// 分配配送员
assignDeliverer() {
this.dialogFormAssign = true;
this.getDelivererList();
this.multipleSelection = [];
this.deliverer = []
this.isEdit = false
},
// 修改
async handleModify(row) {
this.dialogFormAssign = true;
const { code } = row;
this.selectActivity = code;
console.log(code);
try {
const res = await getDelivererList({ code});
this.deliverer = res.response;
this.isEdit = true;
this.getList();
this.$nextTick(() => {
this.$refs.multipleTable.clearSelection();
this.deliverer.forEach((row) => {
if (row.checked) {
this.$refs.multipleTable.toggleRowSelection(row, true);
}
});
});
} catch (error) {
console.log(error);
}
},
// 下载路线
handleDownload(url) {
url && window.open("http://bp-dev.ini.yidian-inc.com" + url)
console.log(url)
},
// 分配保存
async save() {
const { selectActivity, multipleSelection } = this;
const uids = multipleSelection.map((item) => item.deliverer_id);
if (!selectActivity) return ElMessage("请选择活动姓名");
// if (!uids.length) return this.$message.info("请至少选择一名骑手");
try {
const {code, reason} = await getSaveDeliverer({ code: selectActivity, uids: uids.join(",") });
if(code !== 0) return this.$message.error(reason || (this.isEdit ? "修改配送员失败":"分配配送员失败"))
ElMessage(this.isEdit ? "修改配送员成功":"分配配送员成功");
this.dialogFormAssign = false;
this.isEdit = false;
this.getList();
this.resetDate();
} catch (error) {
ElMessage("请求分配配送员失败");
}
},
// 分配取消
assignCancel(){
this.dialogFormAssign = false
this.getDelivererList()
this.resetDate()
},
// 活动名称列表
async getMarketingList() {
try {
const res = await getMarketingList();
this.marketingList = res.result.map(item => {
return {
value: item.marketing_id,
label: item.marketing_name
}
})
} catch (error) {
console.log(error)
}
},
// 分配配送员列表
async getDelivererList() {
try {
const res = await getDelivererList();
// this.deliverer.code = res.response.code;
this.deliverer = res.response;
console.log(this.deliverer);
} catch (error) {
console.log(error);
}
},
},
};
</script>
<style lang="less" src="./index.less" scope>
</style>
\ No newline at end of file
<template>
<el-dropdown>
<div class="user-info">
<el-avatar
:src="userInfo.avatar || DEFAULT_AVATAR"
size="small"
></el-avatar>
<span class="user-name">{{userInfo.name}}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<i class="el-icon-message"></i>
{{userInfo.email}}
</el-dropdown-item>
<el-dropdown-item>
<span><a
class="link"
href="//pandora.yidian-inc.com/"
>返回pandora工具平台</a></span>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<script>
import { mapState } from 'vuex'
import { HEADER_CONFIG } from '@/config/pageconfig';
export default {
computed: mapState({
userInfo: state => (state.userInfo || {}),
}),
data () {
return {
DEFAULT_AVATAR: HEADER_CONFIG.miscellaneous.defaultAvatar,
};
},
};
</script>
<style lang="less" scoped>
.user-info {
display: flex;
align-items: center;
}
.user-name {
margin-left: 12px;
color: #fff;
}
</style>
const headerConfig = [
{
name: "订单管理",
path: "/op/groupmeal/orderManagement"
},
{
path: '/op/groupmeal/distrib',
name: '配送员管理'
},
];
export default headerConfig;
\ No newline at end of file
<template>
<div id="pageheader">
<div class="line"></div>
<el-menu
class="header-menu"
mode="horizontal"
:router="true"
background-color="#545c64"
text-color="#fff"
:default-active="activeMenu"
active-text-color="#ffd04b"
unique-opened
>
<el-menu-item
v-for="item in headerConfig"
:index="item.path"
:key="item.path"
>
{{ item.name }}
</el-menu-item>
<el-menu-item
key="usermenu"
class="user-menu"
>
<user></user>
</el-menu-item>
</el-menu>
</div>
</template>
<script>
import headerConfig from "./config";
import User from "./User.vue";
export default {
name: "PageHeader",
components: {
User
},
data () {
return {
headerConfig
};
},
computed: {
activeMenu () {
return this.$route.path;
}
},
beforeMount () { },
methods: {}
};
</script>
<style lang="less">
</style>
<template>
<div class="block">
<el-pagination
class="pagination"
layout="prev, pager, next, jumper, ->,page , total"
v-bind="$attrs"
v-on="$listener"
>
</el-pagination>
</div>
</template>
<script>
export default {
name: 'Pagination'
};
</script>
<style lang="less">
.block {
margin-top: 50px;
}
</style>
.layout {
display: flex;
flex-direction: column;
height: 100%;
}
.main {
flex: 1;
}
<template>
<div class="layout">
<!-- 页面公共 header -->
<page-header class="page-header"></page-header>
<!-- 页面主体部分 -->
<div class="main">
<slot></slot>
</div>
</div>
</template>
<script>
import PageHeader from '../components/PageHeader';
export default {
components: { PageHeader },
};
</script>
<style lang="less" src="./index.less"></style>
.orderManage {
padding: 30px;
box-sizing: border-box;
}
.tabHead{
margin-bottom:10px;
}
.exportForm,.exportBtn{
text-align:center;
}
.refundBtnGroup {
display: block;
text-align: center;
}
.refundCon /deep/ .el-row {
margin-bottom: 15px;
display: flex;
align-items: center;
}
\ No newline at end of file
<template>
<Layout>
<div class="orderManage">
<!-- 查询栏 -->
<el-form
:inline="true"
:model="orderQueryObj"
ref="ruleForm"
class="demo-form-inline"
>
<el-form-item label="活动名称:" prop="marketing_id">
<el-select
v-model="orderQueryObj.marketing_id"
placeholder="请选择"
@change="activityNameSel"
@focus="activityNameFocus"
filterable
>
<el-option
v-for="item in activityNameArr"
:key="item.marketing_id"
:label="item.marketing_name"
:value="item.marketing_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单状态:" prop="order_status">
<el-select v-model="orderQueryObj.order_status" placeholder="请选择">
<el-option
v-for="item in orderStatusArr"
:key="item.value"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="商品名称:" prop="goods_id">
<el-select
v-model="orderQueryObj.goods_id"
placeholder="请选择"
filterable
>
<el-option
v-for="item in tradeNameArr"
:key="item.goods_id"
:label="item.goods_name"
:value="item.goods_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="收货人:" prop="cust_user">
<el-input
placeholder="请输入收货人姓名或手机号"
prefix-icon="el-icon-search"
v-model="orderQueryObj.cust_user"
></el-input>
</el-form-item>
<el-form-item label="订单编号:" prop="order_id">
<el-input
placeholder="请输入订单号"
prefix-icon="el-icon-search"
v-model="orderQueryObj.order_id"
></el-input>
</el-form-item>
<el-form-item label="自提点:" prop="sub_shop_id">
<el-select
v-model="orderQueryObj.sub_shop_id"
placeholder="请选择"
filterable
>
<el-option
v-for="item in selLiftPoinArr"
:key="item.sub_shop_id"
:label="item.sub_shop_name"
:value="item.sub_shop_id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="resetOrder('ruleForm')">重置</el-button>
<el-button type="primary" @click="searchOrder">搜索</el-button>
</el-form-item>
</el-form>
<!-- Tabs标签页 -->
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-row class="tabHead">
<el-col :span="12">
<div>商品共计:{{ goodsNum }}</div>
</el-col>
<el-col :span="12" style="text-align: right">
<el-button @click="exportOrder">导出</el-button>
<el-button @click="printOrder">打印</el-button>
</el-col>
</el-row>
<el-tab-pane label="全部" name="all">
<el-table :data="orderTableData" border stripe style="width: 100%">
<el-table-column prop="marketing_name" label="活动名称">
<template #default="scope">
<div>
{{ scope.row.marketing_name }}({{ scope.row.marketing_id }})
</div>
</template>
</el-table-column>
<el-table-column
prop="order_id"
label="订单号"
width
></el-table-column>
<el-table-column
prop="order_status_text"
label="订单状态"
></el-table-column>
<el-table-column prop="order_item" label="商品信息">
<template #default="scope">
<div v-for="(item, index) in scope.row.order_item" :key="index">
{{ item.goods_name
}}<span style="color: red"> * {{ item.goods_num }} </span>
</div>
</template>
</el-table-column>
<el-table-column prop="user_name" label="收货人">
<template #default="scope">
<div>
<span
>{{ scope.row.user_name }}({{ scope.row.user_nick }})</span
>
<p>{{ scope.row.user_mobile }}</p>
</div>
</template>
</el-table-column>
<el-table-column
prop="sub_shop_name"
label="自提点"
></el-table-column>
<el-table-column prop="comment" label="备注"></el-table-column>
<el-table-column prop="pay_time" label="支付时间"></el-table-column>
<el-table-column prop="payment" label="支付金额">
<template #default="scope">
<div>
{{ scope.row.payment }}
<span v-show="scope.row.refund_amount"
>(已退¥{{ scope.row.refund_amount }})</span
>
</div>
</template>
</el-table-column>
<el-table-column
prop="discount_fee"
label="优惠金额"
></el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template #default="scope">
<el-button
type="text"
size="small"
@click="refund(scope.row)"
v-show="
scope.row.order_status == '2' ||
scope.row.order_status == '6' ||
scope.row.order_status == '8'
"
>退款</el-button
>
<el-button-group v-show="scope.row.order_status == '3'">
<el-button type="text" size="small" @click="agree(scope.row)"
>同意</el-button
>
<el-button type="text" size="small" @click="refuse(scope.row)"
>拒绝</el-button
>
</el-button-group>
</template>
</el-table-column>
</el-table>
<page
@current-change="handleCurrentChange"
:current-page="orderQueryObj.page"
:page-size="orderQueryObj.page_size"
:total="totalNum"
/>
</el-tab-pane>
<el-tab-pane label="售后" name="afterSale">
<!-- start -->
<el-table :data="orderTableData" border stripe style="width: 100%">
<el-table-column prop="marketing_name" label="活动名称">
<template #default="scope">
<div>
{{ scope.row.marketing_name }}({{ scope.row.marketing_id }})
</div>
</template>
</el-table-column>
<el-table-column
prop="order_id"
label="订单号"
width
></el-table-column>
<el-table-column
prop="order_status_text"
label="订单状态"
></el-table-column>
<el-table-column prop="order_item" label="商品信息">
<template #default="scope">
<div v-for="(item, index) in scope.row.order_item" :key="index">
{{ item.goods_name
}}<span style="color: red"> * {{ item.goods_num }} </span>
</div>
</template>
</el-table-column>
<el-table-column prop="user_name" label="收货人">
<template #default="scope">
<div>
<span
>{{ scope.row.user_name }}({{ scope.row.user_nick }})</span
>
<p>{{ scope.row.user_mobile }}</p>
</div>
</template>
</el-table-column>
<el-table-column
prop="sub_shop_name"
label="自提点"
></el-table-column>
<el-table-column prop="comment" label="备注"></el-table-column>
<el-table-column prop="pay_time" label="支付时间"></el-table-column>
<el-table-column prop="payment" label="支付金额">
<template #default="scope">
<div>
{{ scope.row.payment }}
<span v-show="scope.row.refund_amount"
>(已退¥{{ scope.row.refund_amount }})</span
>
</div>
</template>
</el-table-column>
<el-table-column
prop="discount_fee"
label="优惠金额"
></el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template #default="scope">
<el-button
type="text"
size="small"
@click="refund(scope.row)"
v-show="
scope.row.order_status == '2' ||
scope.row.order_status == '6' ||
scope.row.order_status == '8'
"
>退款</el-button
>
<el-button-group v-show="scope.row.order_status == '3'">
<el-button type="text" size="small" @click="agree(scope.row)"
>同意</el-button
>
<el-button type="text" size="small" @click="refuse(scope.row)"
>拒绝</el-button
>
</el-button-group>
</template>
</el-table-column>
</el-table>
<page
@current-change="handleCurrentChange"
:current-page="orderQueryObj.page"
:page-size="orderQueryObj.page_size"
:total="totalNum"
/>
<!-- end -->
</el-tab-pane>
</el-tabs>
<!-- 导出弹窗 -->
<el-dialog title="导出订单" width="25%" top="10%" v-model="exportShow">
<el-form-item class="exportForm" label>
<div style="margin-bottom: 15px">
请选择导出活动{{ exportType }}的表格类型
</div>
<a :href="exportURL1" style="margin-right: 10px"
><el-button type="primary" @click="exportShow = false"
>总表</el-button
></a
>
<a :href="exportURL2" style="margin-right: 10px"
><el-button type="primary" @click="exportShow = false"
>商品表</el-button
></a
>
<a :href="exportURL3"
><el-button type="primary" @click="exportShow = false"
>配送表</el-button
></a
>
<!-- <el-checkbox-group v-model="exportSel">
<el-checkbox
v-for="i in exportSelOpt"
:label="i.type"
:key="i.type"
>{{ i.name }}</el-checkbox
>
</el-checkbox-group> -->
</el-form-item>
<!-- <el-form-item class="exportBtn">
<el-button @click="exportShow = false">取消</el-button>
<a :href="exportURL" style="margin-left: 20px"><el-button type="primary" @click="exportShow = false">确定导出</el-button></a>
</el-form-item> -->
</el-dialog>
<!-- 退款弹窗 -->
<el-dialog title="退款" width="30%" top="10%" v-model="refundShow">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="margin-bottom: 15px"
>
全选
</el-checkbox>
<div
class="refundCon"
v-for="(item, index) in refundGoods"
:key="index"
>
<el-row>
<el-checkbox
class="check-wrap"
v-model="item.refundedGoodsSel"
:label="item.goods_name"
name="type"
></el-checkbox>
</el-row>
<el-row>
<el-col :span="6">单价:{{ item.price }}</el-col>
<el-col :span="6">数量:{{ item.goods_num }}</el-col>
<el-col :span="6">实付:{{ item.payment }}</el-col>
</el-row>
<el-row>
可退数量:
<el-input-number
v-model="item.refundableQuantity"
@change="handleChange"
:min="0"
:max="item.goods_num - item.refund_count"
></el-input-number>
</el-row>
<el-row>
退款金额(可退金额{{ item.amountToRefund }}元):
<el-input
v-model="item.amountToRefund"
style="width: 150px"
></el-input>
</el-row>
</div>
<template #footer>
<span class="dialog-footer refundBtnGroup">
<el-button @click="refundShow = false">取 消</el-button>
<el-button type="primary" @click="handleConfirmRefund"
>退款</el-button
>
</span>
</template>
</el-dialog>
</div>
</Layout>
</template>
<script>
import Layout from "../layout/index.vue";
import {
getOrderList,
getMarketingList,
getGoodsList,
getSubShopList,
orderPrint,
orderItemList,
orderRefundReject,
refundOrder,
getOrderExportURL,
} from "@/service/Groupmeal/groupmeal";
// import page from "../../components/Pagination.vue";
import page from "../components/Pagination/index.vue";
export default {
name: "orderManagement",
components: {
Layout,
page,
},
data() {
return {
// 查询
orderQueryObj: {
page: 1,
page_size: 10,
marketing_id: "", // 活动名称
order_status: "0", // 订单状态
goods_id: "", // 商品名称
cust_user: "", // 收货人
order_id: "", // 订单编号
sub_shop_id: "", // 自提点
},
// 下拉框数据
// 活动名称
activityNameArr: [],
// 订单状态
orderStatusArr: [
{
value: "0",
label: "全部",
},
{
value: "1",
label: "未支付",
},
{
value: "2",
label: "已支付",
},
{
value: "3",
label: "待退款",
},
{
value: "4",
label: "已退款",
},
{
value: "5",
label: "退款中",
},
{
value: "6",
label: "已拒绝",
},
{
value: "7",
label: "售后",
},
],
// 商品名称
tradeNameArr: [],
// 自提点
selLiftPoinArr: [],
activeName: "all", // Tabs标签页
goodsNum: "", // 商品总计
// 导出
exportShow: false,
exportType: "",
// exportSel: [],
// exportSelOpt: [
// { type: "1", name: "总表" },
// { type: "2", name: "商品表" },
// { type: "3", name: "配送表" },
// ],
// 表格数据
orderTableData: [],
totalNum: null, //总条数
// 退款
refundShow: false, // 退款状态
checkAll: false, // 全选
isIndeterminate: false,
refundGoods: [
{
refundedGoodsSel: false,
goods_name: "",
price: "", // 单价
goods_num: "", // 数量
payment: "", // 实付
refundableQuantity: "",
refundAmount: "",
amountToRefund: "",
},
],
};
},
computed: {
exportURL1() {
return getOrderExportURL(this.orderQueryObj.marketing_id, "1");
},
exportURL2() {
return getOrderExportURL(this.orderQueryObj.marketing_id, "2");
},
exportURL3() {
return getOrderExportURL(this.orderQueryObj.marketing_id, "3");
},
},
methods: {
activityNameFocus() {
this.getMarketingListMet();
},
// 获取活动名称
async getMarketingListMet() {
try {
const res = await getMarketingList();
this.activityNameArr = res.result;
} catch (error) {
this.$message.error("发生未知错误,请稍后再试一下吧~~~");
console.error(error);
}
},
// 活动名称的change事件 获取商品名称+获取自提点
async activityNameSel(val) {
this.orderQueryObj.goods_id = "";
const params = {
marketing_id: val,
};
const res = await getGoodsList(params); // 商品名称
this.getSubShopListMet(val) //自提点
// const res = await getSubShopList(params);
this.tradeNameArr = res.result;
// this.selLiftPoinArr = res.result;
},
// 获取自提点
async getSubShopListMet(params) {
try {
let marketing_id = ''
if(params){
marketing_id = params
}
const res = await getSubShopList({'marketing_id':marketing_id});
this.selLiftPoinArr = res.result;
} catch (error) {
this.$message.error("发生未知错误,请稍后再试一下吧~~~");
console.error(error);
}
},
// 重置
resetOrder(formName) {
this.$refs[formName].resetFields();
this.orderQueryObj.page = 1;
this.orderQueryObj.page_size = 10;
this.getOrderListMet(this.orderQueryObj);
},
// 搜索
searchOrder() {
this.orderQueryObj.page = 1;
this.orderQueryObj.page_size = 10;
this.getOrderListMet(this.orderQueryObj);
},
// 标签页切换
handleClick(targetName) {
if (targetName.props.name == "all") {
this.orderQueryObj.order_status = "0";
this.orderStatusArr[1].disabled = false;
this.orderStatusArr[2].disabled = false;
} else {
this.orderQueryObj.order_status = "7";
this.orderStatusArr[1].disabled = true;
this.orderStatusArr[2].disabled = true;
}
this.getOrderListMet(this.orderQueryObj);
},
// 导出
exportOrder() {
if (this.orderQueryObj.marketing_id === "") {
this.$message.error("请选择活动名称");
return;
}
this.exportShow = true;
this.exportType = this.orderQueryObj.marketing_id;
},
async printOrderMet(forcePrint) {
const params = {
marketing_id: this.orderQueryObj.marketing_id,
// marketing_id: "1NJETU",
force_print: forcePrint ? "1" : "",
};
const res = await orderPrint(params);
return res;
},
// 打印
async printOrder() {
if (this.orderQueryObj.marketing_id === "") {
this.$message.error("请选择活动名称");
return;
}
let res = await this.printOrderMet(false);
if (res.code === 0) {
this.$message({
type: "success",
message: "打印成功",
});
return;
}
if (res.code !== 5111040) {
if (res.reason) {
this.$message.error(res.reason);
} else {
this.$message.error("打印失败");
}
return;
}
if (res.reason) {
try {
await this.$confirm(res.reason, "打印", {
cancelButtonText: "取消",
confirmButtonText: "确定",
});
} catch (e) {
// 取消
return;
}
} else {
this.$message.error("打印失败");
}
res = await this.printOrderMet(true);
// if (res.code !== 0) {
// this.$message.error("打印失败");
// }
},
// 获取订单列表
async getOrderListMet() {
try {
const res = await getOrderList(this.orderQueryObj);
this.goodsNum = res.goods_num; // 商品共计
this.totalNum = res.count; // 商品总数
this.orderTableData = res.result;
} catch (error) {
this.$message.error("发生未知错误,请稍后再试一下吧~~~");
console.error(error);
}
},
//列表分页
// 页码变化
handleCurrentChange(e) {
this.orderQueryObj.page = e;
this.getOrderListMet();
},
// 拒绝
async refuse(val) {
try {
await this.$confirm("确定要拒绝退款么?", "拒绝", {
cancelButtonText: "取消",
confirmButtonText: "确定",
});
} catch (e) {
// 取消
return;
}
const params = {
order_id: val.order_id,
};
const res = await orderRefundReject(params);
if (res.code === 0) {
this.$message({
type: "success",
message: "订单已驳回",
});
} else {
this.$message.error(res.reason);
}
this.getOrderListMet();
},
// 同意
agree(val) {
this.refund(val);
},
// 全选
handleCheckAllChange(val) {
for (var i in this.refundGoods) {
this.refundGoods[i].refundedGoodsSel = val;
}
// this.isIndeterminate = false;
},
// 退款
async refund(val) {
this.refundShow = true;
this.checkAll = false;
this.refundGoods = [];
const params = {
order_id: val.order_id,
};
const res = await orderItemList(params);
this.refundGoods = res.result;
for (var i in res.result) {
this.refundGoods[i].refundableQuantity = Number(
res.result[i].goods_num - res.result[i].refund_count
);
this.refundGoods[i].payment = Number(
res.result[i].payment
//res.result[i].payment - res.result[i].refund_amount
);
// console.log( res.result[i]);
this.refundGoods[i].amountToRefund = Number(
res.result[i].payment - res.result[i].refund_amount
);
}
},
// 退款确认
async handleConfirmRefund() {
const isCheckAllSelected = () => this.refundGoods.refundedGoodsSel;
const getAllItems = () => this.refundGoods;
const getSelectedItems = () => {
const isSelected = ({ refundedGoodsSel }) => refundedGoodsSel;
return this.refundGoods.filter(isSelected);
};
const convertToNumber = (str) => {
return !Number.isNaN(parseFloat(str)) ? parseFloat(str) : 0;
};
const processRefundItem = (item) => {
return {
order_item_id: item.order_item_id,
refund_num: item.refundableQuantity || 0,
refund_amount: convertToNumber(item.amountToRefund),
};
};
const orderId = this.refundGoods[0].order_id;
let itemsToRefund = null;
if (isCheckAllSelected()) {
itemsToRefund = getAllItems();
} else {
itemsToRefund = getSelectedItems();
}
itemsToRefund = itemsToRefund.map(processRefundItem);
// if ((itemsToRefund.length = 0)) {
// this.$message.error("请选择退款商品");
// return;
// }
const res = await refundOrder(orderId, itemsToRefund);
if (res.code === 0) {
this.$message.success("退款成功");
this.refundShow = false;
return;
}
// this.refundShow = false;
this.$message.error(res.reason);
},
},
created() {
this.getMarketingListMet(); // 活动名称
this.getSubShopListMet(); // 自提点
this.getOrderListMet(); // table列表
},
};
</script>
<style lang="less" src="./index.less" scope></style>
<style lang="less" scoped>
.check-wrap{
/deep/ .el-checkbox__label {
white-space: normal;
word-break: break-all;
}
}
</style>
/**
* 团餐运营管理
*/
const groupmealRouters = [
{
path: "/op/groupmeal/orderManagement",
name: "orderManagement",
// redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/orderManagement")
},
{
path: "/op/groupmeal/distrib",
name: "Distrib",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/Distrib")
},
];
export default groupmealRouters;
\ No newline at end of file
......@@ -11,6 +11,7 @@ import ManageRole from "../pages/Role/manage-role.vue";
import RoleDetail from "../pages/Role/role-detail.vue";
import goodsRouter from "./Goods/index";
import withdrawalRoutes from "./Withdrawal/index";
import groupmealRouters from "./Groupmeal/index";
const routes = [
{
path: "/op/enterprise",
......@@ -96,7 +97,9 @@ const routes = [
// 商品管理路由
...goodsRouter,
// 钱包审核
...withdrawalRoutes
...withdrawalRoutes,
// 团餐运营
...groupmealRouters
];
console.log(routes);
......
import axios from "@/utils/request";
// 获取主页配送员列表
export async function getList (params) {
const res = await axios.post("/api/v1/order/deliverer/list_day_deliverer_conf",params);
return res;
}
// 获取分配配送员列表
export async function getDelivererList(params) {
const res = await axios.post(
"/api/v1/order/deliverer/list_day_deliverer",
params
);
return res;
}
// 添加配送员
export async function getAddDeliverer(params) {
const res = await axios.post("/api/v1/order/deliverer/add_deliverer", params);
return res;
}
// 分配配送员
export async function getSaveDeliverer(params) {
const res = await axios.post(
"/api/v1/order/deliverer/save_day_deliverer",
params
);
return res;
}
// 获取订单列表
export async function getOrderList(params) {
const res = await axios.get("/api/v1/order/background/order_list", {
params
});
return res;
}
// 获取活动名称
export async function getMarketingList() {
const res = await axios.get("/api/v1/order/background/marketing_list");
return res;
}
// 获取商品名称
export async function getGoodsList(params) {
const res = await axios.get("/api/v1/order/background/goods_list", {
params
});
return res;
}
// 获取自提点
export async function getSubShopList(params) {
const res = await axios.get("/api/v1/order/background/sub_shop_list",{
params
});
return res;
}
// 导出订单
export async function orderExport(params) {
const res = await axios.get("/api/v1/order/background/order_export", {
params
});
return res;
}
// 打印订单
export async function orderPrint(params) {
const res = await axios.get("/api/v1/order/background/order_print", {
params
});
return res;
}
// 订单退款列表
export async function orderItemList(params) {
const res = await axios.get("/api/v1/order/background/order_item_list", {
params
});
return res;
}
// 订单退款
export async function refundOrder(orderId, itemsToRefund) {
// const params = {
// order_id: orderId,
// refund_list: itemsToRefund
// };
const res = await axios.post("/api/v1/order/background/order_refund", {
order_id: orderId,
refund_list: itemsToRefund
});
return res;
}
// 订单驳回
export async function orderRefundReject(params) {
const res = await axios.get("/api/v1/order/background/order_refund_reject", {
params
});
return res;
}
// 导出订单
export function getOrderExportURL(eventId, type) {
var ENV;
if(process.env.NODE_ENV == "development"){
ENV = "http://bp-dev.ini.yidian-inc.com/"
}else{
ENV = "http://bp-test.ini.yidian-inc.com/"
}
return `${ENV}order/background/order_export?marketing_id=${eventId}&type=${type}`;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment