Commit ec808f22 by 萱草

update: 礼品管理

parent df4f9179
......@@ -48,5 +48,6 @@
<script src="//web-1251519181.file.myqcloud.com/components/delete.1.1.4.js"></script><!-- 删除轻弹窗 -->
<script src="//web-1251519181.file.myqcloud.com/components/input-number.1.0.10.js"></script><!-- 输入框 -->
<script src="//web-1251519181.file.myqcloud.com/components/acc-group-select.1.0.3.js"></script><!-- 账号分组组件 -->
<script src="//web-1251519181.file.myqcloud.com/components/editor.1.1.12.js"></script><!-- 富文本编辑器 -->
</body>
</html>
/**
* api
* 礼品管理
*/
import getFetch from './get-fetch.js';
import { giftPrefix } from '@/config';
// 礼品相关接口
let realGift = {
giftGet: '/get', // 新建/编辑礼品是时获取数据
giftSave: {
// 新增礼品
url: '/save',
method: 'post'
},
giftUpdate: {
// 编辑礼品
url: '/update',
method: 'post'
},
giftPage: {
// 礼品列表
url: '/page',
method: 'post'
},
giftStockRecord: '/stock-record', // 库存记录
giftStockLog: '/stock-record-log', // 库存操作记录
giftActivity: '/activity-statistics', // 活动统计
giftTemplateDownload: '/template-download', // 下载模板
giftTemplateUpload: '/template-upload', // 上传模板
giftBatchUpdate: {
// 礼品批量操作
url: '/batch-update',
method: 'post'
},
giftStandardNew: '/spec-save', // 规格新建
giftStandardList: '/spec-list', // 规格查询
giftStandardValueNew: '/spec-value-save', // 规格值新建
giftStandardValueList: '/spec-value-list', // 规格值查询
};
realGift = getFetch(realGift, giftPrefix);
export default { ...realGift };
// export const downloadCouponCSV = config.api + marketPrefix + '/download-code-csv-template'; // 下载导入GIC券号csv示例文件 TODO:
// export const importCode = config.api + marketPrefix + '/import-gic-custom-code'; // 导入券码 TODO:
// export const importDestoryCode = marketPrefix + '/destroy-plugin/import-destroy-code'; // 上传销毁code列表 TODO:
// export const downloadDestroyCodeTemplate = config.api + marketPrefix + '/destroy-plugin/download-destroy-code-template'; // 下载销毁模板示例 TODO:
......@@ -26,4 +26,5 @@ export const gicFourUrl = 'https://four.gicdev.com';
export const marketPrefix = '/api-marketing'; // 营销接口前缀
export const commonPrefix = '/gic-auth-web'; // 通用前缀
export const welfarePrefix = '/api-welfare'; // 福利中心前缀
\ No newline at end of file
export const welfarePrefix = '/api-welfare'; // 福利中心前缀
export const giftPrefix = '/gift'; // 礼品前缀
\ No newline at end of file
......@@ -31,8 +31,8 @@ export const monthList = Array(12)
});
export const wfTypes = [
{ title: '实物礼品', desc: '文案描述文案描述文案描述', target: '', code: 'w-real-gifts' },
{ title: '虚拟礼品', desc: '文案描述文案描述文案描述', target: '', code: 'w-virtual-gifts' },
{ title: '实物礼品', desc: '文案描述文案描述文案描述', target: '/gift-manage/real-gift', code: 'w-real-gifts' },
{ 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
import Layout from '@/components/layout/layout';
export default [
{
path: '/gift-manage',
component: Layout,
redirect: '/gift-manage/real-gift',
children: [
{
path: 'real-gift',
component: () => import('@/views/gift-manage/real-gift.vue'),
},
{
path: 'real-gift-detail',
component: () => import('@/views/gift-manage/real-gift-detail.vue'),
}
],
},
];
\ No newline at end of file
import gicCard from './gic-card';
import cardPackage from './card-package';
import realGift from './real-gift';
import Layout from '@/components/layout/layout';
import virtualGift from './virtual-gift';
export const asyncRoutes = [
...gicCard,
...cardPackage,
...realGift,
...virtualGift,
];
......
import Layout from '@/components/layout/layout';
export default [
{
path: '/gift-manage',
component: Layout,
redirect: '/gift-manage/virtual-gift',
children: [
{
path: 'virtual-gift',
component: () => import('@/views/gift-manage/virtual-gift.vue'),
}
],
},
];
\ No newline at end of file
<template>
<el-dialog title="调整成本问题" :visible.sync="dialogVisible" width="500px" @close="cancelSubmit()">
<div v-loading="loading">
<el-input-number v-model="updateCostData.costPrice" precision="2" :min="0" :max="999999.99" style="width:400px"></el-input-number>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelSubmit()">取消</el-button>
<el-button type="primary" @click="submitProNanme()">确认</el-button>
</div>
</el-dialog>
</template>
<script>
// import request from '../service/request.js';
export default {
props: {
updateCostData: {
type: Object,
default() {
return {};
}
}
},
data() {
return {
dialogVisible: false,
loading: false
};
},
mounted() {
this.dialogVisible = true;
},
methods: {
submitProNanme() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateCost');
}, 10);
},
// 取消修改
cancelSubmit() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateCost');
}, 10);
}
}
};
</script>
<style scoped></style>
<template>
<el-dialog title="调整成本问题" :visible.sync="dialogVisible" width="600px" @close="cancelSubmit()">
<div v-loading="loading">
<div class="fr mb20">
<el-input placeholder="输入成本" style="width:85px;margin-right:10px" v-model="banthCost" precision="2" :min="0" :max="999999.99"></el-input>
<el-button type="primary" @click="handleCost">批量填充</el-button>
</div>
<el-table :data="tableData" :span-method="objectSpanMethod" border>
<el-table-column label="颜色" prop="color" width="140px">
<template slot-scope="scope">{{ scope.row.color }}</template>
</el-table-column>
<el-table-column label="尺码" prop="size" width="140px">
<template slot-scope="scope">{{ scope.row.size }}</template>
</el-table-column>
<el-table-column label="成本费用">
<template slot-scope="scope">
<dm-input-amount width="200px" @change="changeSingleCost(scope.row.giftId, scope.row.costPrice)" v-model.trim="scope.row.costPrice" precision="2" :min="0" :max="999999.99"></dm-input-amount>
</template>
</el-table-column>
</el-table>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelSubmit()">取消</el-button>
<el-button type="primary" @click="submitProNanme()">确认</el-button>
</div>
</el-dialog>
</template>
<script>
// import request from '../service/request.js';
export default {
props: {
updateCostData: {
type: Object,
default() {
return {};
}
}
},
data() {
return {
dialogVisible: false,
loading: false,
// tableData: [],
tableData: [
{
color: '红色',
size: 'L',
costPrice: '10',
giftId: '1111'
},
{
color: '红色',
size: 'XL',
costPrice: '20',
giftId: '2222'
},
{
color: '红色',
size: 'M',
costPrice: '30',
giftId: '3333'
},
{
color: '黑色',
size: 'L',
costPrice: '10',
giftId: '4444'
},
{
color: '黑色',
size: 'M',
costPrice: '20',
giftId: '55555'
}
],
spanArr: [], // 用于存放每一行记录的合并数
// costChangeObj: [], // 用于存放批量修改后的数据
banthCost: ''
};
},
mounted() {
this.dialogVisible = true;
this.getData();
this.getSpanArr(this.tableData);
},
methods: {
getData(){
console.log('获取成本数据');
},
submitProNanme() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateCost');
}, 10);
},
// 取消修改
cancelSubmit() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateCost');
}, 10);
},
// 合并单元格,行合并
getSpanArr(data) {
// data就是我们从后台拿到的数据
for (let i = 0; i < data.length; i++) {
if (i === 0) {
this.spanArr.push(1);
this.pos = 0;
} else {
// 判断当前元素与上一个元素是否相同
if (data[i].color === data[i - 1].color) {
this.spanArr[this.pos] += 1;
this.spanArr.push(0);
} else {
this.spanArr.push(1);
this.pos = i;
}
}
// console.log(this.spanArr);
}
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// if (columnIndex === 0 || columnIndex === 1) {
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
// console.log(`rowspan:${_row} colspan:${_col}`);
return {
// [0,0] 表示这一行不显示, [2,1]表示行的合并数
rowspan: _row,
colspan: _col
};
}
},
// 批量修改成本
handleCost(){
// for (let item in this.costChangeObj) {
// this.costChangeObj[item].costPrice = this.banthCost;
// // this.costChangeObj[item].stockType = this.stockType;
// }
this.tableData.forEach(item => {
item.costPrice = this.banthCost;
});
console.log(this.tableData);
},
changeSingleCost(id, cost){
console.log(this.tableData);
}
}
};
</script>
<style scoped></style>
<template>
<el-dialog title="调整库存" :visible.sync="dialogVisible" width="750px" @close="cancelSubmit()">
<div v-loading="loading">
<div class="fr mb20">
<el-select v-model="stockType" style="width:100px;margin-right:10px">
<el-option label="增加" :value="1"></el-option>
<el-option label="减少" :value="2"></el-option>
</el-select>
<el-input placeholder="输入库存" style="width:85px;margin-right:10px" v-model="banthStock" precision="2" :min="0" :max="999999"></el-input>
<el-button type="primary" @click="handleStock">批量填充</el-button>
</div>
<el-table :data="tableData" :span-method="objectSpanMethod" border>
<el-table-column label="颜色" prop="color" width="90px">
<template slot-scope="scope">{{ scope.row.color }}</template>
</el-table-column>
<el-table-column label="尺码" prop="size" width="90px">
<template slot-scope="scope">{{ scope.row.size }}</template>
</el-table-column>
<el-table-column label="当前可占用" prop="remainedStock" width="100px">
<template slot-scope="scope">{{ scope.row.remainedStock }}</template>
</el-table-column>
<el-table-column label="增加/减少" width="150px">
<template slot-scope="scope">
<el-select v-model="scope.row.stockType" style="width:100px">
<el-option label="增加" :value="1"></el-option>
<el-option label="减少" :value="2"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="库存">
<template slot-scope="scope">
<dm-input-amount width="200px" @change="changeSingleStock(scope.row.giftId, scope.row.costPrice)" v-model.trim="scope.row.stock" precision="2" :min="0" :max="999999"></dm-input-amount>
</template>
</el-table-column>
</el-table>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelSubmit()">取消</el-button>
<el-button type="primary" @click="submitProNanme()">确认</el-button>
</div>
</el-dialog>
</template>
<script>
// import request from '../service/request.js';
export default {
props: {
updateCostData: {
type: Object,
default() {
return {};
}
}
},
data() {
return {
dialogVisible: false,
loading: false,
// tableData: [],
tableData: [
{
color: '红色',
size: 'L',
remainedStock: '10',
giftId: '1111',
stock: '10',
stockType: 1
},
{
color: '红色',
size: 'XL',
remainedStock: '20',
giftId: '2222',
stock: '20',
stockType: 1
},
{
color: '红色',
size: 'M',
remainedStock: '30',
giftId: '3333',
stock: '12',
stockType: 1
},
{
color: '黑色',
size: 'L',
remainedStock: '10',
giftId: '4444',
stock: '13',
stockType: 1
},
{
color: '黑色',
size: 'M',
remainedStock: '20',
giftId: '55555',
stock: '14',
stockType: 1
}
],
spanArr: [], // 用于存放每一行记录的合并数
// costChangeObj: [], // 用于存放批量修改后的数据
banthStock: '',
stockType: 1
};
},
mounted() {
this.dialogVisible = true;
this.getData();
this.getSpanArr(this.tableData);
},
methods: {
getData(){
console.log('获取成本数据');
},
submitProNanme() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateStock');
}, 10);
},
// 取消修改
cancelSubmit() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateStock');
}, 10);
},
// 合并单元格,行合并
getSpanArr(data) {
// data就是我们从后台拿到的数据
for (let i = 0; i < data.length; i++) {
if (i === 0) {
this.spanArr.push(1);
this.pos = 0;
} else {
// 判断当前元素与上一个元素是否相同
if (data[i].color === data[i - 1].color) {
this.spanArr[this.pos] += 1;
this.spanArr.push(0);
} else {
this.spanArr.push(1);
this.pos = i;
}
}
// console.log(this.spanArr);
}
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// if (columnIndex === 0 || columnIndex === 1) {
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
// console.log(`rowspan:${_row} colspan:${_col}`);
return {
// [0,0] 表示这一行不显示, [2,1]表示行的合并数
rowspan: _row,
colspan: _col
};
}
},
// 批量修改成本
handleStock(){
// for (let item in this.costChangeObj) {
// this.costChangeObj[item].costPrice = this.banthCost;
// // this.costChangeObj[item].stockType = this.stockType;
// }
if(this.stockType === 1){
this.tableData.forEach(item => {
item.stock = Number(item.stock) + Number(this.banthStock);
item.stockType = this.stockType;
});
}else{
this.tableData.forEach(item => {
item.stock = Number(item.stock) - Number(this.banthStock);
item.stockType = this.stockType;
});
}
console.log(this.tableData);
},
changeSingleStock(id, cost){
console.log(this.tableData);
}
}
};
</script>
<style scoped></style>
<template>
<el-dialog title="修改礼品名称" :visible.sync="dialogVisible" width="600px" @close="cancelSubmit('editInfoModal')">
<el-form :model="editInfoModal" ref="editInfoModal" :rules="modalRules" :label-position="labelPosition" v-loading="loading">
<el-form-item label="礼品名称" label-width="80px" prop="goodsName" style="width:560px">
<dm-input type="text" v-model="editInfoModal.goodsName" :byte-type="1" :maxlength="30"> </dm-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelSubmit('editInfoModal')">取消</el-button>
<el-button type="primary" @click="submitProNanme('editInfoModal')">确认</el-button>
</div>
</el-dialog>
</template>
<script>
// import request from '../service/request.js';
export default {
props: {
updateNameForm: {
type: Object,
default() {
return {};
}
}
},
data() {
return {
dialogVisible: false,
editInfoModal: {
goodsName: '',
goodsId: ''
},
labelPosition: 'top',
modalRules: {
goodsName: [ { required: true, message: '名称不能为空', trigger: 'blur' } ]
},
title: '',
label: '',
loading: false
};
},
mounted() {
this.dialogVisible = true;
// this.editInfoModal.goodsName = this.updateNameForm.name;
// this.editInfoModal.goodsId = this.updateNameForm.id;
},
methods: {
submitProNanme(formName) {
console('修改礼品名称');
// if(this.loading) return;
// this.$refs[formName].validate(valid => {
// if (valid) {
// let params = {
// goodsId: this.editInfoModal.goodsId,
// goodsName: this.editInfoModal.goodsName
// };
// this.loading = true;
// // request.post('/api-integral-mall/update-integral-gift-info', params).then(res => {
// // if (res.data.code === '0000') {
// // this.dialogVisible = false;
// // setInterval(() => {
// // this.$emit('closeUpdateName');
// // }, 10);
// // this.$message.success('修改成功');
// // this.$emit('getList');
// // } else {
// // this.$message.error(res.data.message);
// // }
// // }).finally(() => this.loading = false);
// } else {
// return false;
// }
// });
},
// 取消修改
cancelSubmit(formName) {
this.$refs[formName].resetFields();
// this.editInfoModal.goodsName = '';
// this.editInfoModal.goodsId = '';
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateName');
}, 10);
}
}
};
</script>
<style scoped></style>
<template>
<el-dialog title="调整库存" :visible.sync="dialogVisible" width="500px" @close="cancelSubmit()">
<div v-loading="loading">
<el-select v-model="stockType" style="width:100px;display:inline-block;margin-right:10px">
<el-option label="增加" :value="1"></el-option>
<el-option label="减少" :value="2"></el-option>
</el-select>
<el-input-number v-model="stockData.remainedStock" precision="2" :min="0" :max="999999" style="width:300px"></el-input-number>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelSubmit()">取消</el-button>
<el-button type="primary" @click="submitProNanme()">确认</el-button>
</div>
</el-dialog>
</template>
<script>
// import request from '../service/request.js';
export default {
props: {
stockData: {
type: Object,
default() {
return {};
}
}
},
data() {
return {
dialogVisible: false,
loading: false,
stockType: 1
};
},
mounted() {
this.dialogVisible = true;
console.log(this.stockData);
},
methods: {
submitProNanme() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateStock');
}, 10);
},
// 取消修改
cancelSubmit() {
this.dialogVisible = false;
setInterval(() => {
this.$emit('closeUpdateStock');
}, 10);
}
}
};
</script>
<style scoped></style>
<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>
</div>
<el-table tooltip-effect="dark" :data="tableList" style="width:100%">
<el-table-column label="领取时间" fixed="left" min-width="120px">
<template slot-scope="scope">
<div v-html="listTime(scope.row.receiveTime)"></div>
</template>
</el-table-column>
<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>
</template>
</el-table-column>
<el-table-column prop="packageName" label="卡券包名称" min-width="130px">
<template slot-scope="scope">
<span :title="scope.row.couponPackageId" p-key="couponPackageId">{{ scope.row.packageName }}</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-tooltip>
</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>
</div>
</div>
</template>
<script>
import { page, formate } from '@/mixins/table.js';
import { listTime } from '@/utils/index.js';
import api from '@/api/gic-card.js';
const { pagePackageLog, packageCouponReceiveLog } = api;
export default {
name: 'MergeRecordList',
mixins: [ page, formate ],
data() {
return {
loading: false,
dateTime: [],
listParams: {
beginTime: '',
endTime: '',
packageName: '',
search: '',
currentPage: 1,
pageSize: 20
},
tableList: [],
total: 0,
detail: '',
mask: {
show: false
}
};
},
created() {
this.$emit('updateBread', [ { breadName: '福利中心' }, { breadName: 'GIC卡券' }, { breadName: '卡券包' }, { breadName: '卡券包领取记录', breadPath: '/gic-card/merge/record-list' } ]);
},
mounted() {
this.getTableList();
},
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);
});
},
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;
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>
<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
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