You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bsdgy-front/src/pages/activity/ActivityPlan.vue

553 lines
15 KiB
Vue

<template>
<div>
<Spin v-if="saving"
fix>加载中...</Spin>
<Form ref="formValidate"
:model="formValidate"
:label-width="80">
<Row :gutter="10">
<i-col span="6">
<FormItem label="选择日期"
prop>
<Date-picker style="width: 100%"
v-model="formValidate.date"
type="daterange"
placement="bottom-end"
placeholder="选择日期区间"></Date-picker>
</FormItem>
</i-col>
<i-col span="6">
<FormItem label="零售公司"
prop>
<Select v-model="formValidate.organizationId"
filterable
@on-change="selectCompany"
placeholder="全部"
clearable>
<Option v-for="(item, index) in companyList"
:key="index"
:value="item.value">{{ item.label }}</Option>
</Select>
</FormItem>
</i-col>
<i-col span="6">
<FormItem label="店铺"
prop>
<Select v-model="formValidate.storeId"
filterable
placeholder="全部"
clearable>
<Option v-for="(item, index) in shopList"
:key="index"
:value="item.value">{{ item.label }}</Option>
</Select>
</FormItem>
</i-col>
<i-col span="3">
<FormItem label="活动状态"
prop>
<Select v-model="formValidate.status">
<Option v-for="(item, index) in activityStatusList"
:key="index"
:value="item.value">{{ item.label }}</Option>
</Select>
</FormItem>
</i-col>
<i-col span="3">
<Button type="primary"
@click="() => {pageNum = 1;searchTable()}">查询</Button>
</i-col>
</Row>
<Row style="margin-top:50px">
<Table :loading="loading"
border
@on-row-dblclick="showDetail"
:columns="columns1"
:data="data">
<template slot-scope="{row}"
slot="qrCodeAction">
<img :src="require('../../../static/img/qrCode-init.png')"
@click="navigateCode(row)"
class="table-img-qr-code" />
</template>
<template slot="action"
slot-scope="{row}">
<i-col span="12">
<Button ghost
:class="row.status > 2 ? 'router-btn disable' : 'router-btn'"
@click="() => {stop(row)}">终止</Button>
</i-col>
<i-col span="12">
<Button ghost
class="router-btn"
@click="() => {modify(row)}">修改</Button>
</i-col>
</template>
</Table>
<Page :total="totalSize"
:current="pageNum"
:page-size="pageSize"
show-elevator
show-total
placement="top"
@on-change="handlePage"
class-name="ks-page"></Page>
</Row>
</Form>
<useTable ref="useTable"
@doShow="doShow"
:show="showUse"
:isModify="true"
:schedule="activityInstance.scheduleVO"></useTable>
<Modal v-model="isShowDetail"
title="活动计划详情"
width="70%"
:footer-hide="true">
<planDetail v-if="isShowDetail"
:detail="detail"></planDetail>
</Modal>
<!-- -->
<Modal v-model="isShow"
:title="showStoreName"
:footer-hide="true"
width="230"
class-name="vertical-center-modal"
@on-ok="ok">
<div slot="header">
<p></p>
</div>
<p>{{this.showStoreName}}</p>
<img :src="qrCodeImage"
style="width:200px;height:200px;" />
<div style="text-align: center;">
<Button ghost
type="primary"
@click="download(rowData)"></Button>
</div>
</Modal>
</div>
</template>
<script>
import ActivityManager from "../../services/ActivityManager/ActivityManager";
import useTable from "./useTable";
import http from "../../services/CommonHttp";
import { formatDate } from "../../utils/Common";
import store from "../../store";
import planDetail from "./PlanDetail";
export default {
name: "ActivityPlan",
inject: ["setMenuName"],
components: {
useTable,
planDetail
},
data () {
const _this = this;
return {
showStoreName: "",
isShow: false,
loading: false,
isShowDetail: false,
totalSize: 0,
pageNum: 1,
detail: {},
pageSize: 10,
saving: false,
data: [],
rowData: {},
companyList: [],
customerId: null,
shopList: [],
showUse: false,
activityInstance: {},
qrCodeImage: "",
formValidate: {
date: null,
organizationId: null,
storeId: null,
status: 2,
startDate: null,
endDate: null
},
startDateOptions: {},
endDateOptions: {},
activityData: [
{
activityStatus: "进行中"
},
{
activityStatus: "已结束"
}
],
activityStatusList: [
{
label: "全部",
value: 0
},
{
label: "进行中",
value: 2
},
{
label: "未开始",
value: 1
},
{
label: "已结束",
value: 3
}
],
columns1: [
{
width: 60,
align: "center",
title: "序号",
render (h, params) {
let num = parseInt(params.index) + 1;
console.log(_this.pageSize);
if (_this.pageSize > 1) {
num += (_this.pageNum - 1) * _this.pageSize;
}
return h("span", num);
}
},
{
title: "活动名称",
key: "name"
},
{
title: "活动类型",
key: "scheduleVO.name",
render (h, params) {
return h("span", params.row["params"][0]["name"]);
}
},
{
title: "活动时间",
key: "beginTime",
width: 230,
render (h, params) {
return h("span", params.row.beginTime + " - " + params.row.endTime);
}
},
{
title: "零售公司",
key: "shop",
render (h, params) {
return h(
"span",
params.row.companyName +
"等" +
(params.row.companyCount || 0) +
"家公司"
);
}
},
{
title: "店铺",
key: "shop",
render (h, params) {
return h(
"span",
params.row.storeName +
"等" +
(params.row.storeCount || 0) +
"家店铺"
);
}
},
{
title: "添加好友数",
key: "addFriendNum",
render (h, params) {
return h("span", (params.row.friendCount || 0) + "人");
}
},
{
title: "参与活动客户数",
key: "joinActivityClientNum",
render (h, params) {
return h("span", (params.row.customerCount || 0) + "人");
}
},
{
title: "活动码",
slot: "qrCodeAction",
className: "table-width-80"
// render (h, p) {
// return h(
// "Button",
// {
// props: { type: "primary", size: "small" },
// on: { click: () => _this.navigateCode(p.row) }
// },
// "查看详情"
// );
// }
},
{
title: "活动状态",
key: "status",
render (h, p) {
const status = p.row.status;
if (status === 1) return h("span", "未开始");
if (status === 2) return h("span", "进行中");
if (status === 3) return h("span", "已结束");
if (status === 4) return h("span", "取消");
}
},
{
title: "操作",
slot: "action",
width: 200
// render (h, p) {
// let r = [
// h(
// "Button",
// {
// props: { type: "primary", size: "small" },
// style: { marginRight: "8px" },
// on: {
// click: () => _this.stop(p.row)
// }
// },
// "终止"
// ),
// h(
// "Button",
// {
// props: { type: "primary", size: "small" },
// on: { click: () => _this.modify(p.row) }
// },
// "修改"
// )
// ];
// if (p.row.status > 2) {
// delete r[0];
// }
// return h("div", r);
// }
}
]
};
},
mounted () {
this.setMenuName("活动管理", "活动计划");
this.getCompanyInfo();
this.getShopInfo();
this.searchTable();
},
methods: {
doShow (show) {
this.showUse = show;
this.searchTable();
},
showDetail (detail) {
let _this = this;
this.getDetail(detail.id).then(res => {
_this.detail = res;
_this.isShowDetail = true;
});
},
getCompanyInfo () {
let that = this;
let data = {
userId: JSON.parse(sessionStorage.getItem("loginInfo")).userId
};
ActivityManager.getCompany(data, function (data) {
that.companyList = [];
data.data.results.forEach(element => {
that.companyList.push({
label: element.name,
value: element.id
});
});
});
},
selectCompany (value) {
this.customerId = value;
this.getShopInfo();
},
getShopInfo () {
let that = this;
let data = {
userId: JSON.parse(sessionStorage.getItem("loginInfo")).userId,
customerIds: this.customerId,
scheduleId: null
};
ActivityManager.getShop(data, function (data) {
that.shopList = [];
data.data.results.forEach(element => {
that.shopList.push({
label: element.name,
value: element.id
});
});
});
},
handlePage: function (value) {
this.pageNum = value;
this.searchTable();
},
stop (instance) {
if (instance.status > 2) {
return;
}
let _this = this;
this.$Modal.confirm({
title: "您确认要终止?",
content: "终止之后不可恢复",
onOk: () => {
this.saving = true;
ActivityManager.instanceTerminate(
{ instanceId: instance.id },
res => {
_this.saving = false;
if (res.data.success == undefined || !res.data.success) {
_this.$Message.error("终止失败!");
} else {
_this.searchTable();
}
}
);
},
onCancel: () => { }
});
},
getDetail (instanceId) {
return new Promise((resolve, reject) => {
ActivityManager.instanceDetail(
{
instanceId
},
res => {
resolve(res.data.results);
}
);
});
},
modify (instance) {
let _this = this;
this.getDetail(instance.id).then(res => {
store.commit("SET_useData", res);
_this.activityInstance = res;
_this.showUse = true;
});
},
navigateCode (instance) {
this.$router.push({
path: "/activity/plan/code",
query: { instanceId: instance.id }
});
},
searchTable (params = {}) {
this.loading = true;
if (
this.formValidate.date !== null &&
this.formValidate.date.length > 1
) {
if (this.formValidate.date[0] !== "") {
this.formValidate.startDate = formatDate(this.formValidate.date[0]);
} else {
this.formValidate.startDate = undefined;
}
if (this.formValidate.date[1] !== "") {
this.formValidate.endDate = formatDate(this.formValidate.date[1]);
} else {
this.formValidate.endDate = undefined;
}
}
params.pageNum = this.pageNum;
params.pageSize = this.pageSize;
params = { ...params, ...this.formValidate };
params.userId = JSON.parse(sessionStorage.getItem("loginInfo")).userId;
if (params.status == 0) {
params.status = undefined;
}
params.categoryCode = "promotion";
params.date = undefined;
http.get("/activity/instance/list", params).then(res => {
const data = res.data.results.this || {};
this.data = data.list || [];
this.totalSize = data.total || 0;
this.loading = false;
});
},
startDateChange: function (e) {
//设置开始时间
this.endDateOptions = {
disabledDate: date => {
let startTime = this.formValidate.startDate
? new Date(this.formValidate.startDate).valueOf()
: "";
return date && date.valueOf() < startTime;
}
};
},
endDateChange: function (e) {
//设置结束时间
let endTime = this.formValidate.endDate
? new Date(this.formValidate.endDate).valueOf() -
1 * 24 * 60 * 60 * 1000
: "";
this.startDateOptions = {
disabledDate: date => {
return date && date.valueOf() > endTime;
}
};
},
show: function (index) {
this.isShow = true;
this.showStoreName = index.name;
this.qrCodeImage = index.qrCodeAction;
this.rowData = index;
},
hide: function () {
this.isShow = false;
},
// 下载二维码
download: function (index) {
debugger;
let fileName = index.name + "-门店码";
http.downloadImg(
{
url: index.qrCodeAction
},
fileName,
function (/*data*/) { }
);
},
ok: function () {
this.isShow = false;
}
}
};
</script>
<style scoped>
.ivu-date-picker .ivu-select-dropdown {
left: 0 !important;
}
.table-width-80 {
width: 80px !important;
}
.router-btn {
border: none;
color: #3496eb !important;
margin-left: -15px;
}
.router-btn.disable {
color: #999 !important;
}
.table-img-qr-code {
margin-left: 5px;
margin-top: 5px;
width: 30px;
height: 30px;
}
button:hover {
background: inherit !important;
}
</style>