Commit 142734e3 by huaying

Merge branch 'feature/7月迭代-会员' into test

# Conflicts:
#	src/components/axios/url.js
parents d018514c 4e0ab839
......@@ -23,6 +23,16 @@ let formatYMD = val => {
return '--'
}
}
let formatHMS = data => {
if (!data) {
return;
}
let date = new Date(data);
let hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
let minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
let seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return `${hours}:${minutes}:${seconds}`;
}
let fomatNumber = val => {
if(val) {
return val
......@@ -50,4 +60,4 @@ let defaultImg = val => {
return './static/img/default.png'
}
}
export { formatTime,fomatNumber,fomatText,formatYMD,fomatFloat,defaultImg }
export { formatTime,fomatNumber,fomatText,formatYMD,fomatFloat,defaultImg,formatHMS }
......@@ -31,7 +31,16 @@
@change="onSearch"
clearable
/>
<vue-gic-select-tree :options="selectTreeOptions" @change="onSelectTreeChange" style="display: inline-block;margin-left:10px; height: 32px" />
<vue-gic-select-tree :options="selectTreeOptions" @change="onSelectTreeChange" style="display: inline-block;margin:0 10px; height: 32px" />
<vue-gic-select-tree :options="selectChannelList" @change="onSelectChannelChange" style="display: inline-block;height: 32px" />
<!-- <el-select v-model="selectChannelValue" multiple placeholder="请选择">
<el-option
v-for="item in selectChannelList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select> -->
<el-button type="text" @click="showSearch = !showSearch" class="senior-search">
高级搜索<i
:class="showSearch ? 'el-icon-d-arrow-left' : 'el-icon-d-arrow-right'"
......
......@@ -7,6 +7,7 @@
:close-on-click-modal="false"
@close="cancel"
width="480px"
:picker-options="pickerOptions()"
>
<el-tabs v-model="activeName">
<el-tab-pane
......@@ -81,7 +82,24 @@ export default {
visible: false,
fieldsList: [],
activeName: '0',
loading: false
loading: false,
pickerOptions() {
// let pickerMinDate;
return {
onPick(obj) {
// pickerMinDate = obj.minDate;
},
disabledDate(time) {
let start = new Date();
start.setFullYear(start.getFullYear() - 100);
start.setDate(start.getDate() + 1);
start = new Date(`${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()}`);
let end = new Date();
end = new Date(`${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()} 23:59:59`);
return time.getTime() < start.getTime() || time.getTime() > end;
}
};
}
};
},
watch: {
......
<template>
<div>
<el-dialog
title="编辑基本信息"
title="编辑基本信息333"
custom-class="customer-dialog"
:visible.sync="visible"
:close-on-click-modal="false"
......@@ -46,6 +46,7 @@
v-model="form.memberBirthday"
type="date"
placeholder="选择日期"
:picker-options="pickerOptions()"
/>
</el-form-item>
<el-form-item label="手机号码:">
......@@ -168,6 +169,23 @@ export default {
remark: [{ required: true, message: '请输入原因备注', trigger: 'blur' }],
},
btnLoading: false,
pickerOptions() {
// let pickerMinDate;
return {
onPick(obj) {
// pickerMinDate = obj.minDate;
},
disabledDate(time) {
let start = new Date();
start.setFullYear(start.getFullYear() - 100);
start.setDate(start.getDate() + 1);
start = new Date(`${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()}`);
let end = new Date();
end = new Date(`${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()} 23:59:59`);
return time.getTime() < start.getTime() || time.getTime() > end;
}
};
}
};
},
computed: {
......
<template>
<div style="padding:20px">
<div class="logTop">
<el-cascader
style="width:260px;"
placeholder="全部类型/全部事由"
:options="options"
filterable>
</el-cascader>
<el-date-picker style="width: 256px; margin-left:10px;" v-model="dateDefault" type="daterange" range-separator="~" start-placeholder="创建开始日期" end-placeholder="创建结束日期" :default-time="['00:00:00', '23:59:59']" :picker-options="pickerOptions()" value-format="yyyy-MM-dd" @change="handleSearch"> </el-date-picker>
<p class="font14 tip-p" v-if="!memberId">展示近一年的日志</p>
</div>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="createTime" label="时间">
<template slot-scope="scope">
{{ scope.row.createTime | formatTime }}
</template>
</el-table-column>
<el-table-column prop="operType" label="日志类型" />
<el-table-column prop="operReason" label="事由" />
<el-table-column prop="operContent" label="日志详情" show-overflow-tooltip/>
<el-table-column prop="operRemark" label="备注" show-overflow-tooltip>
<template slot-scope="{ row }">
<span v-html="row.operRemark" />
</template>
</el-table-column>
<el-table-column prop="" label="操作" width="120" v-if="memberId">
<template slot-scope="{ }">
<el-button type="text" @click="goLink('/customerLog')">查看</el-button>
</template>
</el-table-column>
</el-table>
<div class="page mTop20" v-if="totalCount > 0">
<dm-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="logPageParam.currentPage"
:page-sizes="[20, 40, 60, 80]"
:page-size="logPageParam.pageSize"
layout="total, sizes, prev, pager, next"
:total="totalCount"
/>
</div>
</div>
</template>
<script>
import mixin from '../../wechatmembers/cardMixin';
import url from '../../axios/url';
import { doFetch } from '../../axios/api';
export default {
name: 'customerLog',
mixins: [mixin],
props: {
memberId: {
type: String,
default: ''
}
},
data() {
return {
tableLoading: false,
tableData: [],
logPageParam: {
pageSize: 20,
currentPage: 1,
},
totalCount: 0,
};
},
created() {
this.getLogPage();
},
methods: {
getLogPage () {
this.tableLoading = true;
doFetch(url.logPage, {
...this.logPageParam,
memberId: this.memberId || this.$route.query.memberId,
})
.then(res => {
this.tableLoading = false;
if (res.data.errorCode === 0) {
this.tableData = res.data.result.page.result || [];
this.tableData = this.tableData.map(el => {
if (typeof el.operRemark == 'string') { el.operRemark = el.operRemark.replace(/\n/g, ' <br />'); }
return el;
});
this.totalCount = res.data.result.page.totalCount;
} else {
checkFalse(res.data.message);
return false;
}
})
.catch(err => {
this.tableLoading = false;
checkStatus(err);
})
.finally(_ => this.count++);
},
handleSizeChange (v) {
this.logPageParam.pageSize = v;
this.logPageParam.currentPage = 1;
this.getLogPage();
},
handleCurrentChange (v) {
this.logPageParam.currentPage = v;
this.getLogPage();
},
handleSearch() {
this.logPageParam.currentPage = 1;
this.getLogPage();
},
goLink (v) {
console.log(this.memberId, 'this.memberId');
if (v) this.$router.push({ path: v, query: { memberId: this.memberId } });
},
}
};
</script>
<style lang="scss" scoped>
.logTop {
margin-bottom: 20px;
display: flex;
align-items: center;
margin-right: 10px;
}
.tip-p{
margin-left: 20px;
color: #6B6D71;
// padding-bottom: 16px;
}
</style>
\ No newline at end of file
......@@ -349,7 +349,7 @@
</el-tooltip>
</template>
</el-descriptions-item>
<el-descriptions-item label="认证时间:">
<el-descriptions-item label="微信认证时间:">
{{ memberInfo.authTime|formatTime }}
</el-descriptions-item>
<el-descriptions-item label="开卡渠道:">
......@@ -372,12 +372,30 @@
<div class="flex-wrap">
<!-- 积分相关 -->
<div :class="['scores', { 'is-clique': showClique }]">
<div class="scores-clique" v-if="showClique">
<icon-label-value label="集团积分" :value="memberInfo.cliqueMemberIntegral ? memberInfo.cliqueMemberIntegral : 0">
<div class="scores-box" v-if="showClique" @click="goLinkWithClique('/enterpriseIntegralDataPage')">
<div class="scores-info">
<icon-label-value label="集团积分" :value="memberInfo.cliqueMemberIntegral ? memberInfo.cliqueMemberIntegral : 0">
<div class="score-icon" slot="icon">
<i class="iconfont icon-jifenjiabei"></i>
</div>
</icon-label-value>
<div class="score-detail">
<p class="score-detail-item">
<span class="score-detail-label">可用积分</span>
<span class="score-detail-value">{{ memberInfo.cliqueMemberIntegral ? memberInfo.cliqueMemberIntegral : 0 }}</span>
</p>
<p class="score-detail-item">
<span class="score-detail-label">
不可用积分
<el-tooltip content="不可用原因:积分为冻结/预扣状态,详情可查看客户日志" placement="top">
<i class="iconfont icon-QuestionCircleOutlined" style="font-size: 14px;color: #606266"/>
</el-tooltip>
</span>
<span class="score-detail-value">{{ memberInfo.cliqueMemberInvalidIntegral ? memberInfo.cliqueMemberInvalidIntegral : 0 }}</span>
</p>
</div>
</div>
<i class="el-icon-arrow-right" style="font-size: 16px;color: #909399"></i>
</div>
<div class="scores-box" @click="goLink('/integralDataPage')">
<div class="scores-info">
......@@ -711,7 +729,8 @@
<!-- 标签备注end -->
<!-- 客户日志 -->
<template v-if="section.name==='log'">
<!-- <customer-log style="padding:0" v-if="section.name==='log'" :memberId="memberId"></customer-log> -->
<!-- <template v-if="section.name==='log'">
<el-table :data="tableData" v-loading="tableLoading" style="width: 100%">
<el-table-column prop="createTime" label="时间">
<template slot-scope="scope">
......@@ -719,8 +738,8 @@
</template>
</el-table-column>
<el-table-column prop="operType" label="日志类型" />
<el-table-column prop="operContent" label="日志详情" />
<el-table-column prop="operReason" label="事由" />
<el-table-column prop="operContent" label="日志详情" />
<el-table-column prop="operRemark" label="备注">
<template slot-scope="{ row }">
<span v-html="row.operRemark" />
......@@ -739,10 +758,16 @@
:total="totalCount"
/>
</div>
</template>
</template> -->
<!-- 客户日志end -->
</div>
</div>
<dm-sub-title text="客户日志" type="fill" style="margin-bottom: 20px;font-size:14px;">
客户日志
<span style="margin-left: 10px; color: #909399;font-size:12px">(展示近一年的日志)</span>
</dm-sub-title>
<customer-log style="padding:0" :memberId="memberId"></customer-log>
</div>
<!-- 基本信息修改弹窗 -->
<baseinfo-dialog
......@@ -869,4 +894,10 @@ export default { ...action };
height: 22px !important;
top: 9px;
}
.subTitle .text {
font-size: 14px !important;
}
.subTitle .line {
margin-right: 8px !important;
}
</style>
......@@ -6,7 +6,7 @@ import mainstoreDailog from "./components/mainstoreDialog.vue";
import substoreDailog from "./components/substoreDialog.vue";
import batchList from "./components/batchList.vue";
import importDialog from "./components/importDialog.vue";
import { doFetch } from "../../components/axios/api";
import { doFetch, doFetchGet } from "../../components/axios/api";
import url from "../../components/axios/url";
import { mapState } from "vuex";
import { formatLongTime, paddingBorth } from "@/utils/utils";
......@@ -21,6 +21,31 @@ export default {
name: "allCustomersList",
data() {
return {
selectChannelValue: '',
selectChannelList: {
selectOptions: {
collapseTags: true,
allCheckText: '全部关联渠道',
placeholder: '全部关联渠道',
width: 260
},
treeOptions: {
data: [
// {
// id: '1',
// label: '微信公众号',
// disabled: false
// },
],
props: {
label: 'label',
children: 'children',
value: 'id'
}
},
searchAble: false,
multipleAble: true
},
sceneValue: "member", // 人群筛选器场景值
navpath: [
{ name: "首页", path: "" },
......@@ -33,16 +58,14 @@ export default {
phoneNameCard: "", // 搜索字段
memberSearchStr: -1, // 人群筛选
sortColName: "", // 排序字段
sortType: "" // 排序方式
sortType: "", // 排序方式
},
totalCount: 0,
loading: false,
tableData: [],
customerType: [
// { id: 1, label: "非会员" },
// { id: 3, label: "微信会员" },
// { id: 4, label: "POS会员" }
],
channelType: [],
oldCustomerType: "",
showSearch: false, // 高级搜索开关
toggleTag: false, // 人群筛选器按钮开关
......@@ -175,6 +198,12 @@ export default {
},
deep: true
},
channelType: {
handler(newV, oldV) {
this.onSearch();
},
deep: true
},
$route: function(n, o) {
if (n.path === "/allCustomers") {
this.$store.commit("mutations-slide", true);
......@@ -186,6 +215,7 @@ export default {
this.initialize();
this.getGradeList();
this.getCliqueGradeList();
this.getMemberSourceList();
},
mounted() {
this.getFindMemberFields();
......@@ -197,6 +227,12 @@ export default {
onSelectTreeChange(data) {
this.customerType = data;
},
// 关联渠道选中数据
onSelectChannelChange(data) {
this.channelType = data.map(item=>{
return item.id
});
},
initialize() {
this.pageParam.phoneNameCard = sessionStorage.getItem("phoneNameCard")
? sessionStorage.getItem("phoneNameCard")
......@@ -216,8 +252,25 @@ export default {
},
onSearch() {
this.pageParam.currentPage = 1;
if(this.channelType) {
this.pageParam.relatedChannelSource=this.channelType
}
this.getAjaxMembers();
},
// 获取会员渠道列表
getMemberSourceList() {
doFetchGet(url.getMemberSourceList, {}).then(res=>{
if (res.data.errorCode === 0 && res.data.result) {
this.selectChannelList.treeOptions.data = res.data.result.map(item=>{
return {
id: item.key,
label: item.value,
disabled: false
}
})
}
})
},
// 获取列表数据
getAjaxMembers() {
this.loading = true;
......@@ -226,7 +279,7 @@ export default {
url.ajaxMembers,
Object.assign({}, this.pageParam, {
pageName: this.pageName,
showFields: "-1"
showFields: "-1",
})
)
.then(res => {
......
......@@ -10,6 +10,7 @@ import { mapState } from 'vuex';
import url from '../../components/axios/url';
import { doFetch, doFetchqs, doFetchGet } from '../../components/axios/api';
import authMethods from '@/mixins/auth';
import CustomerLog from './components/customerLog.vue';
import {
checkFalse,
checkStatus,
......@@ -65,16 +66,16 @@ export default {
sourceTagList: []
}
},
tableData: [],
logPageParam: {
pageSize: 20,
currentPage: 1,
},
totalCount: 0,
// tableData: [],
// logPageParam: {
// pageSize: 20,
// currentPage: 1,
// },
// totalCount: 0,
defaultImg,
labelTabsActive: 'memberTagGroup',
fullscreenLoading: false, // 全局loading
tableLoading: false, // 用户日志列表loading
// tableLoading: false, // 用户日志列表loading
imgLoading: false, // 刷新头像loading
popoverVisible: false, // 修改等级popover
toggleTag: false, // 拓展信息展开按钮
......@@ -173,14 +174,14 @@ export default {
{ title: '营销活动标签', key: 'marketingTagList' },
],
},
{ title: '客户日志', name: 'log', class: 'log-info-contain' },
// { title: '客户日志', name: 'log', class: 'log-info-contain' },
],
marketingRecordNum: 0
};
},
watch: {
count: function (n, o) {
if (n === 4) this.fullscreenLoading = false;
if (n === 3) this.fullscreenLoading = false;
},
},
filters: {
......@@ -237,7 +238,7 @@ export default {
this.count = 0;
this.fullscreenLoading = true;
this.getAllDetail();
this.getLogPage();
// this.getLogPage();
},
isOverflow(text) {
const dom = document.createElement('span');
......@@ -330,32 +331,32 @@ export default {
.finally(_ => this.count++);
});
},
getLogPage () {
this.tableLoading = true;
doFetch(url.logPage, {
...this.logPageParam,
memberId: this.memberId,
})
.then(res => {
this.tableLoading = false;
if (res.data.errorCode === 0) {
this.tableData = res.data.result.page.result || [];
this.tableData = this.tableData.map(el => {
if (typeof el.operRemark == 'string') { el.operRemark = el.operRemark.replace(/\n/g, ' <br />'); }
return el;
});
this.totalCount = res.data.result.page.totalCount;
} else {
checkFalse(res.data.message);
return false;
}
})
.catch(err => {
this.tableLoading = false;
checkStatus(err);
})
.finally(_ => this.count++);
},
// getLogPage () {
// this.tableLoading = true;
// doFetch(url.logPage, {
// ...this.logPageParam,
// memberId: this.memberId,
// })
// .then(res => {
// this.tableLoading = false;
// if (res.data.errorCode === 0) {
// this.tableData = res.data.result.page.result || [];
// this.tableData = this.tableData.map(el => {
// if (typeof el.operRemark == 'string') { el.operRemark = el.operRemark.replace(/\n/g, ' <br />'); }
// return el;
// });
// this.totalCount = res.data.result.page.totalCount;
// } else {
// checkFalse(res.data.message);
// return false;
// }
// })
// .catch(err => {
// this.tableLoading = false;
// checkStatus(err);
// })
// .finally(_ => this.count++);
// },
updateImgUrl () {
this.imgLoading = true;
doFetch(url.updateImgUrl, {
......@@ -384,6 +385,9 @@ export default {
goLink (v) {
if (v) this.$router.push({ path: v, query: { memberId: this.memberId } });
},
goLinkWithClique (v) {
if (v) this.$router.push({ path: v, query: { memberId: this.memberId ,cliqueMemberId: this.memberInfo.cliqueMemberId || ''} });
},
goStoreValue () {
if (this.memberInfo.storedValueFlag) {
this.$router.push({
......@@ -392,15 +396,15 @@ export default {
});
}
},
handleSizeChange (v) {
this.logPageParam.pageSize = v;
this.logPageParam.currentPage = 1;
this.getLogPage();
},
handleCurrentChange (v) {
this.logPageParam.currentPage = v;
this.getLogPage();
},
// handleSizeChange (v) {
// this.logPageParam.pageSize = v;
// this.logPageParam.currentPage = 1;
// this.getLogPage();
// },
// handleCurrentChange (v) {
// this.logPageParam.currentPage = v;
// this.getLogPage();
// },
// 集团配置
getEnterpriseInfo () {
doFetchqs(url.enterpriseInfo).then(res => {
......@@ -485,6 +489,7 @@ export default {
customermainstoreDialog,
customersubstoreDialog,
customerlabelDialog,
IconLabelValue
IconLabelValue,
CustomerLog
},
};
......@@ -65,6 +65,8 @@ const urlConfig = {
updateRemark: '/api-member/member-load-update-remark',//修改导购备注信息
integralDataPage: '/api-member/member-integral-data-page',//积分列表(积分明细列表)
integralOperateType: '/api-member/member-integral-operate-type',//积分操作类型(字典列表)
enterpriseIntegralDetailData: '/api-member/page_clique_member_integral_log', // 集团积分(集团积分明细列表)
enterpriseIntegralWithholdData: '/api-member/member-integral-pre-deduction-page', // 预扣积分(集团积分明细列表)
memberIntegralUpdate: '/api-member/member-integral-update', //调整积分进行保存
enterpriseInfo: '/api-member/enterprise-info',//获取企业配置信息
memberLoadBaseDetail: '/api-member/member-load-base-detail',//获取客户基本信息
......@@ -99,7 +101,8 @@ const urlConfig = {
getOrderList: '/api-member/member-all-order-page',
getFrozenList: "/api-member/ajax-frozen-members",
batchUpdateFrozen: "/api-member/members-batch-update-frozen",
getExceptionList: '/api-member/list-exception-member'
getExceptionList: '/api-member/list-exception-member',
getMemberSourceList: '/api-plug/member-source-list'
}
const defaultUrl = Object.assign({}, urlConfig);
......
import {formatYMD} from '@/common/filters/custom.js';
export default {
data() {
return {
// dateKey: 0,
dateDefault: [],
pickerOptions() {
// let pickerMinDate;
return {
onPick(obj) {
// pickerMinDate = obj.minDate;
},
disabledDate(time) {
let start = new Date();
start.setFullYear(start.getFullYear() - 1);
start.setDate(start.getDate() + 1);
start = new Date(`${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()}`);
let end = new Date();
end = new Date(`${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()} 23:59:59`);
return time.getTime() < start.getTime() || time.getTime() > end;
}
};
}
};
},
methods: {
setDefalutTime(){
let start = new Date();
start.setFullYear(start.getFullYear() - 1);
start.setDate(start.getDate() + 1);
start = `${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()}`;
let end = new Date();
end = `${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()}`;
this.dateDefault = [formatYMD(new Date(start).getTime()), formatYMD(new Date(end).getTime())]
},
}
};
\ No newline at end of file
......@@ -5,12 +5,12 @@
<el-select
v-model="cardReviceCode"
style="margin-right: 7px;"
placeholder="所有渠道"
placeholder="所有来源"
@change="handleSearch"
>
<el-option
:key=-1
label="所有渠道"
label="所有来源"
:value=-1
></el-option>
<el-option
......@@ -24,6 +24,7 @@
v-model="useStatus"
placeholder="所有状态"
@change="handleSearch"
style="margin-right: 7px;"
>
<el-option
:key=-1
......@@ -71,7 +72,9 @@
:value=10
></el-option>
</el-select>
<el-date-picker style="width: 256px;" v-model="dateDefault" type="daterange" range-separator="~" start-placeholder="创建开始日期" end-placeholder="创建结束日期" :default-time="['00:00:00', '23:59:59']" :picker-options="pickerOptions()" value-format="yyyy-MM-dd" @change="handleSearch"> </el-date-picker>
</div>
<p class="font14 tip-p">展示投放时间仅一年的卡券</p>
<div class="table-content">
<el-table
:data="memberData"
......@@ -107,9 +110,17 @@
</el-table-column>
<el-table-column
prop="receiveName"
label="投放渠道"
label="投放来源"
></el-table-column>
<el-table-column
prop="cardType"
label="卡券类型"
>
<template slot-scope="{row}">
{{row.cardType == 0 ? '抵金券' : row.cardType == 1 ? '折扣券' : row.cardType == 2 ? '兑换券' : '--'}}
</template>
</el-table-column>
<el-table-column
prop="cardName"
label="卡券名称"
>
......@@ -120,6 +131,24 @@
</template>
</el-table-column>
<el-table-column
prop="cardDenomination"
label="优惠额度"
>
<template slot-scope="{row}">
{{row.cardType == 0 ? `${row.cardDenomination}元` : row.cardType == 1 ? `${row.cardDenomination}折` : row.cardType == 2 ? `${row.cardDenomination}` : '--'}}
</template>
</el-table-column>
<el-table-column
prop="receiveName"
label="有效期"
>
<template slot-scope="{row}">
<!-- {{row.cardEffectiveMode == 0 ? `${row.effectTime | formatTime}-${row.limitTime | formatTime}` : row.cardEffectiveMode == 1 && row.receiveTime == null ? `领取后${row.startDay}天生效,有效期${row.limitDay}天` : row.cardEffectiveMode == 1 && row.receiveTime != null ? `${row.effectTime | formatTime}-${row.limitTime | formatTime}` : row.cardEffectiveMode == 2 && row.receiveTime == null ? '领取后当月有效' : row.cardEffectiveMode == 2 && row.receiveTime != null ? `${row.effectTime | formatTime}-${row.limitTime | formatTime}` : '--'}} -->
{{row.cardEffectiveMode == 0 || (row.cardEffectiveMode == 2 && row.receiveTime != null) || (row.cardEffectiveMode == 1 && row.receiveTime != null) ? `${row.effectTime | formatTime}-${row.limitTime | formatTime}` : row.cardEffectiveMode == 1 && row.receiveTime == null ? `领取后${row.startDay}天生效,有效期${row.limitDay}天` : row.cardEffectiveMode == 2 && row.receiveTime == null ? '领取后当月有效' : '--'}}
</template>
</el-table-column>
<el-table-column
prop="cardCode"
label="卡券代码"
>
......@@ -130,7 +159,7 @@
</el-table-column>
<el-table-column
prop="status"
label="状态"
label="卡券状态"
>
<div slot-scope="scope" v-html="formatStatus(scope.row)">
<!-- <span v-if="scope.row.status === -1">所有</span>
......@@ -299,6 +328,7 @@
</template>
<script>
import mixin from './cardMixin';
import nav from "../../common/navbar/navbar.vue";
import { doFetch } from "../../components/axios/api";
import url from "../../components/axios/url";
......@@ -352,12 +382,12 @@ export default {
orderNumber: null,
};
},
mixins: [authMethods],
mixins: [authMethods, mixin],
methods: {
formatStatus(row) {
let _content = '';
const { status } = row;
console.log(row)
// console.log(row)
let isOverdue = Date.now() >= row.limitTime;
if (status == 3) {
_content = `<div class="${isOverdue ? 'dm-status--info' : 'dm-status--error'}">${isOverdue ? '已过期' : '待领取'}</div>`;
......@@ -503,7 +533,9 @@ export default {
pageSize: this.page.pageSize,
currentPage: this.page.currentPage,
cardReviceCode: this.cardReviceCode,
useStatus: this.useStatus
useStatus: this.useStatus,
beginTime: this.dateDefault[0],
endTime: this.dateDefault[1],
})
.then(res => {
if (res.data.errorCode === 0) {
......@@ -556,6 +588,7 @@ export default {
}
},
created() {
this.setDefalutTime()
if (this.memberId) {
this.getMemberCardsPage();
}
......@@ -569,6 +602,10 @@ export default {
</script>
<style lang="stylus" scoped>
.tip-p{
color: #6B6D71;
padding-bottom: 16px;
}
.check-box {
padding-bottom: 20px;
}
......
<template>
<div class="integral-tab">
<el-tabs v-model="activeName">
<el-tab-pane label="集团积分明细" name="first" >
<p class="font14 tip-p">展示近两年的积分明细</p>
<enterprise-integral-detial :member-id="memberId"></enterprise-integral-detial>
</el-tab-pane>
<el-tab-pane label="集团预扣明细" name="second">
<p class="font14 tip-p">展示近两年的预扣明细</p>
<enterprise-intergral-withhold :member-id="cliqueMemberId"></enterprise-intergral-withhold>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import enterpriseIntegralDetial from './enterpriseIntegralDetial.vue';
import enterpriseIntergralWithhold from './enterpriseIntergralWithhold.vue';
export default {
name: 'enterpriseIntegralDataPage',
components: { enterpriseIntegralDetial,enterpriseIntergralWithhold },
props: {
},
data() {
return {
activeName: 'first',
memberId: this.$route.query.memberId || "",
cliqueMemberId: this.$route.query.cliqueMemberId || ""
};
},
methods: {
goback() {
this.$router.push({
path: "wechatmemberDetail",
query: { memberId: this.memberId }
});
},
},
mounted() {
},
destroyed() {
}
};
</script>
<style lang="scss" scoped>
.integral-tab {
height: 100%;
// position: fixed;
/deep/ .el-tabs__header {
margin-bottom: 16px;
.el-tabs__nav-wrap {
padding: 0 20px;
}
}
/deep/ .el-tabs__content {
padding: 0 20px 20px;
height: calc(100% - 60px);
overflow-y: auto;
box-sizing: border-box;
}
}
.tip-p{
color: #6B6D71;
padding-bottom: 16px;
// position: fixed;
}
</style>
\ No newline at end of file
<template>
<div >
<div class="search-top mBottom20">
<div class="left-search-wrap">
<el-select
v-model="form.intervalInOut"
class="width160"
placeholder="所有日志"
@change="handleSearch"
>
<el-option
:key=-1
label="所有日志"
:value=-1
></el-option>
<el-option
:key=1
label="积分获取"
:value=1
></el-option>
<el-option
:key=2
label="积分扣除"
:value=2
></el-option>
</el-select>
<el-select
v-model="form.dictCode"
class="width160"
placeholder="所有事由"
@change="handleSearch"
>
<el-option
:key=-1
label="所有事由"
:value=-1
></el-option>
<el-option
v-for="item in dictList"
:key="item.dictCode"
:label="item.dictName"
:value="item.dictCode"
></el-option>
</el-select>
<el-select class="width160" v-model="form.sourceType" placeholder="所有来源渠道" @change="handleSearch">
<el-option label="所有来源渠道" :value=-1></el-option>
<el-option v-for="item in sourceTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-select class="width160" v-model="form.frozenStatus" placeholder="所有积分状态" @change="handleSearch">
<el-option label="所有积分状态" :value=-1></el-option>
<el-option v-for="item in frozenStatusList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-date-picker style="width: 256px;" v-model="dateDefault" type="daterange" range-separator="~" start-placeholder="创建开始日期" end-placeholder="创建结束日期" :default-time="['00:00:00', '23:59:59']" :picker-options="pickerOptions()" value-format="yyyy-MM-dd" @change="handleSearch"> </el-date-picker>
</div>
<el-button
type="primary"
@click="linkRoute('/integralDataPage')"
>查看品牌积分</el-button>
</div>
<div class="table-content">
<el-table
:data="memberData"
tooltip-effect="dark"
ref="multipleTable"
max-height="659"
>
<el-table-column
prop="createTime"
label="时间"
min-width="155px"
>
<template slot-scope="scope">
<div class="line-20">{{ scope.row.createTime | formatYMD }}</div>
<div class="line-20">{{ scope.row.createTime | formatHMS }}</div>
</template>
</el-table-column>
<el-table-column
prop="intervalInout"
label="日志类型"
min-width="90px"
>
<template slot-scope="scope">
<span v-if="scope.row.intervalInout == 1">积分获取</span>
<span v-if="scope.row.intervalInout == 0">积分扣除</span>
</template>
</el-table-column>
<el-table-column
prop="memberIntegralName"
label="事由"
min-width="90px"
></el-table-column>
<el-table-column
prop="intervalHistory"
label="日志详情"
min-width="90px"
></el-table-column>
<el-table-column prop="sourceType" label="来源渠道" min-width="90px" :formatter="formatSourceType"></el-table-column>
<el-table-column
prop="brandName"
label="来源品牌"
min-width="150px"
>
<template slot-scope="scope">
<div class="integral-box text-ellipsis-2 line-20">{{ scope.row.brandName || '--'}}</div>
</template>
</el-table-column>
<el-table-column
prop="remark"
label="备注"
min-width="160px"
>
<template slot-scope="scope">
<div class="integral-box text-ellipsis-2 line-20">{{ scope.row.remark }}</div>
</template>
</el-table-column>
</el-table>
<div
class="page mTop20"
>
<dm-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page.currentPage"
:page-sizes="[20, 40, 60, 80]"
:page-size="page.pageSize"
layout="total, sizes, prev, pager, next"
:total="page.totalCount"
>
</dm-pagination>
</div>
</div>
</div>
</template>
<script>
import mixin from './integralMixin';
import nav from "../../common/navbar/navbar.vue";
import { doFetch } from "../../components/axios/api";
import url from "../../components/axios/url";
import {
checkFalse,
checkStatus
} from "../../../static/js/checkStatus";
// import searchinput from "common/searchinput";
// import authMethods from '@/mixins/auth';
export default {
name: "enterpriseIntegralDetial",
props:{
memberId:{
type: String,
default() {
return '';
}
}
},
components: {
"v-nav": nav,
// searchinput
},
data() {
return {
page: {
currentPage: 1,
pageSize: 20,
totalCount: 0
},
dictList: [],
sourceTypeList: [
{ label: 'GIC计算', value: 1 },
{ label: 'ERP同步', value: 2 },
{ label: 'API同步', value: 3 },
{ label: '批处理导入', value: 4 },
{ label: '天猫会员通', value: 5 },
{ label: '抖音', value: 7 }
],
frozenStatusList:[
{label:'冻结积分',value:1},
{label:'可用积分',value:0}
],
memberData: [
// {createTime:12334494943,intervalInout:1,memberIntegralName:'新增其他',intervalHistory:1333,sourceType:1}
],
form:{
intervalInOut: -1,
dictCode: -1,
sourceType: -1,
frozenStatus:-1,
},
};
},
mixins: [mixin],
methods: {
formatSourceType(row, col, val) {
const type = this.sourceTypeList.find(el => el.value == val) || {};
return type.label || '--';
},
linkRoute(route) {
this.$router.push({ path: route, query: { memberId: this.memberId } });
},
handleSearch() {
this.page.currentPage = 1;
this.getIntegralDataPage();
},
handleCurrentChange(val) {
this.page.currentPage = val;
this.getIntegralDataPage();
},
handleSizeChange(val) {
this.page.pageSize = val;
this.getIntegralDataPage();
},
getIntegralDataPage() {
let para = this.form
para['memberId'] = this.memberId
para['pageSize'] = this.page.pageSize
para['currentPage'] = this.page.currentPage
para['beginTime'] = this.dateDefault[0]
para['endTime'] = this.dateDefault[1]
// console.log(para);
doFetch(url.enterpriseIntegralDetailData, para)
.then(res => {
if (res.data.errorCode === 0) {
this.memberData =
res.data.result.page.result
// &&
// res.data.result.page.result.map(ele => ({
// ...ele,
// mainStoreName: !!ele.mainStoreName ? ele.mainStoreName : "--",
// openStoreName: !!ele.openStoreName ? ele.openStoreName : "--"
// }));
this.page.currentPage = res.data.result.page.currentPage;
this.page.totalCount = res.data.result.page.totalCount;
} else {
checkFalse(res.data.message);
}
})
.catch(err => {
checkStatus(err);
});
},
getIntegralOperateType() {
doFetch(url.integralOperateType, {
businessType: "member_integral",
dictStatus: 0
})
.then(res => {
if (res.data.errorCode === 0) {
res.data.result.dictList.forEach(ele => {
if (ele.dictCode == "1113") {
// 占位
}
});
this.dictList = res.data.result.dictList;
} else {
checkFalse();
}
})
.catch(err => {
checkStatus(err);
});
},
},
created() {
this.setDefalutTime()
if (this.memberId) {
this.getIntegralDataPage();
this.getIntegralOperateType();
}
},
};
</script>
<style lang="stylus">
.search-top{
display: flex;
justify-content:space-between;
align-items:center;
.left-search-wrap{
display: flex;
align-items:center;
gap:10px;
}
}
.width160{
width: 160px;
}
.w256{
width: 256px;
}
.wechat-point-details {
overflow: auto;
}
.line-20{
line-height: 20px;
}
</style>
<template>
<div >
<div class="mBottom20 search-top">
<div class="left-search-wrap">
<el-select
class="width160"
v-model="processStatus"
placeholder="处理状态"
@change="handleSearch"
>
<el-option
v-for="item in statusList"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
<el-date-picker style="width: 256px;" v-model="dateDefault" type="daterange" range-separator="~" start-placeholder="创建开始日期" end-placeholder="创建结束日期" :default-time="['00:00:00', '23:59:59']" :picker-options="pickerOptions()" value-format="yyyy-MM-dd" @change="handleSearch"> </el-date-picker>
</div>
</div>
<div>
<el-table
:data="memberData"
tooltip-effect="dark"
ref="multipleTable"
max-height="659"
>
<el-table-column
prop="createTime"
label="时间"
min-width="157px"
>
<template slot-scope="scope">
<div class="line-20">{{ scope.row.createTime | formatYMD }}</div>
<div class="line-20">{{ scope.row.createTime | formatHMS }}</div>
</template>
</el-table-column>
<el-table-column prop="processStatus" label="处理状态" min-width="110px">
<template slot-scope="scope">
<span :class="statusList[scope.row.processStatus].icon"></span>
{{ statusList[scope.row.processStatus].name }}
</template>
</el-table-column>
<el-table-column
prop="integralVal"
label="预扣除积分值"
min-width="128px"
></el-table-column>
<el-table-column
prop="integralCode"
label="事由"
min-width="90px"
></el-table-column>
<el-table-column prop="sourceType" label="预扣截止时间" min-width="138px">
<template slot="header">
预扣截止时间
<el-tooltip effect="dark" placement="top">
<div slot="content">
<p>预扣积分到达“截止日期”,若还未确认扣除,系统将自动将这笔积分转为“可用”状态(无截止日期的预扣积分,系统不会主动变更积分状态)</p>
</div>
<i class="iconfont icon-QuestionCircleOutlined icon"></i>
</el-tooltip>
</template>
<template slot-scope="scope">
<div class="line-20">{{ scope.row.limitTime | formatYMD }}</div>
<div class="line-20">{{ scope.row.limitTime | formatHMS }}</div>
</template>
</el-table-column>
<el-table-column
prop="relationId"
label="关联id"
min-width="160px"
>
<template slot-scope="scope">
<div class="integral-box text-ellipsis-2 line-20">{{ scope.row.relationId }}</div>
</template>
</el-table-column>
<el-table-column
prop="openStoreName"
label="积分成本主体"
min-width="180px"
>
<template slot-scope="scope">
<div class="integral-box text-ellipsis-2 line-20">{{ scope.row.openStoreName }}</div>
</template>
</el-table-column>
<el-table-column
prop="intervalEffect"
label="备注信息"
min-width="130px"
>
<template slot-scope="scope">
<div class="integral-box text-ellipsis-2 line-20">{{ scope.row.intervalEffect }}</div>
</template>
</el-table-column>
</el-table>
<div
class="page mTop20"
>
<dm-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page.currentPage"
:page-sizes="[20, 40, 60, 80]"
:page-size="page.pageSize"
layout="total, sizes, prev, pager, next"
:total="page.totalCount"
>
</dm-pagination>
</div>
</div>
</div>
</template>
<script>
import mixin from './integralMixin';
import { doFetch } from "../../components/axios/api";
import url from "../../components/axios/url";
import {
checkFalse,
checkStatus
} from "../../../static/js/checkStatus";
export default {
name: 'enterpriseIntegralDataPage',
components: { },
mixins: [mixin],
props: {
memberId:{
type: String,
default() {
return '';
}
}
},
data() {
return {
memberData: [
// {createTime:1723736363636,integralVal:344,intervalEffect:'的好多好多',processStatus:2,limitTime:236363738821,openStoreName:'i u 合适',relationId:'udjdhdu883733737'},
// {createTime:1723736363636,integralVal:344,intervalEffect:'的好多好多',processStatus:1,openStoreName:'i u 合精华的和阿胶恶毒的接电话电话讲的点点滴滴是适'},
// {createTime:1723736363636,integralVal:344,intervalEffect:'的好多好多',processStatus:3},
// {createTime:1723736363636,integralVal:344,intervalEffect:'的好多好多',processStatus:4},
],
page: {
currentPage: 1,
pageSize: 20,
totalCount: 0
},
statusList:[
{code: -1 ,name:'全部处理状态'},
{code: 1 ,name:'待处理',icon:'dm-status--warning'},
{code: 2 ,name:'扣除成功',icon:'dm-status--success'},
{code: 3 ,name:'到时失效',icon:'dm-status--error'},
{code: 4 ,name:'取消操作',icon:'dm-status--info'},
],
processStatus: -1
};
},
methods: {
handleSearch() {
this.page.currentPage = 1;
this.getIntegralDataPage();
},
handleCurrentChange(val) {
this.page.currentPage = val;
this.getIntegralDataPage();
},
handleSizeChange(val) {
this.page.pageSize = val;
this.getIntegralDataPage();
},
getIntegralDataPage() {
// console.log({
// memberId: this.memberId,
// pageSize: this.page.pageSize,
// currentPage: this.page.currentPage,
// processStatus: this.processStatus,
// beginTime: this.dateDefault[0],
// endTime: this.dateDefault[1],
// });
// return
doFetch(url.enterpriseIntegralWithholdData, {
memberId: this.memberId,
pageSize: this.page.pageSize,
currentPage: this.page.currentPage,
processStatus: this.processStatus,
beginTime: this.dateDefault[0],
endTime: this.dateDefault[1],
})
.then(res => {
if (res.data.errorCode === 0) {
this.memberData = res.data.result.page.result
this.page.currentPage = res.data.result.page.currentPage;
this.page.totalCount = res.data.result.page.totalCount;
} else {
checkFalse(res.data.message);
}
})
.catch(err => {
checkStatus(err);
});
},
},
mounted() {
this.setDefalutTime()
console.log(this.memberId,1);
if(this.memberId){
this.getIntegralDataPage()
}
},
destroyed() {
}
};
</script>
<style lang="scss" scoped>
.width160{
width: 160px;
}
.search-top{ .left-search-wrap{
display: flex;
align-items:center;
gap:10px;
}
}
.line-20{
line-height: 20px;
}
.integral-box{
display: flex;
align-items: center;
}
.text-ellipsis-2 {
overflow: hidden;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
}
</style>
<template>
<div class="wechat-point-details">
<div class="integral-tab m20" >
<el-tabs v-model="activeName">
<el-tab-pane label="积分明细" name="first" >
<p class="font14 tip-p">展示近两年的积分明细</p>
<div class="wechat-point-details">
<div class="search-top mBottom20">
<div class="left-search-wrap">
<el-select
......@@ -48,6 +52,7 @@
<el-option label="所有积分状态" :value=-1></el-option>
<el-option v-for="item in frozenStatusList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-date-picker style="width: 256px;" v-model="dateDefault" type="daterange" range-separator="~" start-placeholder="创建开始日期" end-placeholder="创建结束日期" :default-time="['00:00:00', '23:59:59']" :picker-options="pickerOptions()" value-format="yyyy-MM-dd" @change="handleSearch"> </el-date-picker>
</div>
<el-button
v-if="getCodeAuth('memberAdjustIntegral')"
......@@ -218,9 +223,18 @@
<vue-gic-footer></vue-gic-footer>
</div> -->
</div>
</el-tab-pane>
<el-tab-pane label="预扣明细" name="second">
<p class="font14 tip-p">展示近两年的预扣明细</p>
<enterprise-intergral-withhold :member-id="memberId"></enterprise-intergral-withhold>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import mixin from './integralMixin';
import enterpriseIntergralWithhold from './enterpriseIntergralWithhold.vue';
import nav from "../../common/navbar/navbar.vue";
import { doFetch } from "../../components/axios/api";
import url from "../../components/axios/url";
......@@ -235,6 +249,7 @@ export default {
name: "talkLogPage",
data() {
return {
activeName: 'first',
loseVisible: false,
loseData: [],
memberId: this.$route.query.memberId || "",
......@@ -271,7 +286,7 @@ export default {
integralFlag: ""
};
},
mixins: [authMethods],
mixins: [authMethods, mixin],
methods: {
formatSourceType(row, col, val) {
const type = this.sourceTypeList.find(el => el.value == val) || {};
......@@ -322,8 +337,8 @@ export default {
dictCode: this.dictCode,
searchType: this.searchType,
sourceType: this.sourceType,
beginTime: this.beginTime,
endTime: this.endTime,
beginTime: this.dateDefault[0],
endTime: this.dateDefault[1],
storeName: this.storeName,
frozenStatus:this.frozenStatus
})
......@@ -382,6 +397,7 @@ export default {
}
},
created() {
this.setDefalutTime()
if (this.memberId) {
this.getIntegralDataPage();
this.getIntegralOperateType();
......@@ -390,12 +406,21 @@ export default {
},
components: {
"v-nav": nav,
searchinput
searchinput,
enterpriseIntergralWithhold
}
};
</script>
<style lang="stylus">
.m20 {
margin: 20px;
margin-top: 0px;
}
.tip-p{
color: #6B6D71;
padding-bottom: 16px;
}
.clerk {
display: flex;
align-items: center;
......@@ -413,9 +438,7 @@ export default {
}
.wechat-point-details {
padding:20px;
overflow: auto;
}
.footer-box {
......@@ -431,4 +454,20 @@ export default {
gap:10px;
}
}
.integral-tab {
height: 100%;
// position: fixed;
/deep/ .el-tabs__header {
margin-bottom: 16px;
.el-tabs__nav-wrap {
padding: 0 20px;
}
}
/deep/ .el-tabs__content {
padding: 0 20px 20px;
height: calc(100% - 60px);
overflow-y: auto;
box-sizing: border-box;
}
}
</style>
import {formatYMD} from '@/common/filters/custom.js';
export default {
data() {
return {
// dateKey: 0,
dateDefault: [],
pickerOptions() {
// let pickerMinDate;
return {
onPick(obj) {
// pickerMinDate = obj.minDate;
},
disabledDate(time) {
let start = new Date();
start.setFullYear(start.getFullYear() - 2);
start.setDate(start.getDate() + 1);
start = new Date(`${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()}`);
let end = new Date();
end = new Date(`${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()} 23:59:59`);
return time.getTime() < start.getTime() || time.getTime() > end;
}
};
}
};
},
methods: {
setDefalutTime(){
let start = new Date();
start.setFullYear(start.getFullYear() - 2);
start.setDate(start.getDate() + 1);
start = `${start.getFullYear()}-${start.getMonth() + 1}-${start.getDate()}`;
let end = new Date();
end = `${end.getFullYear()}-${end.getMonth() + 1}-${end.getDate()}`;
this.dateDefault = [formatYMD(new Date(start).getTime()), formatYMD(new Date(end).getTime())]
},
}
};
\ No newline at end of file
......@@ -142,7 +142,7 @@
<span>集团会员积分</span><span class="ml15 color555">{{ memberInfo.cliqueMemberIntegral | fomatText }}</span>
</div>
<div class="wechat-carditem">
<span>认证时间</span><span class="ml15 color555">{{ memberInfo.authTime | formatTime }}</span>
<span>微信认证时间</span><span class="ml15 color555">{{ memberInfo.authTime | formatTime }}</span>
</div>
<div class="wechat-carditem">
......
......@@ -142,7 +142,7 @@
<span>集团会员积分</span><span class="ml15 color555">{{ memberInfo.cliqueMemberIntegral | fomatText }}</span>
</div>
<div class="wechat-carditem">
<span>认证时间</span><span class="ml15 color555">{{ memberInfo.authTime | formatTime }}</span>
<span>微信认证时间</span><span class="ml15 color555">{{ memberInfo.authTime | formatTime }}</span>
</div>
<div class="wechat-carditem">
......
......@@ -53,6 +53,13 @@ export const constantRouterMap = [
},
},
{
path: '/customerLog',
component: _import('allCustomers/components', 'customerLog'),
meta: {
title: '客户日志',
},
},
{
path: '/order-list',
component: _import('allCustomers', 'order-list'),
meta: {
......@@ -252,6 +259,13 @@ export const constantRouterMap = [
},
},
{
path: '/enterpriseIntegralDataPage',
component: _import('wechatmembers', 'enterpriseIntegralDataPage'),
meta: {
title: '微信会员-集团积分',
},
},
{
path: '/storedValue',
component: _import('wechatmembers', 'storedValue'),
meta: {
......
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