Commit 4e7fb094 by 萱草

Merge branch 'dev' of http://git.gicdev.com/dm4/welfare into feature/福利中心-礼品管理

parents 19216202 46404f62
......@@ -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);
......
......@@ -47,7 +47,7 @@ import commonApi from '@/api/common.js';
const menuList = {};
import { reRreshRoute, formatDateTimeByType } from '@/utils/index';
import { dealMkStorage } from '@/utils/common';
import asideMenu from '@/components/asidemenu/index';
import asideMenu from './aside-menu.vue';
const { getAppInfo, loginUserMenuOfApp, getSubappList } = commonApi;
......
......@@ -45,7 +45,7 @@
<script>
import { mapState } from 'vuex';
import asideMenu from '@/components/asidemenu/index';
import asideMenu from './aside-menu.vue';
import switchPage from '@/components/libs/switch-page';
import { dealMkStorage } from '@/utils/common';
import commonApi from '@/api/common.js';
......
<template>
<el-dialog title="活动统计" :visible.sync="dialogVisible" width="800px" @close="close">
<div class="mb20">
<el-select class="mr10 w140" clearable v-model="listParams.appCode" placeholder="全部应用" @change="refresh">
<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 class="mr10 w300" v-model="listParams.activityName" clearable placeholder="请输入活动名称搜索" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<el-table-column prop="couponCode" label="活动应用名称" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="活动名称" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="可用库存" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="历史履约库存" min-width="120"> </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>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
</span>
</el-dialog>
</template>
<script>
import { page } from '@/mixins/table.js';
export default {
mixins: [ page ],
props: {
dialogVisible: {
default: false,
type: Boolean
},
welfareId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
listParams: {
appCode: '',
activityName: '',
currentPage: 1,
pageSize: 20
},
total: 0,
tableList: [],
};
},
methods: {
close() {
this.$emit('update:dialogVisible', false);
},
getTableList() {
return;
}
},
watch: {
dialogVisible(val) {
val && this.getTableList();
}
}
};
</script>
\ No newline at end of file
<template>
<div class="p20" v-loading="loading">
<div class="pb20 clearfix flex-center">
<welfare-item :welfare-id="$route.query.id"></welfare-item>
</div>
<div style="height:20px;width:calc(100% + 40px);position:relative;left:-20px;" class="bg-color mb20"></div>
<div>
<p class="fz16 mb15">操作记录<span class="fz12 ml10 gray03">主要对手动调整库存,应用占用库存,应用释放库存的场景下对福利“可占库存”引起变更进行记录</span></p>
<div class="table-search-head">
<el-select class="mr10 w140" clearable v-model="listParams.status" placeholder="全部操作类型" @change="refresh">
<el-option v-for="item in stockAdjustStatus" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-select class="mr10 w140" clearable v-model="listParams.status" placeholder="全部应用" @change="refresh">
<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 class="mr10 w300" v-model="listParams.activityName" clearable placeholder="请输入活动名称搜索" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-date-picker class="w300 mr10" v-model="dateTime" type="daterange" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="refresh"></el-date-picker>
</div>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<el-table-column prop="giveTime" label="操作时间" min-width="120">
<span slot-scope="scope" v-html="listTime(scope.row.createTime)"></span>
</el-table-column>
<el-table-column label="调整类型" min-width="120" fixed="left">
<span slot-scope="scope">{{ scope.row.type | fType }}</span>
</el-table-column>
<el-table-column prop="couponCode" label="调整数量" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="可占库存" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="操作人" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="调整应用" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="活动名称" min-width="120"> </el-table-column>
<el-table-column prop="couponCode" label="备注" min-width="140" show-overflow-tooltip> </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 fetch from '@/api/gic-card.js';
import { cardType } from '@/config/mapping/gic-card';
import { stockAdjustStatus } from '@/config/mapping/common';
import welfareItem from './welfare-item';
const { giveLogList } = fetch;
export default {
name: 'SendList',
components: {
welfareItem,
},
mixins: [ page, formate ],
props: {
welfareId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
dateTime: [ , ],
listParams: {
appCode: '',
activityName: '',
receiveBeginTime: '',
receiveEndTime: '',
currentPage: 1,
pageSize: 20
},
stockAdjustStatus: Object.keys(stockAdjustStatus).map(v => { return { label: stockAdjustStatus[v], value: v }; }),
total: 0,
tableList: [],
};
},
created() {
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券' }, { breadName: '卡券日志' }, { breadName: '转赠记录' } ]);
},
mounted() {
this.getTableList();
},
methods: {
listTime,
// formatSendStatus(row) {
// const st = sendType[row.status];
// if(st) {
// return `<span class="state-point ${st.cl}">${st.label || '--'}</span>`;
// } else {
// return '<span class="state-point state-point-default">未知状态</span>';
// }
// },
formatCardType(row) {
return cardType[row.cardType].label;
},
getTableList() {
return;
if(this.loading) {
return;
}
this.loading = true;
this.formatterTimeFunc('giveBeginTime', 'giveEndTime', 'yyyy-MM-dd', 'dateTime');
let params = { ...this.listParams, memberCardId: this.currentAreaId };
// TODO: search
giveLogList(params).then(res => {
this.loading = false;
const data = res.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;
});
},
},
filter: {
fType(v) {
return stockAdjustStatus[v] || '未知操作';
}
}
};
</script>
<template>
<div class="welfare-item">
<div class="head">
<el-tag type="success" class="mr10">使用中</el-tag>
<label>更新时间:</label>2020-12-21 12:12:12<label class="ml30">福利ID:</label>567856785678567867867
</div>
<div class="content">
<div>
<p>100元卡券(线下)</p>
<p class="gray03 fz12">100元卡券(线下)</p>
<p class="gray03 fz12">创建时间:2020-12-12 12:12:12</p>
</div>
<div>
<p>成本:¥12.00</p>
<p>可占库存:1000</p>
</div>
<div style="position:relative;">
<p>已占用:200</p>
<p>总库存:1200</p>
<p>已履约:140</p>
<el-tag style="position:absolute;right:20px;top:20px;">实际库存</el-tag>
</div>
<div style="flex-shrink: 0;width:100px;">
<el-button type="primary" class="fr mr20" @click="dialogVisible = true">活动记录</el-button>
</div>
</div>
<el-table :data="skuList" style="width: calc(100% - 40px)" max-height="200" class="ml20 mr20 mb10">
<el-table-column prop="num" label="SKU信息" min-width="150"></el-table-column>
<el-table-column prop="num" label="SKU编码" min-width="150"></el-table-column>
<el-table-column prop="num" label="总库存" min-width="150"></el-table-column>
<el-table-column prop="num" label="已占用" min-width="150"></el-table-column>
<el-table-column prop="num" label="可占库存" min-width="150"></el-table-column>
<el-table-column prop="num" label="已履约" min-width="150"></el-table-column>
</el-table>
<act-dialog :dialog-visible.sync="dialogVisible" :welfare-id="$route.query.id"></act-dialog>
</div>
</template>
<script>
import actDialog from './dialog';
export default {
name: 'WelfareItem',
components: {
actDialog
},
props: {
welfareId: {
type: String,
required: true
}
},
data() {
return {
info: {},
dialogVisible: false,
skuList: Array(5).fill({ num: 50 })
};
},
methods: {
getWelfareInfo() {
console.log('info');
}
},
watch: {
welfareId: {
handler() {
this.getWelfareInfo();
},
immediate: true,
},
}
};
</script>
<style lang="scss" scope>
.welfare-item {
width: 100%;
border: 1px solid $gray-tab;
background: white;
.head {
font-size: 13px;
background: $gray-thead;
color: $gray01;
height: 40px;
line-height: 40px;
padding: 0 20px 0;
border-bottom: 1px solid $gray-tab;
label {
color: $gray02;
}
&-type {
margin-right: 20px;
min-width: 100px;
}
}
.content {
height: 115px;
overflow: hidden;
padding: 0;
display: flex;
> div {
margin-left: 20px;
padding-top: 20px;
flex: 1;
line-height: 28px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="main-content">
<div class="main-content-head">
<welfare-item :welfare-id="welfareId" />
</div>
<div class="main-content-bodys" v-loading="loading">
<div class="pb20 pt5 clearfix flex-center search">
<label class="mr8 cursor">操作时间</label>
<el-date-picker class="mr10" v-model="dateTime" type="datetimerange" :default-time="['00:00:00', '23:59:59']" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="refresh" />
<label class="ml15 mr8">库存</label>
<el-input-number class="hide-right w100" @change="refresh" v-model="listParams.modifyStockMin" controls-position="right" :precision="0" :min="1" :max="10000" placeholder="请输入" />
<label class="ml5 mr5">-</label>
<el-input-number class="hide-right w100 mr15" @change="refresh" v-model="listParams.modifyStockMax" controls-position="right" :precision="0" :min="1" :max="100000" placeholder="请输入" />
<el-select class="w220 mrAuto" collapse-tags clearable v-model="listParams.activityIdList" placeholder="所有营销活动" multiple @change="refresh">
<el-option v-for="(v, i) in activityList" :key="i" :label="v.activityName" :value="v.activityId"></el-option>
</el-select>
<!-- <el-button type="primary" icon="iconfont-market4 icon-icon_yunxiazai">下载</el-button> -->
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%" @sort-change="handleSort">
<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-if="v.famount">{{ scope.row[v.prop] | amountFormat(null, 0, null) }}</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" hide-on-single-page 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>
</div>
</template>
<script>
import { page, formate } from '@/mixins/table.js';
// import welfareItem from './welfare-item';
import { listTime } from '@/utils/index.js';
// import api from '@/api/welfare';
// const { stockLogList, activityListByWfId } = api;
export default {
name: 'StockLogList',
// components: {
// welfareItem
// },
mixins: [ page, formate ],
data() {
return {
loading: false,
welfareId: this.$route.query.id,
dateTime: [ , ],
listParams: {
search: '',
welfareId: this.$route.query.id,
modifyLogId: '',
modifyTimeBegin: '',
modifyTimeEnd: '',
modifyStockMin: undefined,
modifyStockMax: undefined,
currentPage: 1,
pageSize: 20,
},
activityList: [],
total: 0,
tableList: [],
tableHeader: [
{ label: '库存调整记录ID', prop: 'modifyLogId', align: 'left', minWidth: '140', fixed: 'left' },
{
label: '操作时间',
minWidth: '120',
align: 'left',
prop: 'modifyTime',
sortable: true,
formatter: function(row) {
return listTime(row.modifyTime);
}
},
{
label: '调整库存',
minWidth: '120',
align: 'left',
sortable: true,
formatter: function(row) {
return 1;
}
},
{
label: '调整类型',
minWidth: '120',
align: 'left',
formatter: function(row) {
return 0;
}
},
{ label: '总库存', prop: 'afterTotalStock', align: 'left', minWidth: '120' }
]
};
},
mounted() {
this.getTableList();
this.activityListByWfId();
},
methods: {
handleSort() {
console.log('sort');
},
// 获取福利列表
getTableList() {
// if(this.loading) {
// return;
// }
// this.loading = true;
// this.formatterTimeFunc('modifyTimeBegin', 'modifyTimeEnd', 'yyyy-MM-dd-HH-mm-ss');
// const params = { ...this.listParams };
// stockLogList(params).then(res => {
// this.loading = false;
// const data = res.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;
// });
},
// 获取营销活动列表
activityListByWfId() {
// activityListByWfId({ welfareId: this.welfareId }).then(res => {
// this.activityList = res.result || [];
// });
}
},
};
</script>
<template>
<div class="welfare-item">
<div class="head">
<span class="head-type">
<el-tag type="success" v-if="item.welfareType == 'wx_card'">{{ cardType[welfareType] || '--' }}</el-tag>
<el-tag v-else-if="item.welfareType == 'gic_card'">{{ cardType[welfareType] || '--' }}</el-tag>
<el-tag type="warning" v-else-if="item.welfareType == 'gift'">{{ cardType[welfareType] || '--' }}</el-tag>
<el-tag type="success" v-else>{{ cardType[welfareType] || '--' }}</el-tag>
</span>
<label>更新时间:</label>{{ formatDateTimeByType(item.updateTime) }}<label class="ml30">福利ID:</label>{{ item.welfareId }}
</div>
<div class="content clearfix wf-content">
<div class="it1">
<div class="cover-image" v-if="item.welfareType">
<dm-el-image-view class="img" :src="require(`@/assets/images/wf-${welfareType}.png`)" fit="fill" >
<div slot="error" class="image-slot">
<img class="img" :src="require('../../../assets/images/z-loading-failure.png')" draggable="false" />
</div>
</dm-el-image-view>
</div>
<dl>
<dd><span class="ellipsis" style="max-width:400px;display:inline-block;">{{ item.welfareName }}</span><label class="fr fz13">成本</label></dd>
<dt><label>停用时间:</label>{{ formatDateTimeByType(item.expiredDate) || '--' }}<span class="fr fz14">{{ item.singleCost | amountFormat }}</span></dt>
<dt><label>创建时间:</label>{{ formatDateTimeByType(item.createTime) }}</dt>
</dl>
</div>
<div class="it2">
<template v-if="item.attributeList && item.attributeList.length">
<ul>
<li v-for="(attr, idx) in item.attributeList" :key="idx"><label>{{ attr.attributeName }}</label>{{ attr.attributeValue || '--' }}</li>
</ul>
<div class="icon" v-if="item.attributeList.length > 4">
<el-tooltip open-delay="200" placement="bottom" :offset="5">
<ul slot="content">
<li v-for="(attr, idx) in item.attributeList" :key="idx"><label>{{ attr.attributeName }}</label>{{ attr.attributeValue || '--' }}</li>
</ul>
<i class="el-icon-more"></i>
</el-tooltip>
</div>
</template>
</div>
<div class="it3">
<!-- width:100% 文字溢出 -->
<el-popover open-delay="200" style="width:100%;" v-if="dealContent(item.welfareDescContent, true) > 4" width="200" trigger="hover">
<div v-html="item.welfareDescContent"></div>
<ul slot="reference" v-html="dealContent(item.welfareDescContent)"></ul>
</el-popover>
<ul v-else v-html="dealContent(item.welfareDescContent)"></ul>
</div>
<div class="it4">
<el-row :gutter="10">
<el-col :span="24" class="oh mb8">
<label>总库存:</label>{{ item.totalStock | amountFormat(null, 0, null) }}
<span class="el-tag" :class="`t${item.stockType}`">{{ stockType[item.stockType] }}</span>
</el-col>
<el-col :span="12" class="br mb8"><label>已占用:</label>{{ item.occupyStock | amountFormat(null, 0, null) }}</el-col>
<el-col :span="12" class="mb8"><label>可占用:</label>{{ item.remainedStock | amountFormat(null, 0, null) }}</el-col>
<el-col :span="12" class="br"><label>已发放:</label>{{ item.consumedStock | amountFormat(null, 0, null) }}</el-col>
<el-col :span="12"><label>未发放:</label>{{ (item.totalStock - item.consumedStock) | amountFormat(null, 0, null) }}</el-col>
</el-row>
</div>
<!-- 操作按钮插槽 -->
<slot name="option" />
</div>
</div>
</template>
<script>
import { formatDateTimeByType } from '@/utils/index';
import { cardType, stockType } from '@/config/mapping/welfare';
export default {
name: 'WelfareItem',
props: {
item: {
type: Object,
default: () => {}
}
},
data() {
return {
cardType,
stockType
};
},
methods: {
formatDateTimeByType,
dealContent(val, flag = false) {
// flag:false 返回处理后的数据
// flag:true 返回处理后数据的长度
if(!flag) {
let str = val ? val.split('<br/>').filter(v => v).map(v => {
return `<li>${v}</li>`;
}).join('') : '';
return str;
} else {
return val ? val.split('<br/>').filter(v => v).length : 0;
}
}
},
computed: {
welfareType() {
return this.item.welfareType ? this.item.welfareType.replace(/_/g, '-') : '';
}
}
};
</script>
<style lang="scss" scoped>
.welfare-item {
border: 1px solid $gray-tab;
background: white;
.head {
font-size: 13px;
background: $gray-thead;
color: $gray01;
height: 40px;
line-height: 40px;
padding: 0 20px 0;
border-bottom: 1px solid $gray-tab;
label {
color: $gray02;
}
&-type {
margin-right: 20px;
min-width: 100px;
}
}
.content {
height: 115px;
overflow: hidden;
padding: 0;
> div {
float: left;
height: 100%;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
// padding-top: 12px;
border-right: 1px solid $gray-tab;
&:last-child {
border-right: none;
}
}
label {
color: $gray02;
}
.it1 {
position: relative;
padding-left: 15px;
dl {
flex-shrink: 0;
// padding-left: 110px;
-webkit-box-flex: 1;
flex: 1;
padding-left: 10px;
padding-right: 10px;
color: $gray01;
dd {
line-height: 1;
margin-bottom: 15px;
font-size: 14px;
}
dt {
margin-bottom: 8px;
line-height: 18px;
font-size: 13px;
&:last-child {
margin-bottom: 0;
}
}
}
.cover-image {
// position: absolute;
// left: 20px;
// top: 12px;
flex-shrink: 0;
width: 80px;
height: 80px;
overflow: hidden;
border-radius: 2px;
span {
position: absolute;
background-color: $blue;
left: 0;
top: 0;
z-index: 100;
color: white;
padding: 0 4px;
line-height:20px;
font-size: 12px;
border-radius:2px 0px 6px 0px;
};
}
}
.it2 {
position: relative;
.icon {
position: absolute;
right: 0;
top: 0;
height: 100%;
width: 25px;
display: flex;
color: $blue;
align-items: center;
justify-content: center;
i {
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
cursor: pointer;
display: inline-block;
line-height: 14px;
font-size: 12px;
border: 1px solid rgb(196, 198, 207);
width: 16px;
height: 16px;
border-radius: 50%;
text-align: center;
color: $gray03;
&:hover {
color: $blue;
border-color: $blue;
}
}
}
ul {
margin-left: 10px;
margin-right: 25px;
overflow: hidden;
max-height: 80%;
li {
font-size: 13px;
color: $gray01;
line-height: 18px;
margin-bottom: 6px;
text-overflow: ellipsis;
overflow: hidden;
max-width: 100%;
white-space: nowrap;
word-wrap: normal;
&:last-child {
margin-bottom: 0;
}
}
}
}
.it3 {
padding: 12px 10px;
line-height:22px;
color: $gray01;
font-size: 13px;
/deep/ ul {
// margin-left: 10px;
// margin-right: 25px;
overflow: hidden;
max-height: 80%;
width: 100%;
li {
font-size: 13px;
color: $gray01;
line-height: 18px;
margin-bottom: 6px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
&:last-child {
margin-bottom: 0;
}
}
}
}
.it4 {
padding-left: 10px;
padding-right: 10px;
.el-tag {
&.t1 {
color: #FA8C16;
background: #FFF7E6;
border-color: #FFD591;
}
color: $blue;
background: $blue-selected;
position: absolute;
right: 0;
top: -2px;
height: 22px;
line-height: 22px;
}
label {
font-size: 13px;
}
.br {
position: relative;
&::after {
position: absolute;
width: 1px;
background: $gray-tab;
content: '';
height: 100%;
right: 10px;
top: 0;
}
}
/deep/ {
.el-row {
.el-col.oh {
overflow: visible;
}
.el-col {
position: relative;
line-height: 18px;
margin-bottom: 8px;
text-overflow: ellipsis;
overflow: hidden;
max-width: 100%;
white-space: nowrap;
word-wrap: normal;
}
}
}
}
.it5 {
padding-left: 10px;
/deep/ li {
display: block;
margin-left: 0px;
font-size: 13px;
margin-bottom: 6px;
&:last-child {
margin-bottom: 0;
}
}
}
}
.img {
width: 80px;
height: 80px;
}
}
</style>
\ No newline at end of file
......@@ -35,4 +35,12 @@ export const wfTypes = [
{ title: '虚拟礼品', desc: '文案描述文案描述文案描述', target: '/gift-manage/virtual-gift', code: 'w-virtual-gifts' },
{ title: 'GIC 卡券', desc: '文案描述文案描述文案描述', target: '/gic-card/list', code: 'w-gic-card' },
{ title: 'GIC 卡券包', desc: '文案描述文案描述文案描述', target: '/card-package/list', code: 'w-card-package' },
];
\ No newline at end of file
];
export const stockAdjustStatus = {
1: '增加',
2: '减少',
3: '占用',
4: '释放',
};
\ No newline at end of file
......@@ -31,13 +31,8 @@ export default [
},
// 卡券包领取记录
{
path: 'record-list',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/record-list.vue'),
},
// 卡券包同步记录
{
path: 'sync-list',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/sync-stock-list.vue'),
path: 'send-list',
component: () => import(/* webpackChunkName: "card-package" */'@/views/card-package/send-list.vue'),
},
],
},
......
......@@ -17,6 +17,9 @@ export default [
{
path: 'member-get',
component: () => import(/* webpackChunkName: "gic-card" */'@/views/gic-card/member-get.vue'),
meta: {
path: '/gic-card/list'
}
},
// 库存记录
{
......
......@@ -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',
......
<template>
<div class="p20" v-loading="loading">
<div class="pb20 clearfix flex-center">
<el-date-picker class="w350 mr10" v-model="dateTime" type="daterange" range-separator="~" start-placeholder="领取开始日期" end-placeholder="领取结束日期" @change="refresh"></el-date-picker>
<el-input class="vertical-middle w300 mr10" v-model="listParams.packageName" clearable placeholder="请输入卡券包名称" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input class="vertical-middle w300" v-model="listParams.search" clearable placeholder="请输入会员姓名/手机号" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<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">
<el-table-column label="会员信息" fixed="left" min-width="120px">
<template slot-scope="scope">
<div v-html="listTime(scope.row.receiveTime)"></div>
<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">
<el-table-column label="发放时间" min-width="120px">
<template slot-scope="scope">
<member-info :member-name="scope.row.memberName" :member-image="scope.row.memberImage" :member-phone="scope.row.memberPhone"></member-info>
<div v-html="listTime(scope.row.createTime)"></div>
</template>
</el-table-column>
<el-table-column prop="packageName" label="卡券包名称" min-width="130px">
<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.packageName }}</span>
<span :title="scope.row.couponPackageId" p-key="couponPackageId">{{ scope.row.couponPackageName }}</span>
</template>
</el-table-column>
<el-table-column label="领取详情" min-width="120px">
<template slot-scope="scope">
<el-tooltip :open-delay="openDelay" effect="dark" placement="bottom">
<div slot="content">
<span v-html="scope.row.detail"></span>
</div>
<span class="el-button el-button--text" @mouseenter="showDetail(scope.row)">领取详情</span>
<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-column prop="appName" label="应用" min-width="120px"></el-table-column>
<el-table-column prop="appActivityName" label="活动" min-width="120px"></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>
......@@ -43,8 +67,8 @@
<script>
import { page, formate } from '@/mixins/table.js';
import { listTime } from '@/utils/index.js';
import api from '@/api/gic-card.js';
const { couponLogPage, packageCouponReceiveLog } = api;
import api from '@/api/card-package.js';
const { pagePackageLog } = api;
export default {
name: 'MergeRecordList',
mixins: [ page, formate ],
......@@ -53,10 +77,14 @@ export default {
loading: false,
dateTime: [],
listParams: {
appCode: '',
activityName: '',
sendStatus: '',
beginTime: '',
endTime: '',
packageName: '',
search: '',
searchType: 2,
currentPage: 1,
pageSize: 20
},
......@@ -69,7 +97,7 @@ export default {
};
},
created() {
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券包', breadPath: '/card-package/list' }, { breadName: '卡券包领取记录', breadPath: '/card-package/record-list' } ]);
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券包', breadPath: '/card-package/list' }, { breadName: '卡券包发放记录' } ]);
},
mounted() {
this.getTableList();
......@@ -77,17 +105,7 @@ export default {
methods: {
listTime,
showDetail({ packageLogId }) {
const idx = this.tableList.findIndex(v => v.packageLogId == packageLogId);
const item = this.tableList[idx];
if(item.detail) {
return;
}
packageCouponReceiveLog({ packageLogId }).then(res => {
item.detail = res.result.map(v => {
return `<p style="line-height:18px;max-width:400px">${v.cardName}${v.receiveFlag ? '领取成功' : `领取失败(${ v.errMsg })`}</p>`;
}).join('');
this.tableList.splice(idx, 1, item);
});
return;
},
getTableList() {
if(this.loading) {
......@@ -96,9 +114,10 @@ export default {
this.loading = true;
this.formatterTimeFunc('beginTime', 'endTime', 'yyyy-MM-dd', 'dateTime');
let params = { ...this.listParams, memberCardId: this.currentAreaId };
couponLogPage(params).then(res => {
pagePackageLog(params).then(res => {
this.loading = false;
const data = res.result;
console.log(data.result);
this.tableList = data.result || [];
this.total = data.totalCount;
// 删除至最后一页没数据的情况,页码-1
......@@ -113,22 +132,3 @@ export default {
},
};
</script>
<style lang="scss" scope>
.merge-mask {
position: fixed;
z-index: 10;
background: #303133;
color: white;
border-radius: 4px;
padding: 10px;
.arrow {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
}
</style>
\ No newline at end of file
<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 || '--' }}
......
......@@ -153,6 +153,10 @@ export default {
params.applyList = JSON.stringify(params.applyList);
params.useConditionLimit = JSON.stringify(params.useConditionLimit);
this.loading = true;
console.log(params);
if (params !== true) {
return;
}
this.$emit('updateLoading', true);
updateCard(params).then(res => {
this.$emit('updateLoading', false);
......
......@@ -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();
......
<template>
<el-dialog title="卡券单独设置" :visible.sync="dialogVisible" width="1100px" @close="handleClose ">
<div style="max-height:650px;overflow-y:auto;">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px">
<el-form-item label="选择卡券" prop="couponId">
<dm-card-select :before-submit="beforeSubmit" v-if="dialogVisible" :read-only="disabled" v-bind="cardSelectParams" class="send" :member-card-id="currentAreaId" @selectData="selectData" fix-member-card :unuse-list="unuseList" />
</el-form-item>
<shelf-limit ref="shelfLimit2" />
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="submit">保存</el-button>
</span>
</el-dialog>
</template>
<script>
import shelfLimit from './shelf-limit';
export default {
name: 'ShelfDialog',
components: {
shelfLimit
},
inject: [ 'parentDisabled' ],
props: {
dialogVisible: {
type: Boolean,
default: false
},
timeType2List: {
type: Array,
default: () => []
},
unuseList: {
type: Array,
default: () => []
}
},
data() {
return {
ruleForm: {
couponId: '',
couponName: ''
},
idx: '', // 不为'' 就是编辑
rules: {
couponId: [ { required: true, message: '请选择卡券', trigger: 'change' } ],
},
};
},
methods: {
add() {
this.$nextTick(() => {
this.$refs.shelfLimit2.add();
});
},
edit(data, idx) {
this.idx = idx;
this.ruleForm.couponId = data.couponId;
this.$nextTick(() => {
this.$refs.shelfLimit2.edit(data);
});
},
submit() {
this.$refs.ruleForm.validate((valid) => {
if (!valid) {
this.$tips({ message: '表单有错误,请检查后提交', type: 'error' });
return;
} else {
let data = this.$refs.shelfLimit2.dealData();
if(!data) {
return;
}
this.$emit('saveItem', this.idx, { ...data, ...this.ruleForm });
this.handleClose();
}
});
},
handleClose() {
// 重置数据
this.idx = '';
this.$refs.shelfLimit2.clean();
this.$refs.ruleForm.resetFields();
this.$emit('update:dialogVisible', false);
},
// 卡券选择器
beforeSubmit(id) {
if(this.timeType2List.map(v => v.couponId).includes(id)) {
this.$tips({ message: '该卡券已存在', type: 'error' });
return false;
}
return true;
},
selectData(data, idx) {
this.ruleForm.couponId = data.couponId || '';
this.ruleForm.couponName = data.cardName || '';
this.$refs.ruleForm.validateField('couponId');
},
},
computed: {
disabled() {
return this.parentDisabled();
},
cardSelectParams() {
return this.idx !== '' ? { couponId: this.ruleForm.couponId } : {};
}
},
};
</script>
<style lang="scss" scoped>
.block {
display: flex;
align-items: flex-end;
}
</style>
\ No newline at end of file
<template>
<stock-list welfare-id=""></stock-list>
<stock-list :welfare-id="$route.query.id"></stock-list>
</template>
<script>
import stockList from '@/components/welfare/list.vue';
import stockList from '@/components/stock-list/index.vue';
export default {
name: 'StockList',
components: {
......
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