Commit ec4be6d4 authored by jisiyu's avatar jisiyu

add:商家管理

parent ca2eeb0e
......@@ -193,3 +193,54 @@ exports.updateMarketingList = async (ctx) => {
const res = await req(ctx, opts);
ctx.body = res;
};
// 商家列表
exports.otaList = async (ctx) => {
const url = `${GOODS_URI}/goods/background/ota_list`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body,
};
const res = await req(ctx, opts);
ctx.body = res;
};
// 商家列表-add
exports.addOta = async (ctx) => {
const url = `${GOODS_URI}/goods/background/add_ota`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body,
};
const res = await req(ctx, opts);
ctx.body = res;
};
// 商家列表-禁用
exports.deleteOta = async (ctx) => {
const url = `${GOODS_URI}/goods/background/delete_ota`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body,
};
const res = await req(ctx, opts);
ctx.body = res;
};
// 商家列表-修改
exports.updateOta = async (ctx) => {
const url = `${GOODS_URI}/goods/background/uodate_ota`;
const opts = {
url,
method: "POST",
json: true,
body: ctx.request.body,
};
const res = await req(ctx, opts);
ctx.body = res;
};
......@@ -64,6 +64,12 @@ router.post(`${API_VERSION}/get_addmarketing_list`, goods.getAddMarketingList);
router.post(`${API_VERSION}/get_find_goods_list`, goods.getFindGoodsList);
router.post(`${API_VERSION}/get_marketing_info`, goods.getMarketingInfo);
router.post(`${API_VERSION}/update_marketing_list`, goods.updateMarketingList);
router.post(`${API_VERSION}/otaList`, goods.otaList);
//商家管理
router.post(`${API_VERSION}/addOta`, goods.addOta);
router.post(`${API_VERSION}/deleteOta`, goods.deleteOta);
router.post(`${API_VERSION}/updateOta`, goods.updateOta);
//生活号
router.post(`${API_VERSION}/merchant/lifeinner/life_info`, life.get_life_info);
router.get(`${API_VERSION}/merchant/lifeinner/life_list`, life.get_life_list);
......
<template>
<Layout>
<el-card class="goods" v-loading="pageLoading">
<div class="header">
<el-button type="primary" @click="assignDeliverer"
>分配配送员</el-button
<Layout>
<el-card class="goods" v-loading="pageLoading">
<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 fit style="width: 100%">
<el-table-column align="center" prop="activeName" label="活动名称"></el-table-column>
<el-table-column align="center" label="配送员数量">
<template #default="scope">
{{ scope.row.list.length }}
</template>
</el-table-column>
<el-table-column align="center" prop="deliverer_name" label="配送人员">
<template #default="scope">
{{ scope.row.list.map((item) => item.deliverer_name).join("、") }}
</template>
</el-table-column>
<el-table-column prop="prop" label="操作" align="center" min-width="100">
<template #default="scope">
<el-button type="primary" @click="handleModify(scope.row)">修改</el-button>
<el-button type="primary" @click="downloadDeliveryRoute(scope.row)">下载配送路线</el-button>
<el-button type="primary" @click="getEmailRecord(scope.row)">发送记录</el-button>
</template>
</el-table-column>
</el-table>
<!-- 页码区 -->
<Pagination @current-change="handleCurrentChange" :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 @change="getSelectActivityInfo">
<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>
<!-- 发送邮件的dialog -->
<YDDialog
dialogTitle="下载配送路线"
cancelButtonText="关闭"
:dialogCenter="true"
:myDialogVisible="sendEmailDialogVisible"
cancelDialogMethodName="sendEmailDialogCancel"
confirmDialogMethodName="sendEmailDialogConfirm"
@sendEmailDialogCancel="sendEmailDialogCancel"
@sendEmailDialogConfirm="sendEmailDialogConfirm"
>
<el-button type="primary" @click="dialogFormAdd = true"
>添加配送员</el-button
<div class="emailContent">
<p>生成配送路线大概需要两分钟,生成完毕后会发送到您的邮箱,请填写接受邮箱(一点邮箱)</p>
<div class="emialInputWrapper">
<el-input
class="myInput"
v-model="myEmialInput"
placeholder="请输入邮箱地址"
:class="{
myInputRequire: isEmailRequire,
myInputError: emialHasError,
}"
></el-input>
<span>@yidian-inc.com</span>
</div>
</div>
</YDDialog>
<!-- 显示email发送情况的列表 -->
<YDDialog
dialogTitle="发送记录"
cancelButtonText="关闭"
:dialogCenter="true"
:isShowConfirmButton="false"
:myDialogVisible="showEmailTableDialogVisible"
cancelDialogMethodName="showEmailDialogCancel"
@showEmailDialogCancel="showEmailDialogCancel"
>
</div>
<el-table :data="distribList" border stripe fit style="width: 100%">
<el-table-column align="center" prop="activeName" label="活动名称">
</el-table-column>
<el-table-column align="center" label="配送员数量">
<template #default="scope">
{{ scope.row.list.length }}
</template>
</el-table-column>
<el-table-column align="center" prop="deliverer_name" label="配送人员">
<template #default="scope">
{{ scope.row.list.map(item => item.deliverer_name).join("、") }}
</template>
</el-table-column>
<el-table-column
prop="prop"
label="操作"
align="center"
min-width="100"
>
<template #default="scope">
<el-button type="primary" @click="handleModify(scope.row)"
>修改</el-button
>
<el-button type="primary" @click="downloadDeliveryRoute(scope.row)"
>下载配送路线</el-button
>
<el-button type="primary" @click="getEmailRecord(scope.row)"
>发送记录</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 页码区 -->
<Pagination
@current-change="handleCurrentChange"
: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
@change="getSelectActivityInfo"
>
<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>
<!-- 发送邮件的dialog -->
<YDDialog
dialogTitle="下载配送路线"
cancelButtonText="关闭"
:dialogCenter="true"
:myDialogVisible="sendEmailDialogVisible"
cancelDialogMethodName="sendEmailDialogCancel"
confirmDialogMethodName="sendEmailDialogConfirm"
@sendEmailDialogCancel="sendEmailDialogCancel"
@sendEmailDialogConfirm="sendEmailDialogConfirm"
>
<div class="emailContent">
<p>
生成配送路线大概需要两分钟,生成完毕后会发送到您的邮箱,请填写接受邮箱(一点邮箱)
</p>
<div class="emialInputWrapper">
<el-input
class="myInput"
v-model="myEmialInput"
placeholder="请输入邮箱地址"
:class="{
myInputRequire: isEmailRequire,
myInputError: emialHasError
}"
></el-input>
<span>@yidian-inc.com</span>
</div>
</div>
</YDDialog>
<!-- 显示email发送情况的列表 -->
<YDDialog
dialogTitle="发送记录"
cancelButtonText="关闭"
:dialogCenter="true"
:isShowConfirmButton="false"
:myDialogVisible="showEmailTableDialogVisible"
cancelDialogMethodName="showEmailDialogCancel"
@showEmailDialogCancel="showEmailDialogCancel"
>
<div
class="emailListContent"
v-loading="emailRecordsLoading"
element-loading-text="拼命加载中"
element-loading-spinner="el-icon-loading"
>
<el-table :data="emailListTableData" style="width: 100%">
<el-table-column prop="email" label="接收邮箱" width="180">
</el-table-column>
<el-table-column prop="sendTime" label="发送时间" width="180">
</el-table-column>
<el-table-column prop="status" label="状态"> </el-table-column>
</el-table>
</div>
</YDDialog>
</Layout>
<div class="emailListContent" v-loading="emailRecordsLoading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading">
<el-table :data="emailListTableData" style="width: 100%">
<el-table-column prop="email" label="接收邮箱" width="180"></el-table-column>
<el-table-column prop="sendTime" label="发送时间" width="180"></el-table-column>
<el-table-column prop="status" label="状态"></el-table-column>
</el-table>
</div>
</YDDialog>
</Layout>
</template>
<script>
import { checkEmailName } from "../../../utils/tools.js";
import YDDialog from "@/components/Dialog/YDDialoag.vue";
import Layout from "../layout/index.vue";
import Pagination from "../components/Pagination/index.vue";
import { checkEmailName } from "../../../utils/tools.js";
import YDDialog from "@/components/Dialog/YDDialoag.vue";
import Layout from "../layout/index.vue";
import Pagination from "../components/Pagination/index.vue";
//import Pagination from "../components/Pagination/index.vue";
import {
getDelivererList,
getList,
getSaveDeliverer,
getAddDeliverer,
newGetMarketingList,
getEmailRecords,
getDeliveryRoutes
} from "../../../service/Groupmeal/groupmeal";
import { ElMessage } from "element-plus";
export default {
name: "Distrib",
components: {
Layout,
Pagination,
YDDialog
},
data() {
return {
sendEmailDialogVisible: false, // 发送email弹窗
myEmialInput: "", // email地址
deliverer_xlsx_id: "", // 下载配送路线API参数
isEmailRequire: false, // 验证emial非空
emialHasError: false, // 验证email格式
showEmailTableDialogVisible: false, // 展示email发送情况的dialog
emailRecordsLoading: false, // table-loading
pageLoading: false,
emailListTableData: [],
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: "", //活动下拉框
codeForModify: "", // 存储修改的code
total: 0,
page: 1,
pageSize: 20,
isEdit: false,
marketingList: []
};
},
created() {
this.getList();
this.getDelivererList();
this.newGetMarketingList();
},
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();
},
// 分配配送员活动select改变
getSelectActivityInfo(val) {
this.codeForModify = val;
},
// 分配配送员
assignDeliverer() {
this.dialogFormAssign = true;
this.getDelivererList();
this.multipleSelection = [];
this.deliverer = [];
this.isEdit = false;
},
// 修改
async handleModify(row) {
this.dialogFormAssign = true;
const { code } = row;
this.codeForModify = row.code;
this.selectActivity = row.activeName;
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);
}
},
// 下载路线
downloadDeliveryRoute(rowInfo) {
this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id;
this.sendEmailDialogVisible = true;
// url && window.open("http://bp-dev.ini.yidian-inc.com" + url);
// var ENV;
// if (process.env.NODE_ENV == "development") {
// ENV = "http://bp-dev.ini.yidian-inc.com/";
// } else if (process.env.NODE_ENV == "test") {
// ENV = "http://bp-test.ini.yidian-inc.com/";
// } else {
// ENV = "http://bp.ini.yidian-inc.com/";
// }
// url && window.open(ENV + url);
},
// 分配保存
async save() {
const { selectActivity, multipleSelection } = this;
const uids = multipleSelection.map(item => item.deliverer_id);
if (!selectActivity) return ElMessage("请选择活动姓名");
const codeForModify = this.codeForModify;
try {
const { code, reason } = await getSaveDeliverer({
code: codeForModify,
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 newGetMarketingList() {
try {
const res = await newGetMarketingList();
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;
} catch (error) {
console.log(error);
}
},
/* 邮箱弹窗相关操作 */
// 下载路线(API)
async downloadDeliveryRoutesAPI() {
await getDeliveryRoutes({
deliverer_xlsx_id: this.deliverer_xlsx_id,
email: this.myEmialInput + "@yidian-inc.com"
});
},
// 取消下载路线操作
sendEmailDialogCancel() {
this.myEmialInput = ""; // 清空输入
this.isEmailRequire = false;
this.emialHasError = false;
this.sendEmailDialogVisible = false;
},
// 确认下载路线操作
async sendEmailDialogConfirm() {
if (this.myEmialInput.trim() === "") {
this.isEmailRequire = true;
return;
}
if (!checkEmailName(this.myEmialInput)) {
this.emialHasError = true;
return;
}
try {
this.pageLoading = true;
await this.downloadDeliveryRoutesAPI();
this.pageLoading = false;
this.sendEmailDialogCancel();
ElMessage.success("操作成功");
} catch (err) {
this.pageLoading = false;
if (err) {
ElMessage.error(err);
} else {
ElMessage.error("请求错误");
}
}
//import Pagination from "../components/Pagination/index.vue";
import {
getDelivererList,
getList,
getSaveDeliverer,
getAddDeliverer,
newGetMarketingList,
getEmailRecords,
getDeliveryRoutes,
} from "../../../service/Groupmeal/groupmeal";
import { ElMessage } from "element-plus";
export default {
name: "Distrib",
components: {
Layout,
Pagination,
YDDialog,
},
data() {
return {
sendEmailDialogVisible: false, // 发送email弹窗
myEmialInput: "", // email地址
deliverer_xlsx_id: "", // 下载配送路线API参数
isEmailRequire: false, // 验证emial非空
emialHasError: false, // 验证email格式
showEmailTableDialogVisible: false, // 展示email发送情况的dialog
emailRecordsLoading: false, // table-loading
pageLoading: false,
emailListTableData: [],
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: "", //活动下拉框
codeForModify: "", // 存储修改的code
total: 0,
page: 1,
pageSize: 20,
isEdit: false,
marketingList: [],
};
},
created() {
this.getList();
this.getDelivererList();
this.newGetMarketingList();
},
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();
},
// 分配配送员活动select改变
getSelectActivityInfo(val) {
this.codeForModify = val;
},
// 分配配送员
assignDeliverer() {
this.dialogFormAssign = true;
this.getDelivererList();
this.multipleSelection = [];
this.deliverer = [];
this.isEdit = false;
},
// 修改
async handleModify(row) {
this.dialogFormAssign = true;
const { code } = row;
this.codeForModify = row.code;
this.selectActivity = row.activeName;
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);
}
},
// 下载路线
downloadDeliveryRoute(rowInfo) {
this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id;
this.sendEmailDialogVisible = true;
// url && window.open("http://bp-dev.ini.yidian-inc.com" + url);
// var ENV;
// if (process.env.NODE_ENV == "development") {
// ENV = "http://bp-dev.ini.yidian-inc.com/";
// } else if (process.env.NODE_ENV == "test") {
// ENV = "http://bp-test.ini.yidian-inc.com/";
// } else {
// ENV = "http://bp.ini.yidian-inc.com/";
// }
// url && window.open(ENV + url);
},
// 分配保存
async save() {
const { selectActivity, multipleSelection } = this;
const uids = multipleSelection.map((item) => item.deliverer_id);
if (!selectActivity) return ElMessage("请选择活动姓名");
const codeForModify = this.codeForModify;
try {
const { code, reason } = await getSaveDeliverer({
code: codeForModify,
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 newGetMarketingList() {
try {
const res = await newGetMarketingList();
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;
} catch (error) {
console.log(error);
}
},
/* 邮箱弹窗相关操作 */
// 下载路线(API)
async downloadDeliveryRoutesAPI() {
await getDeliveryRoutes({
deliverer_xlsx_id: this.deliverer_xlsx_id,
email: this.myEmialInput + "@yidian-inc.com",
});
},
// 取消下载路线操作
sendEmailDialogCancel() {
this.myEmialInput = ""; // 清空输入
this.isEmailRequire = false;
this.emialHasError = false;
this.sendEmailDialogVisible = false;
},
// 确认下载路线操作
async sendEmailDialogConfirm() {
if (this.myEmialInput.trim() === "") {
this.isEmailRequire = true;
return;
}
if (!checkEmailName(this.myEmialInput)) {
this.emialHasError = true;
return;
}
try {
this.pageLoading = true;
await this.downloadDeliveryRoutesAPI();
this.pageLoading = false;
this.sendEmailDialogCancel();
ElMessage.success("操作成功");
} catch (err) {
this.pageLoading = false;
if (err) {
ElMessage.error(err);
} else {
ElMessage.error("请求错误");
}
}
// this.myEmialInput = ""; // 清空输入
// this.isEmailRequire = false;
// this.emialHasError = false;
// this.sendEmailDialogVisible = false;
},
// 查看邮箱记录(API)
async getEmailRecordsAPI() {
let data = await getEmailRecords({
deliverer_xlsx_id: this.deliverer_xlsx_id
});
this.emailListTableData = this.formatEmailRecord(data.result);
},
// this.myEmialInput = ""; // 清空输入
// this.isEmailRequire = false;
// this.emialHasError = false;
// this.sendEmailDialogVisible = false;
},
// 查看邮箱记录(API)
async getEmailRecordsAPI() {
let data = await getEmailRecords({
deliverer_xlsx_id: this.deliverer_xlsx_id,
});
this.emailListTableData = this.formatEmailRecord(data.result);
},
// 查看发送记录
async getEmailRecord(rowInfo) {
this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id; // 赋值 取参数
this.showEmailTableDialogVisible = true;
try {
this.emailRecordsLoading = true;
await this.getEmailRecordsAPI();
this.emailRecordsLoading = false;
} catch (err) {
this.emailRecordsLoading = false;
if (err) {
ElMessage.error(err);
} else {
ElMessage.error("请求错误");
}
}
},
//带emailtable的dialog
showEmailDialogCancel() {
this.showEmailTableDialogVisible = false;
},
// 数据转换(api-table展示)
// create_time: "2021-08-19 17:38:05"
// deliverer_xlsx_id: 49
// deliverer_xlsx_log_id: 4
// email: "asdasdasdf"
// send_status: 1
// send_time: ""
// update_time: "2021-08-19 17:38:13"
formatEmailRecord(initialData) {
let matchRelation = {
"0": "待生成",
"1": "生成中",
"2": "已发送",
"3": "发送失败"
};
let result = initialData.map(item => {
let res = {
email: item.email,
sendTime: item.send_time,
status: matchRelation[item.send_status.toString()]
};
return res;
});
return result;
}
}
};
// 查看发送记录
async getEmailRecord(rowInfo) {
this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id; // 赋值 取参数
this.showEmailTableDialogVisible = true;
try {
this.emailRecordsLoading = true;
await this.getEmailRecordsAPI();
this.emailRecordsLoading = false;
} catch (err) {
this.emailRecordsLoading = false;
if (err) {
ElMessage.error(err);
} else {
ElMessage.error("请求错误");
}
}
},
//带emailtable的dialog
showEmailDialogCancel() {
this.showEmailTableDialogVisible = false;
},
// 数据转换(api-table展示)
// create_time: "2021-08-19 17:38:05"
// deliverer_xlsx_id: 49
// deliverer_xlsx_log_id: 4
// email: "asdasdasdf"
// send_status: 1
// send_time: ""
// update_time: "2021-08-19 17:38:13"
formatEmailRecord(initialData) {
let matchRelation = {
0: "待生成",
1: "生成中",
2: "已发送",
3: "发送失败",
};
let result = initialData.map((item) => {
let res = {
email: item.email,
sendTime: item.send_time,
status: matchRelation[item.send_status.toString()],
};
return res;
});
return result;
},
},
};
</script>
<style lang="less" src="./index.less" scope></style>
<style lang="less" scoped>
// 邮箱dialog
.emailContent {
.emialInputWrapper {
display: flex;
align-items: center;
margin: 15px 0;
.myInput {
width: 50%;
}
.myInputRequire::after {
content: "输入不能为空";
position: absolute;
left: 2px;
top: 35px;
color: red;
}
// 验证emial非空
.myInputError::after {
content: "输入邮箱不合法";
position: absolute;
left: 2px;
top: 35px;
color: red;
// 邮箱dialog
.emailContent {
.emialInputWrapper {
display: flex;
align-items: center;
margin: 15px 0;
.myInput {
width: 50%;
}
.myInputRequire::after {
content: "输入不能为空";
position: absolute;
left: 2px;
top: 35px;
color: red;
}
// 验证emial非空
.myInputError::after {
content: "输入邮箱不合法";
position: absolute;
left: 2px;
top: 35px;
color: red;
}
}
}
}
}
</style>
const headerConfig = [
{
name: "活动管理",
path: "/op/activity/manage"
},
{
name: "订单管理",
path: "/op/groupmeal/orderManagement"
},
{
name: "新订单管理",
path: "/op/groupmeal/newOrderManagement"
},
{
path: "/op/groupmeal/distrib",
name: "配送员管理"
}
{
name: "活动管理",
path: "/op/activity/manage",
},
{
name: "订单管理",
path: "/op/groupmeal/orderManagement",
},
{
name: "新订单管理",
path: "/op/groupmeal/newOrderManagement",
},
{
path: "/op/groupmeal/distrib",
name: "配送员管理",
},
{
path: "/op/groupmeal/merchantManagement",
name: "商家管理",
},
];
export default headerConfig;
.goods {
width: 100%;
height: 100%;
padding: 0 30px;
.header {
display: flex;
justify-content: flex-end;
margin-bottom: 30px;
}
.dioFor {
margin-left: 5%;
width: 70%;
}
.locationstyle {
display: flex;
}
.location {
margin-bottom: 10px;
// margin-left: 10%;
}
.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;
}
/deep/ .mapDialog {
margin-top: 10vh !important;
height: 80%;
display: flex !important;
flex-direction: column !important;
/deep/ .el-dialog__body {
height: 90%;
}
}
}
<template>
<Layout>
<el-card class="goods" v-loading="pageLoading">
<div class="header">
<el-button type="primary" @click="modifyMerchant">添加商家</el-button>
</div>
<el-table :data="merchantList" border stripe fit style="width: 100%">
<el-table-column align="center" prop="ota_name" label="商家"></el-table-column>
<el-table-column align="center" prop="printer_sn" label="打印机SN"></el-table-column>
<el-table-column align="center" prop="printer_key" label="打印机KEY"></el-table-column>
<el-table-column align="center" prop="label_printer_sn" label="标签机SN"></el-table-column>
<el-table-column align="center" prop="label_printer_key" label="标签机KEY"></el-table-column>
<el-table-column align="center" prop="state" label="状态">
<template #default="scope">{{ ["正常", "已禁用"][scope.row.status] }}</template>
</el-table-column>
<el-table-column align="center" prop="operation" label="操作">
<template #default="scope">
<el-button type="text" :disabled="scope.row.status == 1" @click="modifyMerchant(scope.row.ota_id, scope.$index)">
修改
</el-button>
<el-button type="text" :disabled="scope.row.status == 1" @click="handleDisable(scope.row)">禁用</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加商家 -->
<el-dialog title="商家编辑" v-model="merchantAdd" width="70%" :show-close="false">
<el-form class="dioFor" :model="addMerchant" :rules="rules">
<el-form-item label="商家名称" label-width="100px" prop="ota_name">
<el-input maxlength="30" show-word-limit clearable autocomplete="off" v-model="addMerchant.ota_name"></el-input>
</el-form-item>
<el-form-item label="打印机SN" label-width="100px" prop="printer_sn">
<el-input type="text" show-word-limit clearable autocomplete="off" v-model="addMerchant.printer_sn"></el-input>
</el-form-item>
<el-form-item label="打印机KEY" label-width="100px" prop="printer_key">
<el-input type="text" show-word-limit clearable autocomplete="off" v-model="addMerchant.printer_key"></el-input>
</el-form-item>
<el-form-item label="标签机SN" label-width="100px" prop="label_printer_sn">
<el-input type="text" show-word-limit clearable autocomplete="off" v-model="addMerchant.label_printer_sn"></el-input>
</el-form-item>
<el-form-item label="标签机KEY" label-width="100px" prop="label_printer_key">
<el-input type="text" show-word-limit clearable autocomplete="off" v-model="addMerchant.label_printer_key"></el-input>
</el-form-item>
<el-form-item label="位置" label-width="100px" prop="location">
<div class="locationstyle">
<el-input
type="text"
show-word-limit
clearable
autocomplete="off"
v-model="addMerchant.location"
:disabled="true"
></el-input>
<el-button type="text" @click="mapDialogVisible = true">从高德获取坐标</el-button>
</div>
<p class="location">{{ addMerchant.location }}</p>
</el-form-item>
<el-form-item label="详细地址" label-width="100px" prop="address">
<el-input type="text" show-word-limit clearable autocomplete="off" v-model="addMerchant.address"></el-input>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="addCancel">取 消</el-button>
<el-button type="primary" @click="saveMerchant">保 存</el-button>
</span>
</template>
</el-dialog>
<!-- 地图 dialog -->
<el-dialog custom-class="mapDialog" v-model="mapDialogVisible" width="100%">
<my-map class="my-map" @getMapInfo="getMapInfo" @hideMapDialog="mapDialogVisible = false" />
</el-dialog>
</el-card>
</Layout>
</template>
<script>
import Layout from "../layout/index.vue";
import myMap from "@/pages/Activity/releaseProduc/components/myMap";
import { otaList, addOta, deleteOta, updateOta } from "@/service/Goods/goods";
export default {
name: "merchantManagement",
components: {
Layout,
myMap,
},
created() {
this.getOtaList();
},
data() {
return {
mapDialogVisible: false,
disabledIndex: null,
rules: {
name: [{ required: true, message: "请输入商家名称", trigger: "blur" }],
},
//修改信息
merchantAdd: false,
addMerchant: {
ota_name: "",
printer_sn: "",
printer_key: "",
label_printer_sn: "",
label_printer_key: "",
location: "",
address: "",
},
// 列表
merchantList: [],
deep: true,
};
},
methods: {
modifyMerchant(id, index) {
if (typeof id == "number") {
this.addMerchant = this.merchantList[index];
}
this.merchantAdd = true;
},
async getOtaList() {
const { result, code, reason } = await otaList();
this.merchantList = result.list;
if (code !== 0) return this.$message.error(reason);
},
//保存
async saveMerchant() {
let { result, code, reason } = this.addMerchant.ota_id ? await updateOta(this.addMerchant) : await addOta(this.addMerchant);
if (code !== 0) return this.$message.error(reason);
await this.getOtaList();
this.merchantAdd = false;
},
// 取消
addCancel() {
this.merchantAdd = false;
this.resetDate();
},
resetDate() {
this.addMerchant = {};
},
//禁用
async handleDisable(item) {
let res = await deleteOta({ ota_id: item.ota_id });
if (res.code !== 0) return this.$message.error(res.reason);
this.getOtaList();
},
// 获取地图信息
getMapInfo(mapInfo) {
console.log(mapInfo);
this.addMerchant.location = mapInfo.address;
this.addMerchant.longitude = mapInfo.lng; // longitude latitude contactor
this.addMerchant.latitude = mapInfo.lat;
},
},
};
</script>
<style lang="less" src="./index.less" scope></style>
/**
* 团餐运营管理
*/
const groupmealRouters = [
const groupmealRouters = [
{
path: "/op/groupmeal/orderManagement",
name: "orderManagement",
// redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/orderManagement")
path: "/op/groupmeal/orderManagement",
name: "orderManagement",
// redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/orderManagement"),
},
{
path: "/op/groupmeal/newOrderManagement",
name: "newOrderManagement",
// redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/newOrderManagement")
},
path: "/op/groupmeal/newOrderManagement",
name: "newOrderManagement",
// redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/newOrderManagement"),
},
{
path: "/op/groupmeal/distrib",
name: "Distrib",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/Distrib"),
},
{
path: "/op/groupmeal/distrib",
name: "Distrib",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/Distrib")
path: "/op/groupmeal/merchantManagement",
name: "merchantManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/merchantManagement"),
},
];
export default groupmealRouters;
\ No newline at end of file
];
export default groupmealRouters;
......@@ -96,3 +96,26 @@ export async function updateMarketingList(params) {
const res = await axios.post("/api/v1/update_marketing_list", params);
return res;
}
// 商家列表
export async function otaList(params) {
const res = await axios.post("/api/v1/otaList", params);
return res;
}
// 商家列表-add
export async function addOta(params) {
const res = await axios.post("/api/v1/addOta", params);
return res;
}
// 商家列表-禁用
export async function deleteOta(params) {
const res = await axios.post("/api/v1/deleteOta", params);
return res;
}
// 商家列表-修改
export async function updateOta(params) {
const res = await axios.post("/api/v1/updateOta", params);
return res;
}
......@@ -29,7 +29,7 @@ const CDN = {
module.exports = {
outputDir: isDev ? "./dist" : path.resolve("./public/dist/"),
publicPath: isDev ? "/" : "/dist",
lintOnSave: isDev,
lintOnSave: false,
productionSourceMap: false, // 去掉生成环境的 sourceMap
devServer: {
proxy: "http://127.0.0.1:8055", //http://localhost:8055
......
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