Commit 90e7e103 by chenxin

fix: 卡券包

parent df4f9179
......@@ -8,18 +8,22 @@ import { welfarePrefix } from '@/config';
// 卡券包
let packages = {
savePackages: {
// 新增、编辑卡券包 /coupon-package/save-package /coupon-package/edit-package TODO:
// 新增、编辑卡券包 /coupon-package/save-package /coupon-package/edit-package
url: '/coupon-package/{type}-package', // edit add
method: 'post',
useFormData: true,
rest: true
},
pageCouponPackage: '/page-package', // 获取卡券包列表
pagePackageLog: '/coupon-package/page-package-log', // 卡券包领取记录 TODO:
pageCouponPackage: '/coupon-package/page-package', // 获取卡券包列表
pagePackageLog: '/coupon-package/page-package-log', // 卡券包发放记录
packageCouponReceiveLog: '/coupon-package/package-coupon-receive-log', // 卡券领取记录详情 TODO:
getPackageDetail: '/coupon-package/get-package-detail', // 获取卡券包详情 TODO:
deletePackage: '/coupon-package/delete-package', // 删除某个卡券包 TODO:
getPackageDetail: '/coupon-package/package-detail', // 获取卡券包详情
deletePackage: '/coupon-package/batch-del-package', // 删除某个卡券包
optPackageStock: '/coupon-package/opt-package-stock', // 调整卡券包库存 TODO:
addPackageItem: '/coupon-package/add-package-item', // 往卡券包里添加卡券
EditPackageItem: '/coupon-package/del-package-item', // 往卡券包里删除卡券
listCouponByPackageId: '/coupon-package/list-coupon', // 根据卡券包id获取卡券列表
};
packages = getFetch(packages, welfarePrefix);
......
......@@ -31,13 +31,13 @@ export default [
},
// 卡券包领取记录
{
path: 'record-list',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/record-list.vue'),
path: 'send-list',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/send-list.vue'),
},
// 卡券包同步记录
// 卡券包领取详情
{
path: 'sync-list',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/sync-stock-list.vue'),
path: 'send-info',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/send-info.vue'),
},
],
},
......
......@@ -3,8 +3,9 @@
<div class="clearfix flex-center pb20">
<span class="gray01 fz16 mr20">卡券包筛选</span>
<el-select v-model="listParams.useStatus" class="w160 mr10" placeholder="全部状态" clearable @change="refresh">
<el-option label="使用中" :value="1"></el-option>
<el-option label="已生效" :value="1"></el-option>
<el-option label="已过期" :value="2"></el-option>
<el-option label="已失效" :value="3"></el-option>
</el-select>
<el-input prefix-icon="el-icon-search" placeholder="请输入卡券名称/备注名" class="w300 mrAuto" v-model="listParams.search" clearable @change="refresh" />
<dm-perm-button :disabled="$itemPerm($itemCode.gicAddPackage)" type="primary" @click="$router.push('/card-package/add')">新建卡券包</dm-perm-button>
......@@ -67,31 +68,43 @@
</el-table-column>
<el-table-column label="卡券包状态" min-width="120">
<template slot="header">
<el-tooltip content="tooltip" placement="top" open-delay="200">
<el-tooltip placement="top" open-delay="200">
<div slot="content">使用中:在福利组件中展示;<br/>已过期:在福利组件中不展示;</div>
<span class="tooltip-icon">卡券包状态</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<span class="state-point state-point-loading-scale" v-if="scope.row.useStatus == 1">使用中</span>
<span class="state-point state-point-default
" v-if="scope.row.useStatus == 2">已过期</span>
<template v-if="scope.row.totalCouponSize < 2">
<span class="state-point state-point-warning">未生效</span>
</template>
<template v-else>
<span class="state-point state-point-loading-scale" v-if="scope.row.useStatus == 1">已生效</span>
<span class="state-point state-point-default" v-if="scope.row.useStatus == 2">已过期</span>
<span class="state-point state-point-default" v-if="scope.row.useStatus == 3">已失效</span>
</template>
</template>
</el-table-column>
<el-table-column label="操作" align="left" width="130px" fixed="right">
<el-table-column label="操作" align="left" width="210px" fixed="right">
<template slot-scope="scope">
<!-- <dm-perm-button type="text" :disabled="$itemPerm($itemCode.gicSyncStockPack)" @click="showSyncStock(scope.row)">同步</dm-perm-button> -->
<dm-perm-button type="text" :disabled="$itemPerm($itemCode.gicEditPackage)" @click="$router.push(`/card-package/edit?id=${scope.row.couponPackageId}`)">编辑</dm-perm-button>
<dm-delete @confirm="delOne(scope.row)">
<dm-perm-button type="text" :disabled="$itemPerm($itemCode.gicDeletePackage)">删除</dm-perm-button>
</dm-delete>
<dm-perm-button type="text" @click="$router.push(`/card-package/edit?id=${scope.row.couponPackageId}`)">编辑</dm-perm-button>
<dm-perm-button type="text" @click="$router.push(`/card-package/edit?id=${scope.row.couponPackageId}`)">发放记录</dm-perm-button>
<el-popover popper-class="option-dropdown" trigger="hover">
<ul>
<li v-if="scope.row._status == 2">
<dm-perm-button @click="$router.push(`/card-package/edit?id=${scope.row.couponPackageId}`)" type="text">库存记录</dm-perm-button>
</li>
<li :class="{ disabled: $itemPerm($itemCode.gicDeletePackage) }">
<dm-perm-button @click="delOne(scope.row)" :disabld="$itemPerm($itemCode.gicDeletePackage)" type="text">删除</dm-perm-button>
</li>
</ul>
<el-button type="text" slot="reference" class="ml20">更多<i class="ml5 el-icon-arrow-down"></i></el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<div class="clearfix">
<dm-pagination class="fr mb0" v-if="tableList.length" background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
<sync-stock :visible.sync="syncStock.visible" :coupon-package-id="syncStock.couponPackageId" :type="1" @syncSuccess="getTableList" /><!-- 同步库存 -->
<adjust-stock ref="adjust" :show.sync="adjust.stock" :total-count="adjust.remainedStock" @handleSubmit="adjustStockBack" /><!-- 调整库存 -->
</div>
</template>
......@@ -99,8 +112,8 @@
<script>
import sortBtn from '@/components/sort/btn.vue';
import adjustStock from '@/components/libs/adjust-stock';
import syncStock from './module/sync-stock-package';
import { page, formate } from '@/mixins/table.js';
import { showConfirm } from '@/utils/common';
import api from '@/api/card-package.js';
import { formatDateTimeByType } from '@/utils/index.js';
const { pageCouponPackage, deletePackage, optPackageStock } = api;
......@@ -108,7 +121,6 @@ export default {
name: 'CardPackageList',
components: {
adjustStock,
syncStock,
sortBtn
},
mixins: [ page, formate ],
......@@ -139,10 +151,6 @@ export default {
couponPackageId: '',
stock: false,
},
syncStock: { // 同步dialog
visible: false,
couponPackageId: '',
},
};
},
created() {
......@@ -159,17 +167,28 @@ export default {
this.refresh();
},
// 删除
delOne({ couponPackageId }) {
del(couponPackageIds) {
this.loading = true;
deletePackage({ couponPackageId }).then(res => {
deletePackage({ couponPackageId: couponPackageIds.join(',') }).then(res => {
this.loading = false;
this.getTableList();
}).finally(() => {
this.loading = false;
});
},
// 删除卡券
delOne({ couponPackageId }) {
showConfirm('<div>删除卡券包后不可找回,确认删除该卡券包?</div>', () => {
this.del([ couponPackageId ]);
});
},
// 批量删除
mutiDel() {
showConfirm('<div>删除卡券包后不可找回,确认批量删除?</div>', () => {
this.del(this.multipleSelection.map(v => v.couponPackageId));
});
},
getTableList() {
return;
if(this.loading) {
return;
}
......@@ -191,11 +210,6 @@ export default {
});
},
// *************子组件相关方法***************
// 同步
showSyncStock({ couponPackageId }) {
this.syncStock.visible = true;
this.syncStock.couponPackageId = couponPackageId;
},
// 编辑库存 前置
preAdjustStock({ couponPackageId, remainedStock }) {
this.adjust.stock = true;
......
......@@ -24,7 +24,7 @@
<script>
// 卡券包同步
import api from '@/api/gic-card';
import api from '@/api/card-package';
const { syncStock, getWelfareStock, getCouponStockInfo, returnStock } = api;
export default {
name: 'SyncStock',
......
......@@ -24,7 +24,7 @@
<script>
// 卡券同步
import api from '@/api/gic-card';
import api from '@/api/card-package';
const { syncStock, getWelfareStock, getCouponStockInfo, returnStock } = api;
export default {
name: 'SyncStock',
......
......@@ -43,7 +43,7 @@
<script>
import { page, formate } from '@/mixins/table.js';
import { listTime } from '@/utils/index.js';
import api from '@/api/gic-card.js';
import api from '@/api/card-package.js';
const { couponLogPage, packageCouponReceiveLog } = api;
export default {
name: 'MergeRecordList',
......
<template>
<div class="p20" v-loading="loading">
<div class="pb20 clearfix flex-center">
<el-select v-model="listParams.sendStatus" class="w250 mr10" placeholder="全部发放状态" clearable @change="refresh">
<el-option label="成功" :value="1"></el-option>
<el-option label="失败" :value="0"></el-option>
</el-select>
<el-input placeholder="请输入关键字搜索" class="w400 mr10" v-model="listParams.search" clearable @change="refresh">
<el-select v-model="listParams.searchType" slot="prepend" style="width:120px;" placeholder="请选择" @change="refresh">
<el-option label="福利ID" :value="1"></el-option>
<el-option label="卡券包名称" :value="2"></el-option>
<el-option label="备注名" :value="3"></el-option>
<el-option label="副标题" :value="4"></el-option>
<el-option label="会员称呼" :value="5"></el-option>
<el-option label="会员手机号" :value="6"></el-option>
</el-select>
</el-input>
<el-select v-model="listParams.appCode" class="w250 mr10" placeholder="全部来源" clearable @change="refresh">
<el-option label="成功" :value="1"></el-option>
<el-option label="失败" :value="0"></el-option>
</el-select>
<el-input class="vertical-middle w300" v-model="listParams.activityName" clearable placeholder="请输入活动名称搜索" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<div class="table-search-head">
发放时间:<el-date-picker class="w350 mr10" v-model="dateTime" type="daterange" range-separator="~" start-placeholder="领取开始日期" end-placeholder="领取结束日期" @change="refresh"></el-date-picker>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<el-table-column label="会员信息" fixed="left" min-width="120px">
<template slot-scope="scope">
<member-info :member-name="scope.row.memberName" :member-image="scope.row.memberImage" :member-phone="scope.row.memberPhone || scope.row.memberCardNo"></member-info>
</template>
</el-table-column>
<el-table-column label="发放时间" min-width="120px">
<template slot-scope="scope">
<div v-html="listTime(scope.row.createTime)"></div>
</template>
</el-table-column>
<el-table-column prop="appName" label="履约单号" min-width="120px"></el-table-column>
<el-table-column prop="couponPackageName" label="卡券包名称" min-width="130px">
<template slot-scope="scope">
<span :title="scope.row.couponPackageId" p-key="couponPackageId">{{ scope.row.couponPackageName }}</span>
</template>
</el-table-column>
<el-table-column prop="couponPackageName" label="卡券数量" min-width="130px">
<template slot="header">
<el-tooltip placement="top" content="卡券包中会员真实领取的卡券数量" open-delay="200">
<span class="tooltip-icon">卡券数量</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<el-button type="text" @click="showDetail(scope.row)">{{ scope.row.couponSize }}</el-button>
</template>
</el-table-column>
<el-table-column label="来源" min-width="150px">
<template slot-scope="scope">
<el-button type="text">{{ scope.row.appName || '--' }}</el-button>
<el-button type="text">{{ scope.row.activityName || '--' }}</el-button>
</template>
</el-table-column>
</el-table>
<div class="clearfix">
<dm-pagination class="fr mb0" v-if="tableList.length" background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
</div>
</template>
<script>
import { page, formate } from '@/mixins/table.js';
import { listTime } from '@/utils/index.js';
import api from '@/api/card-package.js';
const { pagePackageLog } = api;
export default {
name: 'MergeRecordList',
mixins: [ page, formate ],
data() {
return {
loading: false,
dateTime: [],
listParams: {
appCode: '',
activityName: '',
sendStatus: '',
beginTime: '',
endTime: '',
packageName: '',
search: '',
searchType: 2,
currentPage: 1,
pageSize: 20
},
tableList: [],
total: 0,
detail: '',
mask: {
show: false
}
};
},
created() {
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券包', breadPath: '/card-package/list' }, { breadName: '卡券包发放记录' } ]);
},
mounted() {
this.getTableList();
},
methods: {
listTime,
showDetail({ packageLogId }) {
return;
},
getTableList() {
if(this.loading) {
return;
}
this.loading = true;
this.formatterTimeFunc('beginTime', 'endTime', 'yyyy-MM-dd', 'dateTime');
let params = { ...this.listParams, memberCardId: this.currentAreaId };
pagePackageLog(params).then(res => {
this.loading = false;
const data = res.result;
console.log(data.result);
this.tableList = data.result || [];
this.total = data.totalCount;
// 删除至最后一页没数据的情况,页码-1
if (this.tableList.length === 0 && this.listParams.currentPage !== 1) {
this.listParams.currentPage -= 1;
this.getTableList();
}
}).finally(() => {
this.loading = false;
});
}
},
};
</script>
<template>
<div class="p20" v-loading="loading">
<div class="pb20 clearfix flex-center">
<el-date-picker class="w250 mr10" v-model="dateTime" type="daterange" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="refresh"></el-date-picker>
<el-select class="dm-select w140 mr10" clearable v-model="listParams.optType" placeholder="所有操作类型" @change="refresh">
<el-option v-for="(v, i) in optType" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-select class="dm-select w140 mrAuto" clearable v-model="listParams.status" placeholder="所有状态" @change="refresh">
<el-option v-for="(v, i) in syncStatus" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-button @click="syncStock.type = 2; syncStock.visible = true;">返还</el-button>
<!-- <el-button @click="toWelfare">查看</el-button> -->
<el-button type="primary" @click="syncStock.type = 1; syncStock.visible = true;">同步</el-button>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<template>
<el-table-column v-for="(v, i) in tableHeader" :fixed="v.fixed" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter" :sortable="v.sortable">
<template slot-scope="scope">
<span v-if="v.formatter" v-html="v.formatter(scope.row)"></span>
<span v-else>{{ scope.row[v.prop] }}</span>
</template>
</el-table-column>
</template>
</el-table>
<div class="clearfix">
<dm-pagination class="fr mb0" v-if="tableList.length" background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
<!-- 同步库存 -->
<sync-stock :visible.sync="syncStock.visible" :coupon-id="couponId" :type="syncStock.type" :show-link="false" @syncSuccess="getTableList" />
</div>
</template>
<script>
import { page, formate } from '@/mixins/table.js';
import { listTime } from '@/utils/index.js';
import { cardType, syncStatus } from '@/config/mapping/gic-card';
import fetch from '@/api/gic-card.js';
import syncStock from './module/sync-stock';
const { getSyncWelfareList } = fetch;
export default {
name: 'SyncStockList',
components: {
syncStock
},
mixins: [ page, formate ],
props: {
dialogVisible: {
type: Boolean,
default: false
}
},
data() {
return {
loading: false,
couponId: this.$route.query.couponId,
syncStock: {
visible: false,
type: 1,
},
couponInfo: {}, // 卡券信息
dateTime: [ , ],
listParams: {
couponId: this.$route.query.couponId,
optType: '',
beginTime: '',
endTime: '',
status: '',
currentPage: 1,
pageSize: 20
},
optType: [ { label: '同步', value: 1 }, { label: '返还', value: 2 } ],
syncStatus: Object.keys(syncStatus).map(v=> { return syncStatus[v]; }),
tableList: [],
total: 0,
tableHeader: [
{
label: '操作时间',
minWidth: '120',
align: 'left',
fixed: 'left',
formatter: function(row) {
return listTime(row.modifyTime);
}
},
{
label: '卡券',
minWidth: '120',
align: 'left',
formatter: (row) => {
const _cardType = cardType[this.couponInfo.cardType] || {};
return `<p class="fz14">${this.couponInfo.cardName}</p><p class="fz12">${_cardType.label}</p>`;
}
},
{
label: '操作类型',
align: 'left',
minWidth: '120',
formatter: function(row) {
// 1: 同步; 2: 返还
return row.modifyType === 1 ? '同步' : '返还';
}
},
{
label: '调整库存',
minWidth: '120',
align: 'left',
formatter: function(row) {
return (row.modifyType === 1 ? '- ' : '+ ') + row.modifyStock;
}
},
// { label: '操作人', prop: 'cardName', align: 'left', minWidth: '120' },
// {
// label: '状态',
// minWidth: '120',
// align: 'left',
// formatter: function(row) {
// return '??????';
// }
// }
]
};
},
created() {
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券包', breadPath: '/card-package/list' }, { breadName: '同步记录' } ]);
},
mounted() {
if(this.currentAreaId && this.couponId) {
this.getTableList();
}
},
methods: {
toWelfare() {
window.open(`/welfare/stock/log/list?id=${this.couponInfo.welfareId}`);
},
getTableList() {
if(this.loading) {
return;
}
this.loading = true;
this.formatterTimeFunc('beginTime', 'endTime');
let params = { ...this.listParams, ...{ memberCardId: this.currentAreaId } };
getSyncWelfareList(params).then(res => {
this.loading = false;
const data = res.result.page;
this.couponInfo = res.result.coupon || {};
this.tableList = data.result || [];
this.total = data.totalCount;
// 删除至最后一页没数据的情况,页码-1
if (this.tableList.length === 0 && this.listParams.currentPage !== 1) {
this.listParams.currentPage -= 1;
this.getTableList();
}
}).finally(() => {
this.loading = false;
});
}
},
};
</script>
......@@ -9,7 +9,7 @@
<div class="content" v-show="active ===1">
<el-form :model="ruleForm1" :rules="rules1" class="ruleForm1" ref="ruleForm1" label-width="200px">
<el-form-item>
<el-tooltip open-delay="200" slot="label" content="请在左上角切换子应用以更换适用会员卡" placement="top">
<el-tooltip open-delay="200" slot="label" content="请在应用左上角切换会员卡" placement="top">
<span class="tooltip-icon">适用会员卡</span>
</el-tooltip>
{{ $store.state.currentAreaName || '--' }}
......
......@@ -13,7 +13,7 @@
<el-option label="demo券号" :value="4"></el-option>
</el-select>
</el-input>
<el-select v-model="listParams.status" class="w160 mrAuto" placeholder="全部状态" clearable @change="refresh">
<el-select v-model="listParams.couponStatus" class="w160 mrAuto" placeholder="全部状态" clearable @change="refresh">
<el-option label="使用中" :value="1"></el-option>
<el-option label="已过期" :value="2"></el-option>
<el-option label="已禁用" :value="3"></el-option>
......@@ -165,7 +165,7 @@ export default {
dateTime: [ , ],
sortType1: '',
listParams: {
status: '',
couponStatus: '',
searchType: 1,
search: '',
cardType: '',
......@@ -359,17 +359,19 @@ export default {
// 删除卡券
delData(val) {
showConfirm('<div>删除后卡券不可找回,确认删除该卡券?</div>', () => {
this.deleteCard(val);
this.deleteCard([ val ]);
});
},
// 批量删除
mutiDel() {
showConfirm('<div>已添加被删除卡券的活动将会失效,确认删除?</div>', () => {});
showConfirm('<div>已添加被删除卡券的活动将会失效,确认删除?</div>', () => {
this.deleteCard(this.multipleSelection.map(v => v.couponId));
});
},
// 删除卡券
deleteCard(couponId) {
deleteCard(couponIds) {
this.loading = true;
deleteCard({ couponId }).then(res => {
deleteCard({ couponIds: couponIds.join(',') }).then(res => {
this.$tips({ type: 'success', message: '删除成功!' });
this.loading = false;
this.getTableList();
......
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