Commit ec4be6d4 authored by jisiyu's avatar jisiyu

add:商家管理

parent ca2eeb0e
...@@ -193,3 +193,54 @@ exports.updateMarketingList = async (ctx) => { ...@@ -193,3 +193,54 @@ exports.updateMarketingList = async (ctx) => {
const res = await req(ctx, opts); const res = await req(ctx, opts);
ctx.body = res; 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); ...@@ -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_find_goods_list`, goods.getFindGoodsList);
router.post(`${API_VERSION}/get_marketing_info`, goods.getMarketingInfo); router.post(`${API_VERSION}/get_marketing_info`, goods.getMarketingInfo);
router.post(`${API_VERSION}/update_marketing_list`, goods.updateMarketingList); 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.post(`${API_VERSION}/merchant/lifeinner/life_info`, life.get_life_info);
router.get(`${API_VERSION}/merchant/lifeinner/life_list`, life.get_life_list); router.get(`${API_VERSION}/merchant/lifeinner/life_list`, life.get_life_list);
......
<template> <template>
<Layout> <Layout>
<el-card class="goods" v-loading="pageLoading"> <el-card class="goods" v-loading="pageLoading">
<div class="header"> <div class="header">
<el-button type="primary" @click="assignDeliverer" <el-button type="primary" @click="assignDeliverer">分配配送员</el-button>
>分配配送员</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" <div class="emailContent">
>添加配送员</el-button <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> <div class="emailListContent" v-loading="emailRecordsLoading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading">
<el-table :data="distribList" border stripe fit style="width: 100%"> <el-table :data="emailListTableData" style="width: 100%">
<el-table-column align="center" prop="activeName" label="活动名称"> <el-table-column prop="email" label="接收邮箱" width="180"></el-table-column>
</el-table-column> <el-table-column prop="sendTime" label="发送时间" width="180"></el-table-column>
<el-table-column align="center" label="配送员数量"> <el-table-column prop="status" label="状态"></el-table-column>
<template #default="scope"> </el-table>
{{ scope.row.list.length }} </div>
</template> </YDDialog>
</el-table-column> </Layout>
<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>
</template> </template>
<script> <script>
import { checkEmailName } from "../../../utils/tools.js"; import { checkEmailName } from "../../../utils/tools.js";
import YDDialog from "@/components/Dialog/YDDialoag.vue"; import YDDialog from "@/components/Dialog/YDDialoag.vue";
import Layout from "../layout/index.vue"; import Layout from "../layout/index.vue";
import Pagination from "../components/Pagination/index.vue"; import Pagination from "../components/Pagination/index.vue";
//import Pagination from "../components/Pagination/index.vue"; //import Pagination from "../components/Pagination/index.vue";
import { import {
getDelivererList, getDelivererList,
getList, getList,
getSaveDeliverer, getSaveDeliverer,
getAddDeliverer, getAddDeliverer,
newGetMarketingList, newGetMarketingList,
getEmailRecords, getEmailRecords,
getDeliveryRoutes getDeliveryRoutes,
} from "../../../service/Groupmeal/groupmeal"; } from "../../../service/Groupmeal/groupmeal";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
export default { export default {
name: "Distrib", name: "Distrib",
components: { components: {
Layout, Layout,
Pagination, Pagination,
YDDialog YDDialog,
}, },
data() { data() {
return { return {
sendEmailDialogVisible: false, // 发送email弹窗 sendEmailDialogVisible: false, // 发送email弹窗
myEmialInput: "", // email地址 myEmialInput: "", // email地址
deliverer_xlsx_id: "", // 下载配送路线API参数 deliverer_xlsx_id: "", // 下载配送路线API参数
isEmailRequire: false, // 验证emial非空 isEmailRequire: false, // 验证emial非空
emialHasError: false, // 验证email格式 emialHasError: false, // 验证email格式
showEmailTableDialogVisible: false, // 展示email发送情况的dialog showEmailTableDialogVisible: false, // 展示email发送情况的dialog
emailRecordsLoading: false, // table-loading emailRecordsLoading: false, // table-loading
pageLoading: false, pageLoading: false,
emailListTableData: [], emailListTableData: [],
rules: { rules: {
name: [{ required: true, message: "请输入姓名", trigger: "blur" }], name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
max_capacity: [ max_capacity: [
{ required: true, message: "请填写配送上限", trigger: "blur" } { required: true, message: "请填写配送上限", trigger: "blur" },
// { type: "number", message: "请填写数值哦", trigger: "change" }, // { type: "number", message: "请填写数值哦", trigger: "change" },
], ],
min_capacity: [ min_capacity: [{ type: "number", message: "请填写数值哦", trigger: "change" }],
{ type: "number", message: "请填写数值哦", trigger: "change" } },
] dialogFormAdd: false,
}, // 列表
dialogFormAdd: false, distribList: [],
// 列表 // 添加配送员弹框
distribList: [], addDeliverer: {
// 添加配送员弹框 name: "",
addDeliverer: { max_capacity: "", //配送上限
name: "", min_capacity: "", //最小配送量
max_capacity: "", //配送上限 tool_type: [], //配送工具
min_capacity: "", //最小配送量 },
tool_type: [] //配送工具 //分配配送员弹框
}, dialogFormAssign: false,
//分配配送员弹框 deliverer: [],
dialogFormAssign: false, multipleSelection: [],
deliverer: [], selectActivity: "", //活动下拉框
multipleSelection: [], codeForModify: "", // 存储修改的code
selectActivity: "", //活动下拉框 total: 0,
codeForModify: "", // 存储修改的code page: 1,
total: 0, pageSize: 20,
page: 1, isEdit: false,
pageSize: 20, marketingList: [],
isEdit: false, };
marketingList: [] },
}; created() {
}, this.getList();
created() { this.getDelivererList();
this.getList(); this.newGetMarketingList();
this.getDelivererList(); },
this.newGetMarketingList(); methods: {
}, selectGoodsChange(val) {
methods: { this.multipleSelection = val;
selectGoodsChange(val) { },
this.multipleSelection = val; // 页码变化
}, handleCurrentChange(e) {
// 页码变化 this.page = e;
handleCurrentChange(e) { this.getList();
this.page = e; },
this.getList(); // 清空
}, resetDate() {
// 清空 // 添加配送员弹框
resetDate() { (this.addDeliverer = {
// 添加配送员弹框 name: "",
(this.addDeliverer = { max_capacity: "", //配送上限
name: "", min_capacity: "", //最小配送量
max_capacity: "", //配送上限 tool_type: [], //配送工具
min_capacity: "", //最小配送量 }),
tool_type: [] //配送工具 (this.deliverer = []),
}), (this.multipleSelection = []);
(this.deliverer = []), this.selectActivity = ""; //活动下拉框
(this.multipleSelection = []); },
this.selectActivity = ""; //活动下拉框 // 获取主页列表
}, async getList() {
// 获取主页列表 const { page, pageSize } = this;
async getList() { const params = {
const { page, pageSize } = this; page,
const params = { pageSize,
page, };
pageSize try {
}; const res = await getList(params);
try { this.distribList = res.response.list;
const res = await getList(params); this.total = res.response.total;
this.distribList = res.response.list; } catch (error) {
this.total = res.response.total; console.log(error);
} catch (error) { }
console.log(error); },
} // 添加配送员
}, async addSave() {
// 添加配送员 const { name, max_capacity, min_capacity, tool_type } = this.addDeliverer;
async addSave() { if (!name) return ElMessage("请填写配送员姓名");
const { name, max_capacity, min_capacity, tool_type } = this.addDeliverer; if (!max_capacity) return ElMessage("请填写配送上限");
if (!name) return ElMessage("请填写配送员姓名"); if (min_capacity !== "" && min_capacity <= 0) return ElMessage("最小配送量不能为0或小于0");
if (!max_capacity) return ElMessage("请填写配送上限"); if (!min_capacity) return ElMessage("请填写最小配送量");
if (min_capacity !== "" && min_capacity <= 0) if (!tool_type) return ElMessage("请选择配送工具");
return ElMessage("最小配送量不能为0或小于0"); const params = {
if (!min_capacity) return ElMessage("请填写最小配送量"); name,
if (!tool_type) return ElMessage("请选择配送工具"); max_capacity: +max_capacity,
const params = { min_capacity: +min_capacity,
name, tool_type: +tool_type,
max_capacity: +max_capacity, };
min_capacity: +min_capacity, try {
tool_type: +tool_type const { code, reason } = await getAddDeliverer(params);
}; if (code !== 0) return this.$message.error(reason || "添加配送员失败");
try { ElMessage("添加配送员成功");
const { code, reason } = await getAddDeliverer(params); this.getDelivererList();
if (code !== 0) return this.$message.error(reason || "添加配送员失败"); this.dialogFormAdd = false;
ElMessage("添加配送员成功"); this.addDeliverer = {
this.getDelivererList(); name: "",
this.dialogFormAdd = false; max_capacity: "", //配送上限
this.addDeliverer = { min_capacity: "", //最小配送量
name: "", tool_type: [], //配送工具
max_capacity: "", //配送上限 };
min_capacity: "", //最小配送量 } catch (error) {
tool_type: [] //配送工具 ElMessage("请求添加配送员失败");
}; }
} catch (error) { },
ElMessage("请求添加配送员失败"); // 添加的取消
} addCancel() {
}, this.dialogFormAdd = false;
// 添加的取消 this.resetDate();
addCancel() { },
this.dialogFormAdd = false; // 分配配送员活动select改变
this.resetDate(); getSelectActivityInfo(val) {
}, this.codeForModify = val;
// 分配配送员活动select改变 },
getSelectActivityInfo(val) { // 分配配送员
this.codeForModify = val; assignDeliverer() {
}, this.dialogFormAssign = true;
// 分配配送员 this.getDelivererList();
assignDeliverer() { this.multipleSelection = [];
this.dialogFormAssign = true; this.deliverer = [];
this.getDelivererList(); this.isEdit = false;
this.multipleSelection = []; },
this.deliverer = []; // 修改
this.isEdit = false; async handleModify(row) {
}, this.dialogFormAssign = true;
// 修改 const { code } = row;
async handleModify(row) { this.codeForModify = row.code;
this.dialogFormAssign = true; this.selectActivity = row.activeName;
const { code } = row; try {
this.codeForModify = row.code; const res = await getDelivererList({ code });
this.selectActivity = row.activeName; this.deliverer = res.response;
try { this.isEdit = true;
const res = await getDelivererList({ code }); this.getList();
this.deliverer = res.response; this.$nextTick(() => {
this.isEdit = true; this.$refs.multipleTable.clearSelection();
this.getList(); this.deliverer.forEach((row) => {
this.$nextTick(() => { if (row.checked) {
this.$refs.multipleTable.clearSelection(); this.$refs.multipleTable.toggleRowSelection(row, true);
this.deliverer.forEach(row => { }
if (row.checked) { });
this.$refs.multipleTable.toggleRowSelection(row, true); });
} } catch (error) {
}); console.log(error);
}); }
} catch (error) { },
console.log(error); // 下载路线
} downloadDeliveryRoute(rowInfo) {
}, this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id;
// 下载路线 this.sendEmailDialogVisible = true;
downloadDeliveryRoute(rowInfo) { // url && window.open("http://bp-dev.ini.yidian-inc.com" + url);
this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id; // var ENV;
this.sendEmailDialogVisible = true; // if (process.env.NODE_ENV == "development") {
// url && window.open("http://bp-dev.ini.yidian-inc.com" + url); // ENV = "http://bp-dev.ini.yidian-inc.com/";
// var ENV; // } else if (process.env.NODE_ENV == "test") {
// if (process.env.NODE_ENV == "development") { // ENV = "http://bp-test.ini.yidian-inc.com/";
// ENV = "http://bp-dev.ini.yidian-inc.com/"; // } else {
// } else if (process.env.NODE_ENV == "test") { // ENV = "http://bp.ini.yidian-inc.com/";
// ENV = "http://bp-test.ini.yidian-inc.com/"; // }
// } else { // url && window.open(ENV + url);
// 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);
async save() { if (!selectActivity) return ElMessage("请选择活动姓名");
const { selectActivity, multipleSelection } = this; const codeForModify = this.codeForModify;
const uids = multipleSelection.map(item => item.deliverer_id); try {
if (!selectActivity) return ElMessage("请选择活动姓名"); const { code, reason } = await getSaveDeliverer({
const codeForModify = this.codeForModify; code: codeForModify,
try { uids: uids.join(","),
const { code, reason } = await getSaveDeliverer({ });
code: codeForModify, if (code !== 0) return this.$message.error(reason || (this.isEdit ? "修改配送员失败" : "分配配送员失败"));
uids: uids.join(",") ElMessage(this.isEdit ? "修改配送员成功" : "分配配送员成功");
}); this.dialogFormAssign = false;
if (code !== 0) this.isEdit = false;
return this.$message.error( this.getList();
reason || (this.isEdit ? "修改配送员失败" : "分配配送员失败") this.resetDate();
); } catch (error) {
ElMessage(this.isEdit ? "修改配送员成功" : "分配配送员成功"); ElMessage("请求分配配送员失败");
this.dialogFormAssign = false; }
this.isEdit = false; },
this.getList(); // 分配取消
this.resetDate(); assignCancel() {
} catch (error) { this.dialogFormAssign = false;
ElMessage("请求分配配送员失败"); this.getDelivererList();
} this.resetDate();
}, },
// 分配取消 // 活动名称列表
assignCancel() { async newGetMarketingList() {
this.dialogFormAssign = false; try {
this.getDelivererList(); const res = await newGetMarketingList();
this.resetDate(); this.marketingList = res.result.map((item) => {
}, return {
// 活动名称列表 value: item.marketing_id,
async newGetMarketingList() { label: item.marketing_name,
try { };
const res = await newGetMarketingList(); });
this.marketingList = res.result.map(item => { } catch (error) {
return { console.log(error);
value: item.marketing_id, }
label: item.marketing_name },
}; // 分配配送员列表
}); async getDelivererList() {
} catch (error) { try {
console.log(error); const res = await getDelivererList();
} // this.deliverer.code = res.response.code;
}, this.deliverer = res.response;
// 分配配送员列表 } catch (error) {
async getDelivererList() { console.log(error);
try { }
const res = await getDelivererList(); },
// this.deliverer.code = res.response.code; /* 邮箱弹窗相关操作 */
this.deliverer = res.response; // 下载路线(API)
} catch (error) { async downloadDeliveryRoutesAPI() {
console.log(error); await getDeliveryRoutes({
} deliverer_xlsx_id: this.deliverer_xlsx_id,
}, email: this.myEmialInput + "@yidian-inc.com",
/* 邮箱弹窗相关操作 */ });
// 下载路线(API) },
async downloadDeliveryRoutesAPI() { // 取消下载路线操作
await getDeliveryRoutes({ sendEmailDialogCancel() {
deliverer_xlsx_id: this.deliverer_xlsx_id, this.myEmialInput = ""; // 清空输入
email: this.myEmialInput + "@yidian-inc.com" this.isEmailRequire = false;
}); this.emialHasError = false;
}, this.sendEmailDialogVisible = false;
// 取消下载路线操作 },
sendEmailDialogCancel() { // 确认下载路线操作
this.myEmialInput = ""; // 清空输入 async sendEmailDialogConfirm() {
this.isEmailRequire = false; if (this.myEmialInput.trim() === "") {
this.emialHasError = false; this.isEmailRequire = true;
this.sendEmailDialogVisible = false; return;
}, }
// 确认下载路线操作 if (!checkEmailName(this.myEmialInput)) {
async sendEmailDialogConfirm() { this.emialHasError = true;
if (this.myEmialInput.trim() === "") { return;
this.isEmailRequire = true; }
return; try {
} this.pageLoading = true;
if (!checkEmailName(this.myEmialInput)) { await this.downloadDeliveryRoutesAPI();
this.emialHasError = true; this.pageLoading = false;
return; this.sendEmailDialogCancel();
} ElMessage.success("操作成功");
try { } catch (err) {
this.pageLoading = true; this.pageLoading = false;
await this.downloadDeliveryRoutesAPI(); if (err) {
this.pageLoading = false; ElMessage.error(err);
this.sendEmailDialogCancel(); } else {
ElMessage.success("操作成功"); ElMessage.error("请求错误");
} catch (err) { }
this.pageLoading = false; }
if (err) {
ElMessage.error(err);
} else {
ElMessage.error("请求错误");
}
}
// this.myEmialInput = ""; // 清空输入 // this.myEmialInput = ""; // 清空输入
// this.isEmailRequire = false; // this.isEmailRequire = false;
// this.emialHasError = false; // this.emialHasError = false;
// this.sendEmailDialogVisible = false; // this.sendEmailDialogVisible = false;
}, },
// 查看邮箱记录(API) // 查看邮箱记录(API)
async getEmailRecordsAPI() { async getEmailRecordsAPI() {
let data = await getEmailRecords({ let data = await getEmailRecords({
deliverer_xlsx_id: this.deliverer_xlsx_id deliverer_xlsx_id: this.deliverer_xlsx_id,
}); });
this.emailListTableData = this.formatEmailRecord(data.result); this.emailListTableData = this.formatEmailRecord(data.result);
}, },
// 查看发送记录 // 查看发送记录
async getEmailRecord(rowInfo) { async getEmailRecord(rowInfo) {
this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id; // 赋值 取参数 this.deliverer_xlsx_id = rowInfo.deliverer_xlsx_id; // 赋值 取参数
this.showEmailTableDialogVisible = true; this.showEmailTableDialogVisible = true;
try { try {
this.emailRecordsLoading = true; this.emailRecordsLoading = true;
await this.getEmailRecordsAPI(); await this.getEmailRecordsAPI();
this.emailRecordsLoading = false; this.emailRecordsLoading = false;
} catch (err) { } catch (err) {
this.emailRecordsLoading = false; this.emailRecordsLoading = false;
if (err) { if (err) {
ElMessage.error(err); ElMessage.error(err);
} else { } else {
ElMessage.error("请求错误"); ElMessage.error("请求错误");
} }
} }
}, },
//带emailtable的dialog //带emailtable的dialog
showEmailDialogCancel() { showEmailDialogCancel() {
this.showEmailTableDialogVisible = false; this.showEmailTableDialogVisible = false;
}, },
// 数据转换(api-table展示) // 数据转换(api-table展示)
// create_time: "2021-08-19 17:38:05" // create_time: "2021-08-19 17:38:05"
// deliverer_xlsx_id: 49 // deliverer_xlsx_id: 49
// deliverer_xlsx_log_id: 4 // deliverer_xlsx_log_id: 4
// email: "asdasdasdf" // email: "asdasdasdf"
// send_status: 1 // send_status: 1
// send_time: "" // send_time: ""
// update_time: "2021-08-19 17:38:13" // update_time: "2021-08-19 17:38:13"
formatEmailRecord(initialData) { formatEmailRecord(initialData) {
let matchRelation = { let matchRelation = {
"0": "待生成", 0: "待生成",
"1": "生成中", 1: "生成中",
"2": "已发送", 2: "已发送",
"3": "发送失败" 3: "发送失败",
}; };
let result = initialData.map(item => { let result = initialData.map((item) => {
let res = { let res = {
email: item.email, email: item.email,
sendTime: item.send_time, sendTime: item.send_time,
status: matchRelation[item.send_status.toString()] status: matchRelation[item.send_status.toString()],
}; };
return res; return res;
}); });
return result; return result;
} },
} },
}; };
</script> </script>
<style lang="less" src="./index.less" scope></style> <style lang="less" src="./index.less" scope></style>
<style lang="less" scoped> <style lang="less" scoped>
// 邮箱dialog // 邮箱dialog
.emailContent { .emailContent {
.emialInputWrapper { .emialInputWrapper {
display: flex; display: flex;
align-items: center; align-items: center;
margin: 15px 0; margin: 15px 0;
.myInput { .myInput {
width: 50%; width: 50%;
} }
.myInputRequire::after { .myInputRequire::after {
content: "输入不能为空"; content: "输入不能为空";
position: absolute; position: absolute;
left: 2px; left: 2px;
top: 35px; top: 35px;
color: red; color: red;
} }
// 验证emial非空 // 验证emial非空
.myInputError::after { .myInputError::after {
content: "输入邮箱不合法"; content: "输入邮箱不合法";
position: absolute; position: absolute;
left: 2px; left: 2px;
top: 35px; top: 35px;
color: red; color: red;
}
}
} }
}
}
</style> </style>
const headerConfig = [ const headerConfig = [
{ {
name: "活动管理", name: "活动管理",
path: "/op/activity/manage" path: "/op/activity/manage",
}, },
{ {
name: "订单管理", name: "订单管理",
path: "/op/groupmeal/orderManagement" path: "/op/groupmeal/orderManagement",
}, },
{ {
name: "新订单管理", name: "新订单管理",
path: "/op/groupmeal/newOrderManagement" path: "/op/groupmeal/newOrderManagement",
}, },
{ {
path: "/op/groupmeal/distrib", path: "/op/groupmeal/distrib",
name: "配送员管理" name: "配送员管理",
} },
{
path: "/op/groupmeal/merchantManagement",
name: "商家管理",
},
]; ];
export default headerConfig; 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", path: "/op/groupmeal/orderManagement",
name: "orderManagement", name: "orderManagement",
// redirect: "/op/groupmeal/orderManagement", // redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/orderManagement") component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/orderManagement"),
}, },
{ {
path: "/op/groupmeal/newOrderManagement", path: "/op/groupmeal/newOrderManagement",
name: "newOrderManagement", name: "newOrderManagement",
// redirect: "/op/groupmeal/orderManagement", // redirect: "/op/groupmeal/orderManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/newOrderManagement") component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/newOrderManagement"),
}, },
{
path: "/op/groupmeal/distrib",
name: "Distrib",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/Distrib"),
},
{ {
path: "/op/groupmeal/distrib", path: "/op/groupmeal/merchantManagement",
name: "Distrib", name: "merchantManagement",
component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/Distrib") component: () => import(/* webpackChunkName: "goods" */ "@/pages/Groupmeal/merchantManagement"),
}, },
]; ];
export default groupmealRouters; export default groupmealRouters;
\ No newline at end of file
...@@ -96,3 +96,26 @@ export async function updateMarketingList(params) { ...@@ -96,3 +96,26 @@ export async function updateMarketingList(params) {
const res = await axios.post("/api/v1/update_marketing_list", params); const res = await axios.post("/api/v1/update_marketing_list", params);
return res; 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 = { ...@@ -29,7 +29,7 @@ const CDN = {
module.exports = { module.exports = {
outputDir: isDev ? "./dist" : path.resolve("./public/dist/"), outputDir: isDev ? "./dist" : path.resolve("./public/dist/"),
publicPath: isDev ? "/" : "/dist", publicPath: isDev ? "/" : "/dist",
lintOnSave: isDev, lintOnSave: false,
productionSourceMap: false, // 去掉生成环境的 sourceMap productionSourceMap: false, // 去掉生成环境的 sourceMap
devServer: { devServer: {
proxy: "http://127.0.0.1:8055", //http://localhost:8055 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