Commit 61ccec16 by huaying

Merge branch 'feature/9月基础迭代'

# Conflicts:
#	src/components/allCustomers/order-list/order-table.vue
parents cf4ef4ae aa71758b
...@@ -24,6 +24,14 @@ const authCode = { ...@@ -24,6 +24,14 @@ const authCode = {
memberInteractionSwitch: 'memberInteractionSwitch', // 会员成就互动类-开关 memberInteractionSwitch: 'memberInteractionSwitch', // 会员成就互动类-开关
memberInteractionSetAmount: 'memberInteractionSetAmount', // 会员成就互动类-配置额度 memberInteractionSetAmount: 'memberInteractionSetAmount', // 会员成就互动类-配置额度
memberInteractionSetAward: 'memberInteractionSetAward', // 会员成就互动类-配置奖励 memberInteractionSetAward: 'memberInteractionSetAward', // 会员成就互动类-配置奖励
//客户列表页面 批量导入中的下拉框数据
importMember: 'importMember', //会员导入
importIncreaseOfPoints: 'importIncreaseOfPoints', //积分增加
importPointDeduction: 'importPointDeduction', //积分扣除
importGradeAdjustment: 'importGradeAdjustment', //等级调整
importServiceStore: 'importServiceStore', //服务门店/专属导购调整
importMappingFreeze: 'importMappingFreeze', //批量冻结会员
importMappingUnfreeze: 'importMappingUnfreeze', //批量解冻会员
}; };
export default authCode; export default authCode;
...@@ -3971,11 +3971,12 @@ ...@@ -3971,11 +3971,12 @@
.el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close { .el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close {
color: #2F54EB; } color: #2F54EB; }
.el-dialog__title { .el-dialog__title {
line-height: 24px; line-height: 22px;
font-size: 18px; font-size: 16px !important;
font-weight: 500;
color: #303133; } color: #303133; }
.el-dialog__body { .el-dialog__body {
padding: 20px 20px 10px 20px; padding: 10px 20px 10px 20px;
color: #606266; color: #606266;
font-size: 14px; } font-size: 14px; }
.el-dialog__footer { .el-dialog__footer {
...@@ -28288,7 +28289,7 @@ ...@@ -28288,7 +28289,7 @@
left: 0; left: 0;
bottom: 0; bottom: 0;
width: 100%; width: 100%;
height: 2px; height: 1px;
background-color: #e4e7ed; background-color: #e4e7ed;
z-index: 1; } z-index: 1; }
.el-tabs__nav-wrap.is-scrollable { .el-tabs__nav-wrap.is-scrollable {
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="shortcut icon" href="./favicon.ico" /> <link rel="shortcut icon" href="./favicon.ico" />
<style href="//at.alicdn.com/t/font_2996579_ubjq74uy5wj.css"></style><!--GIC3.0 客户 --> <style href="//at.alicdn.com/t/font_2996579_ubjq74uy5wj.css"></style><!--GIC3.0 客户 -->
<script src="//at.alicdn.com/t/font_2996579_ubjq74uy5wj.js"></script><!--GIC3.0 客户 -->
<!-- 3.0 组件库 --> <!-- 3.0 组件库 -->
<script src="//at.alicdn.com/t/font_2859043_ckil7xvsqi.js"></script> <script src="//at.alicdn.com/t/font_2859043_ckil7xvsqi.js"></script>
<!-- <link rel="stylesheet" href="//web-1251519181.file.myqcloud.com/simple-style.1.0.2.css"></link> --> <!-- <link rel="stylesheet" href="//web-1251519181.file.myqcloud.com/simple-style.1.0.2.css"></link> -->
......
...@@ -55,9 +55,17 @@ let fomatFloat = val => { ...@@ -55,9 +55,17 @@ let fomatFloat = val => {
} }
} }
let fomatFloatN = val => {
if (val || val == 0) {
return parseFloat(val).toFixed(2)
} else {
return '';
}
}
let defaultImg = val => { let defaultImg = val => {
if(!val) { if(!val) {
return './static/img/default.png' return './static/img/default.png'
} }
} }
export { formatTime,fomatNumber,fomatText,formatYMD,fomatFloat,defaultImg,formatHMS } export { formatTime,fomatNumber,fomatText,formatYMD,fomatFloat,fomatFloatN,defaultImg,formatHMS }
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
/> />
</template> </template>
</el-select> </el-select>
<el-button v-if="getCodeAuth('memberBatchImport')" :limit-code="getCode('memberBatchImport')" type="primary" @click="batchImport" style="margin-right:5px">批量导入修改</el-button> <el-button v-if="getCodeAuth('memberBatchImport')" :limit-code="getCode('memberBatchImport')" type="primary" @click="batchImport" style="margin-right:5px">批量导入</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- <div class="action-wrap"> <!-- <div class="action-wrap">
...@@ -137,6 +137,7 @@ ...@@ -137,6 +137,7 @@
</div> </div>
<div class="list-section-table"> <div class="list-section-table">
<el-table <el-table
:max-height="maxHeight"
v-loading="loading" v-loading="loading"
:data="tableData" :data="tableData"
tooltip-effect="dark" tooltip-effect="dark"
...@@ -153,7 +154,7 @@ ...@@ -153,7 +154,7 @@
:label="memberFieldsName[colum]" :label="memberFieldsName[colum]"
:prop="colum" :prop="colum"
show-overflow-tooltip show-overflow-tooltip
:min-width="colum==='name' ? 210 : colum == 'status' ? 170 : 150" :min-width="colum==='name' ? 200 : (colum == 'status' || colum == 'lastCostPaid') ? 170 : (colum == 'lastCostTime' || colum == 'allChannelLastCostTime' || colum == 'costFeePaid' || colum == 'lastCost' || colum == 'allChannelDiscountRate') ? 180 : colum == 'allChannelCostTimes' ? 160 : (colum == 'costAll' || colum == 'allChannelCostAllPaid' || colum == 'allChannelHighCostPaid' || colum == 'highCost' || colum == 'highCostPaid') ? 190 : 150"
:fixed="colum==='name'" :fixed="colum==='name'"
:sortable="['name','grade','status','channel','createCardStoreName','cardNo','forzenStatus','mainStoreName'].includes(colum)?false:isExist[colum]?'custom':false" :sortable="['name','grade','status','channel','createCardStoreName','cardNo','forzenStatus','mainStoreName'].includes(colum)?false:isExist[colum]?'custom':false"
> >
...@@ -166,7 +167,11 @@ ...@@ -166,7 +167,11 @@
class="basic-info-table" class="basic-info-table"
@click.native="linkDetail(row.memberId)" @click.native="linkDetail(row.memberId)"
> >
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" /> <img v-if="row.thirdImgUrl" :src="row.thirdImgUrl" class="basic-img" />
<svg v-else aria-hidden="true" class="basic-img">
<use xlink:href="#icon-user-default"></use>
</svg>
<div> <div>
<div class="member-name"> <div class="member-name">
...@@ -247,6 +252,11 @@ ...@@ -247,6 +252,11 @@
<div>{{ row.createTime.split(' ')[0] }}</div> <div>{{ row.createTime.split(' ')[0] }}</div>
<div>{{ row.createTime.split(' ')[1] }}</div> <div>{{ row.createTime.split(' ')[1] }}</div>
</div> </div>
<!-- 最近消费时间(全渠道) -->
<!-- <div v-else-if="colum == 'allChannelLastCostTime'">
<div>{{ row.allChannelLastCostTime.split(' ')[0] }}</div>
<div>{{ row.allChannelLastCostTime.split(' ')[1] }}</div>
</div> -->
<!-- 关注时间 --> <!-- 关注时间 -->
<div v-else-if="colum == 'attentionDate'"> <div v-else-if="colum == 'attentionDate'">
<div>{{ row.attentionTime.split(' ')[0] }}</div> <div>{{ row.attentionTime.split(' ')[0] }}</div>
......
...@@ -18,17 +18,22 @@ ...@@ -18,17 +18,22 @@
> >
<el-form-item label="导入类型" prop="importValue"> <el-form-item label="导入类型" prop="importValue">
<el-select <el-select
style="width: 460px"
v-model="formByImport.importValue" v-model="formByImport.importValue"
placeholder="请选择导入类型" placeholder="请选择导入类型"
@change="handleChangeType" @change="handleChangeType"
:disabled="importList.length < 2" :disabled="importList.length < 2"
> >
<template v-for="item in importList">
<el-option <el-option
:label="item.importValue" :label="item.importValue"
:value="item.importType" :value="item.importType"
v-for="item in importList" v-if="getCodeAuth(item.btnCode)"
:key="item" :limit-code="getCode(item.btnCode)"
></el-option> :key="item">
</el-option>
</template>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="选择文件" prop="file" required> <el-form-item label="选择文件" prop="file" required>
...@@ -39,21 +44,10 @@ ...@@ -39,21 +44,10 @@
<div class="dialogTips"> <div class="dialogTips">
<h3><i class="el-icon-info"></i><span>导入规则</span></h3> <h3><i class="el-icon-info"></i><span>导入规则</span></h3>
<p> <p>
1. 通过导入Excel表格的形式变更GIC已存在的会员信息;不支持导入新会员数据 1. 不同的导入类型,请下载对应的导入模板,按照模板要求填充内容进行导入。<br/>
</p> 2. 每次导入数据最多10000条,文件大小不超过1M。<br/>
<p> 3. 请仔细核对需要导入/变更的会员数据是否准确,否则GIC校验不通过将无法执行成功。<br/>
2. 仅支持.xlsx 文件的导入;每次导入数据量最多为10000条;文件大小不超过1M 4. 超管账号支持导入/变更全部会员信息,已分权商户的子管理员账号仅可导入/变更管辖范围内的会员信息。
</p>
<p>
3.
导入类型不同,文件模板也不同,请严格按照模板内容填入会员数据,否则将会报错
</p>
<p>
4. 请仔细核对需要变更的会员数据是否准确,否则GIC校验不通过将无法执行成功
</p>
<p>
5.
超管账号支持导入变更全部会员信息,已分权商户的子管理员账号仅可修改管辖范围内的会员信息
</p> </p>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
...@@ -68,8 +62,10 @@ ...@@ -68,8 +62,10 @@
import url from "@/components/axios/url"; import url from "@/components/axios/url";
import { checkFalse } from "../../../../static/js/checkStatus"; import { checkFalse } from "../../../../static/js/checkStatus";
import { doFetch } from "@/components/axios/api"; import { doFetch } from "@/components/axios/api";
import authMethods from "@/mixins/auth";
export default { export default {
mixins: [authMethods],
props: { props: {
dialogVisible: { dialogVisible: {
type: Boolean, type: Boolean,
...@@ -82,11 +78,13 @@ export default { ...@@ -82,11 +78,13 @@ export default {
{ {
importType: 15, importType: 15,
importValue: "批量冻结会员", importValue: "批量冻结会员",
btnCode: 'memberBatchImport'
}, },
{ {
importType: 16, importType: 16,
importValue: "批量解冻会员", importValue: "批量解冻会员",
}, btnCode: 'memberBatchImport'
}
], ],
}, },
}, },
...@@ -130,6 +128,7 @@ export default { ...@@ -130,6 +128,7 @@ export default {
watch: { watch: {
importList:{ importList:{
handler(n){ handler(n){
n = n.filter(item=> item.btnCode);
let value = ''; let value = '';
if(n && n.length){ if(n && n.length){
value = n[0].importType; value = n[0].importType;
...@@ -167,9 +166,10 @@ export default { ...@@ -167,9 +166,10 @@ export default {
}, },
// 确认导入 // 确认导入
importTable() { importTable() {
if (this.load) return;
this.$refs.formByImport.validateField("importValue", (err) => { this.$refs.formByImport.validateField("importValue", (err) => {
if (!err) { if (!err) {
// console.log(this.formByImport.fileList); console.log(this.formByImport.fileList);
let {fileList,importValue} = this.formByImport; let {fileList,importValue} = this.formByImport;
if (fileList.length) { if (fileList.length) {
this.load = true; this.load = true;
...@@ -190,7 +190,9 @@ export default { ...@@ -190,7 +190,9 @@ export default {
this.onDialogImportClosed(); this.onDialogImportClosed();
} }
}).finally(()=>{ }).finally(()=>{
this.load = false; setTimeout(() => {
this.load = false;
}, 50)
}) })
} else { } else {
checkFalse("请上传文件"); checkFalse("请上传文件");
...@@ -206,8 +208,8 @@ export default { ...@@ -206,8 +208,8 @@ export default {
border: none; border: none;
} }
.dialogTips { .dialogTips {
padding-bottom: 8px; padding-bottom: 24px;
padding-top: 22px; padding-top: 20px;
border-top: 1px dashed #DCDFE6; border-top: 1px dashed #DCDFE6;
color: #909399; color: #909399;
h3 { h3 {
...@@ -225,6 +227,10 @@ export default { ...@@ -225,6 +227,10 @@ export default {
} }
p { p {
font-size: 12px; font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #909399;
line-height: 20px;
} }
} }
.success_icon { .success_icon {
......
...@@ -85,7 +85,7 @@ export default { ...@@ -85,7 +85,7 @@ export default {
.table-colum-wrap { .table-colum-wrap {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
width: 100%; width: 105%;
.table-colum-item { .table-colum-item {
flex: 25%; flex: 25%;
line-height: 35px; line-height: 35px;
......
<template>
<el-dialog title="微信转POS" :visible.sync="dialogVisible" custom-class="customer-dialog" @close="cancel" width="420px">
<p style="margin-bottom: 8px">确认将此客户的微信信息删除吗?删除后:</p>
<p style="margin-bottom: 8px">
1、此客户的客户类型将从微信会员转为POS会员;<br/>
2、该客户与微信侧的关联信息将被清除(公众号和小程序);<br/>
3、与该客户相关的数据统计将产生影响如微信会员数、POS转微信会员数等
</p>
<p>删除后不可恢复,请谨慎操作!</p>
<span slot="footer" class="dialog-footer">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="okBtn">确定</el-button>
</span>
</el-dialog>
</template>
<script>
import { doFetchGet } from '../../axios/api';
import url from '../../axios/url';
export default {
props: {
dialogVisible: {
type: Boolean,
default: false,
},
memberId: {
type: String,
default: ''
}
},
data() {
return {
};
},
methods: {
cancel() {
this.$emit('update:dialogVisible', false);
},
okBtn() {
doFetchGet(url.weChantToPos,{mid: this.memberId}).then((res)=>{
if(res.data.errorCode == 0){
this.cancel();
this.$emit('refresh');
this.$message.success('操作成功');
}else{
this.$message.error(res.data.message);
}
})
}
}
};
</script>
<style lang="less">
.customer-dialog {
/deep/.el-dialog__header{
font-size: 16px !important;
}
}
</style>
<style lang="less" scoped>
.customer-dialog {
background: #000000;
opacity: 0.5;
p {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #303133;
line-height: 20px;
}
}
</style>
\ No newline at end of file
...@@ -6,10 +6,13 @@ ...@@ -6,10 +6,13 @@
<h2 class="item-title"> <h2 class="item-title">
<i class="vertical-line" /><span>{{ section.title }}</span> <i class="vertical-line" /><span>{{ section.title }}</span>
</h2> </h2>
<el-button type="text" v-if="section.name==='basic' && getCodeAuth('memberEditInfo')" <div>
<el-button type="text" v-if="section.name==='basic' && getCodeAuth('memberEditInfo')"
@click="baseinfoDialogVisible=true" :limit-code="getCode('memberEditInfo')"> @click="baseinfoDialogVisible=true" :limit-code="getCode('memberEditInfo')">
编辑 编辑
</el-button> </el-button>
<el-button type="text" v-if="section.name==='basic' && getCodeAuth('wxToPOS') && member.customerType == 'wxOpenCarMember'" :limit-code="getCode('wxToPOS')" style="margin-left:12px" @click="weChantDialogVisible=true">微信转POS</el-button>
</div>
</div> </div>
<div :class="[section.class]"> <div :class="[section.class]">
<!-- 基本信息 --> <!-- 基本信息 -->
...@@ -29,12 +32,16 @@ ...@@ -29,12 +32,16 @@
<el-image <el-image
fit="cover" fit="cover"
class="user-avatar-img" class="user-avatar-img"
:src="member.thirdImgUrl ? member.thirdImgUrl : defaultImg" v-if="member.thirdImgUrl"
:src="member.thirdImgUrl"
> >
<div slot="error" class="image-slot"> <div slot="error" class="image-slot">
<img width="120" :src="require('../../../static/img/broke-img.png')" alt=""> <img width="120" :src="require('../../../static/img/broke-img.png')" alt="">
</div> </div>
</el-image> </el-image>
<svg v-else aria-hidden="true" class="user-avatar-img" width="120px" height="120px">
<use xlink:href="#icon-user-default"></use>
</svg>
</div> </div>
</div> </div>
<div class="right"> <div class="right">
...@@ -813,6 +820,9 @@ ...@@ -813,6 +820,9 @@
:memberId="memberId" :memberId="memberId"
@refresh="initData" @refresh="initData"
/> />
<!-- 微信转POS弹窗 -->
<wxToPosDialog :dialogVisible.sync="weChantDialogVisible" :memberId="memberId"
@refresh="initData"></wxToPosDialog>
</div> </div>
</template> </template>
<script> <script>
......
...@@ -10,7 +10,6 @@ import { doFetch,doFetchGet } from "../../components/axios/api"; ...@@ -10,7 +10,6 @@ import { doFetch,doFetchGet } from "../../components/axios/api";
import url from "../../components/axios/url"; import url from "../../components/axios/url";
import { mapState } from "vuex"; import { mapState } from "vuex";
import { formatLongTime, paddingBorth } from "@/utils/utils"; import { formatLongTime, paddingBorth } from "@/utils/utils";
import defaultImg from "../../../static/img/default.png";
import authMethods from "@/mixins/auth"; import authMethods from "@/mixins/auth";
import { import {
checkFalse, checkFalse,
...@@ -21,6 +20,7 @@ export default { ...@@ -21,6 +20,7 @@ export default {
name: "allCustomersList", name: "allCustomersList",
data() { data() {
return { return {
maxHeight: '',
selectChannelValue: '', selectChannelValue: '',
selectChannelList: { selectChannelList: {
selectOptions: { selectOptions: {
...@@ -37,6 +37,7 @@ export default { ...@@ -37,6 +37,7 @@ export default {
// disabled: false // disabled: false
// }, // },
], ],
showExpandIcon: false,
props: { props: {
label: 'label', label: 'label',
children: 'children', children: 'children',
...@@ -46,30 +47,42 @@ export default { ...@@ -46,30 +47,42 @@ export default {
searchAble: false, searchAble: false,
multipleAble: true multipleAble: true
}, },
isShowClique: '',
importList:[ importList:[
{ {
importType: 18,
importValue: "会员导入",
btnCode: 'importMember'
},
{
importType: 11, importType: 11,
importValue: "积分增加", importValue: "积分增加",
btnCode: 'importIncreaseOfPoints'
}, },
{ {
importType: 12, importType: 12,
importValue: "积分扣除", importValue: "积分扣除",
btnCode: 'importPointDeduction'
}, },
{ {
importType: 13, importType: 13,
importValue: "等级调整", importValue: "等级调整",
btnCode: 'importGradeAdjustment'
}, },
{ {
importType: 14, importType: 14,
importValue: "服务门店/专属导购调整", importValue: "服务门店/专属导购调整",
btnCode: 'importServiceStore'
}, },
{ {
importType: 15, importType: 15,
importValue: "批量冻结会员", importValue: "批量冻结会员",
btnCode: 'importMappingFreeze'
}, },
{ {
importType: 16, importType: 16,
importValue: "批量解冻会员", importValue: "批量解冻会员",
btnCode: 'importMappingUnfreeze'
}, },
], ],
sceneValue: "member", // 人群筛选器场景值 sceneValue: "member", // 人群筛选器场景值
...@@ -115,7 +128,6 @@ export default { ...@@ -115,7 +128,6 @@ export default {
{ value: "mainstore", label: "修改服务门店", code: "memberBatchSetService" }, { value: "mainstore", label: "修改服务门店", code: "memberBatchSetService" },
{ value: "store", label: "修改协管门店", code: "memberBatchSetCustomer" } { value: "store", label: "修改协管门店", code: "memberBatchSetCustomer" }
], ],
defaultImg,
integralFlag: "", // 积分调整权限 integralFlag: "", // 积分调整权限
memberGrade: [], // 商户等级列表 memberGrade: [], // 商户等级列表
cliqueMemberGrade: [], // 集团等级列表 cliqueMemberGrade: [], // 集团等级列表
...@@ -237,22 +249,54 @@ export default { ...@@ -237,22 +249,54 @@ export default {
} }
}, },
created() { created() {
this.$store.commit("mutations-slide", true); this.$store.commit("mutations-slide", true);
this.initialize(); this.initialize();
this.getGradeList(); this.getGradeList();
this.getCliqueGradeList(); this.getCliqueGradeList();
this.getMemberSourceList(); this.getMemberSourceList();
let screenHeight = document.documentElement.clientHeight - 293 + 'px';
this.$nextTick(() => {
this.maxHeight = screenHeight;
});
}, },
mounted() { mounted() {
this.getcliqueMemberRelation();
this.getFindMemberFields(); this.getFindMemberFields();
this.getAjaxMembers(); this.getAjaxMembers();
this.getEnterpriseInfo(); this.getEnterpriseInfo();
const that = this;
window.onresize = () => {
return (() => {
let screenHeight = document.documentElement.clientHeight - 293 + 'px';
that.maxHeight = screenHeight;
})();
};
}, },
activated(){ activated(){
this.getAjaxMembers(); this.getAjaxMembers();
}, },
beforUpdate() {}, beforUpdate() {},
methods: { methods: {
getcliqueMemberRelation() {
doFetchGet(url.cliqueMemberRelation, {}).then((res)=>{
let {errorCode,result} = res.data;
if(errorCode == 0){
this.isShowClique = result || 2;
this.importList = this.importList.map((item, index)=>{
if(this.getCodeAuth(item.btnCode)){
if(item.btnCode == 'importMember' && this.isShowClique == 1) {
return {};
}else {
return item;
}
}else{
return {};
}
})
}
})
},
onSelectTreeChange(data) { onSelectTreeChange(data) {
this.customerType = data; this.customerType = data;
}, },
...@@ -336,10 +380,14 @@ export default { ...@@ -336,10 +380,14 @@ export default {
tableData = resultData.map(ele => ({ tableData = resultData.map(ele => ({
...ele, ...ele,
avgNumber: ele.avgNumber.toFixed(2), avgNumber: ele.avgNumber.toFixed(2),
allChannelLastCostTime:
ele.allChannelLastCostTime != -1
? formatLongTime(ele.allChannelLastCostTime, 2)
: "--", // 最近消费时间(全渠道)
lastCostTime: lastCostTime:
ele.lastCostTime != -1 ele.lastCostTime != -1
? formatLongTime(ele.lastCostTime, 2) ? formatLongTime(ele.lastCostTime, 2)
: "--", // 最近消费时间 : "--", // 最近消费时间(线下)
createTime: createTime:
ele.createTime != -1 ele.createTime != -1
? formatLongTime(ele.createTime, 1) ? formatLongTime(ele.createTime, 1)
......
...@@ -5,12 +5,12 @@ import customermainstoreDialog from './components/customermainstoreDialog.vue'; ...@@ -5,12 +5,12 @@ import customermainstoreDialog from './components/customermainstoreDialog.vue';
import customersubstoreDialog from './components/customersubstoreDialog.vue'; import customersubstoreDialog from './components/customersubstoreDialog.vue';
import customerlabelDialog from './components/customerlabelDialog.vue'; import customerlabelDialog from './components/customerlabelDialog.vue';
import IconLabelValue from './components/icon-label-value.vue'; import IconLabelValue from './components/icon-label-value.vue';
import defaultImg from '../../../static/img/default.png';
import { mapState } from 'vuex'; import { mapState } from 'vuex';
import url from '../../components/axios/url'; import url from '../../components/axios/url';
import { doFetch, doFetchqs, doFetchGet } from '../../components/axios/api'; import { doFetch, doFetchqs, doFetchGet } from '../../components/axios/api';
import authMethods from '@/mixins/auth'; import authMethods from '@/mixins/auth';
import CustomerLog from './components/customerLog.vue'; import CustomerLog from './components/customerLog.vue';
import wxToPosDialog from './components/wxToPosDialog.vue';
import { import {
checkFalse, checkFalse,
checkStatus, checkStatus,
...@@ -72,7 +72,6 @@ export default { ...@@ -72,7 +72,6 @@ export default {
// currentPage: 1, // currentPage: 1,
// }, // },
// totalCount: 0, // totalCount: 0,
defaultImg,
labelTabsActive: 'memberTagGroup', labelTabsActive: 'memberTagGroup',
fullscreenLoading: false, // 全局loading fullscreenLoading: false, // 全局loading
// tableLoading: false, // 用户日志列表loading // tableLoading: false, // 用户日志列表loading
...@@ -176,7 +175,9 @@ export default { ...@@ -176,7 +175,9 @@ export default {
}, },
// { title: '客户日志', name: 'log', class: 'log-info-contain' }, // { title: '客户日志', name: 'log', class: 'log-info-contain' },
], ],
marketingRecordNum: 0 marketingRecordNum: 0,
// 微信转POS
weChantDialogVisible: false,
}; };
}, },
watch: { watch: {
...@@ -517,6 +518,7 @@ export default { ...@@ -517,6 +518,7 @@ export default {
customersubstoreDialog, customersubstoreDialog,
customerlabelDialog, customerlabelDialog,
IconLabelValue, IconLabelValue,
CustomerLog CustomerLog,
wxToPosDialog,
}, },
}; };
<template> <template>
<el-tabs v-model="activeName" class="order-tab"> <div class="orderListBox" :style="activeName != 'store' ? 'margin-top: -20px;' : ''">
<!-- <el-tab-pane label="全部订单(61)" name="all">用户管理</el-tab-pane> --> <div class="orderListTop" v-if="activeName == 'store'">
<el-tab-pane :label="`门店订单(${orderCount.numOfSale || 0})`" name="store"> <div class="order-report-content">
<div class="order-report"> <div class="order-content-left">
<div class="order-report-item" v-for="(el, index) in storeOrderReport" :key="index"> <div class="order-report-title">消费数据概览</div>
<div class="order-report-label">{{ el.label }}</div> <p style="margin-bottom: 13px;">
<div class="order-report-value" v-if="el.type == 'int'">{{ el.value || 0 }}</div> <img src="../../../static/img/编组 3@2x(1).png" alt="">
<div class="order-report-value" v-else-if="el.type == 'date'">{{ el.value | formatYMD }}</div> <span>全渠道</span>
<div class="order-report-value" v-else>{{ el.value | fomatFloat }}</div> </p>
<p>
<img src="../../../static/img/编组 3@2x.png" alt="">
<span>门店订单</span>
</p>
</div> </div>
<div class="order-content-right">
<!-- 上 -->
<div class="order-report-box">
<div class="order-report-item">
<div class="order-report-label" style="width:118px">消费总额/实付</div>
<div class="order-report-label" style="width:96px">消费次数</div>
<div class="order-report-label" style="width:124px">最近消费时间</div>
<div class="order-report-label" style="width:82px">客单价</div>
<div class="order-report-label" style="width:82px">连带率</div>
<div class="order-report-label" style="width:131px">最高单笔/实付</div>
<div class="order-report-label" style="width:87px">平均折扣</div>
<div class="order-report-label" style="width:130px">消费总额/应收</div>
<div class="order-report-label" style="width:70px">件单价</div>
<div class="order-report-label" style="width:91px">最高单笔/应收</div>
</div>
</div>
<div style="display:flex;padding-top:3px">
<!-- 中 -->
<div class="order-report-middle">
<div class="order-report-value" style="width:118px">{{ allOrderReport[0].value | fomatFloat }}</div>
<div class="order-report-value" style="width:96px">{{ allOrderReport[1].value || 0 }}</div>
<div class="order-report-value" style="width:124px">{{ allOrderReport[2].value | formatYMD }}</div>
<div class="order-report-value" style="width:82px">{{ allOrderReport[3].value | fomatFloat }}</div>
<div class="order-report-value" style="width:82px">{{ allOrderReport[4].value | fomatFloat }}</div>
<div class="order-report-value" style="width:131px">{{ allOrderReport[5].value | fomatFloat }}</div>
<div class="order-report-value" style="width:87px">{{ allOrderReport[6].value | fomatFloat }}</div>
<div class="order-report-value" style="width:130px">{{ allOrderReport[7].value | fomatFloatN }}</div>
<div class="order-report-value" style="width:70px">{{ allOrderReport[8].value | fomatFloatN }}</div>
<div class="order-report-value" style="width:91px">{{ allOrderReport[9].value | fomatFloatN }}</div>
</div>
</div>
<div style="display:flex">
<!-- 下 -->
<div class="order-report-bottom">
<div class="order-report-value" style="width:118px">{{ storeOrderReport[0].value | fomatFloat }}</div>
<div class="order-report-value" style="width:96px">{{ storeOrderReport[1].value || 0 }}</div>
<div class="order-report-value" style="width:124px">{{ storeOrderReport[2].value | formatYMD }}</div>
<div class="order-report-value" style="width:82px">{{ storeOrderReport[3].value | fomatFloat }}</div>
<div class="order-report-value" style="width:82px">{{ storeOrderReport[4].value | fomatFloat }}</div>
<div class="order-report-value" style="width:131px">{{ storeOrderReport[5].value | fomatFloat }}</div>
<div class="order-report-value" style="width:87px">{{ storeOrderReport[6].value | fomatFloat }}</div>
<div class="order-report-value" style="width:130px">{{ storeOrderReport[7].value | fomatFloat }}</div>
<div class="order-report-value" style="width:70px">{{ storeOrderReport[8].value | fomatFloat }}</div>
<div class="order-report-value" style="width:91px">{{ storeOrderReport[9].value | fomatFloat }}</div>
</div>
</div>
</div>
<!-- <div class="order-report">
<div class="order-report-item" v-for="(el, index) in storeOrderReport" :key="index">
<div class="order-report-label">{{ el.label }}</div>
<div class="order-report-value" v-if="el.type == 'int'">{{ el.value || 0 }}</div>
<div class="order-report-value" v-else-if="el.type == 'date'">{{ el.value | formatYMD }}</div>
<div class="order-report-value" v-else>{{ el.value | fomatFloat }}</div>
</div>
</div> -->
</div> </div>
<order-table tab="store"></order-table> </div>
</el-tab-pane> <el-tabs v-model="activeName" class="order-tab">
<el-tab-pane :label="`达摩微商城(${orderCount.wechatMallNum || 0})`" name="demo"> <!-- <el-tab-pane label="全部订单(61)" name="all">用户管理</el-tab-pane> -->
<order-table tab="demo"></order-table> <el-tab-pane :label="`门店订单(${orderCount.numOfSale || 0})`" name="store">
</el-tab-pane> <order-table tab="store"></order-table>
<el-tab-pane :label="`微盟订单(${orderCount.weimobMallNum || 0})`" name="weimob"> </el-tab-pane>
<order-table tab="weimob"></order-table> <el-tab-pane :label="`达摩微商城(${orderCount.wechatMallNum || 0})`" name="demo">
</el-tab-pane> <order-table tab="demo"></order-table>
<el-tab-pane :label="`天猫订单(${orderCount.numOfTmall || 0})`" name="tmall"> </el-tab-pane>
<order-table tab="tmall"></order-table> <el-tab-pane :label="`微盟订单(${orderCount.weimobMallNum || 0})`" name="weimob">
</el-tab-pane> <order-table tab="weimob"></order-table>
<el-tab-pane :label="`抖音订单(${orderCount.numOfDouYin || 0})`" name="douyin"> </el-tab-pane>
<order-table tab="douyin"></order-table> <el-tab-pane :label="`天猫订单(${orderCount.numOfTmall || 0})`" name="tmall">
</el-tab-pane> <order-table tab="tmall"></order-table>
<el-tab-pane :label="`其他订单(${orderCount.otherMallNum || 0})`" name="other"> </el-tab-pane>
<order-table tab="other"></order-table> <el-tab-pane :label="`抖音订单(${orderCount.numOfDouYin || 0})`" name="douyin">
</el-tab-pane> <order-table tab="douyin"></order-table>
</el-tabs> </el-tab-pane>
<el-tab-pane :label="`其他订单(${orderCount.otherMallNum || 0})`" name="other">
<order-table tab="other"></order-table>
</el-tab-pane>
</el-tabs>
</div>
</template> </template>
<script> <script>
...@@ -59,15 +123,27 @@ export default { ...@@ -59,15 +123,27 @@ export default {
}, },
storeOrderReport: [ storeOrderReport: [
{ label: '消费总额(实付)', key: 'costFeePaid', type: 'amount', value: 0 }, { label: '消费总额(实付)', key: 'costFeePaid', type: 'amount', value: 0 },
{ label: '消费总额(应收)', key: 'costFee', type: 'amount', value: 0 },
{ label: '消费次数', key: 'costTimes', type: 'int', value: 0 }, { label: '消费次数', key: 'costTimes', type: 'int', value: 0 },
{ label: '最近消费时间', key: 'lastCostTime', type: 'date', value: '' }, { label: '最近消费时间', key: 'lastCostTime', type: 'date', value: '' },
{ label: '客单价', key: 'avgCost', type: 'amount', value: 0 }, { label: '客单价', key: 'avgCost', type: 'amount', value: 0 },
{ label: '连带率', key: 'relatedPercent', type: 'float', value: 0 }, { label: '连带率', key: 'relatedPercent', type: 'float', value: 0 },
{ label: '件单价', key: 'avgGoodsCost', type: 'amount', value: 0 },
{ label: '最高单笔(实付)', key: 'highCostPaid', type: 'amount', value: 0 }, { label: '最高单笔(实付)', key: 'highCostPaid', type: 'amount', value: 0 },
{ label: '平均折扣', key: 'avgDiscount', type: 'float', value: 0 },
{ label: '消费总额(应收)', key: 'costFee', type: 'amount', value: 0 },
{ label: '件单价', key: 'avgGoodsCost', type: 'amount', value: 0 },
{ label: '最高单笔(应收)', key: 'highCost', type: 'amount', value: 0 }, { label: '最高单笔(应收)', key: 'highCost', type: 'amount', value: 0 },
],
allOrderReport: [
{ label: '消费总额(实付)', key: 'costFeePaid', type: 'amount', value: 0 },
{ label: '消费次数', key: 'costTimes', type: 'int', value: 0 },
{ label: '最近消费时间', key: 'lastCostTime', type: 'date', value: '' },
{ label: '客单价', key: 'avgCost', type: 'amount', value: 0 },
{ label: '连带率', key: 'relatedPercent', type: 'float', value: 0 },
{ label: '最高单笔(实付)', key: 'highCostPaid', type: 'amount', value: 0 },
{ label: '平均折扣', key: 'avgDiscount', type: 'float', value: 0 }, { label: '平均折扣', key: 'avgDiscount', type: 'float', value: 0 },
{ label: '消费总额(应收)', key: 'costFee', type: 'amount', value: 0 },
{ label: '件单价', key: 'avgGoodsCost', type: 'amount', value: 0 },
{ label: '最高单笔(应收)', key: 'highCost', type: 'amount', value: 0 },
] ]
} }
}, },
...@@ -76,6 +152,7 @@ export default { ...@@ -76,6 +152,7 @@ export default {
this.memberId = this.$route.query.memberId; this.memberId = this.$route.query.memberId;
this.getMemberInfo(); this.getMemberInfo();
this.getStoreReportData(); this.getStoreReportData();
this.getAllReportData();
}, },
methods: { methods: {
getMemberInfo() { getMemberInfo() {
...@@ -86,6 +163,17 @@ export default { ...@@ -86,6 +163,17 @@ export default {
this.orderCount = { numOfCustomer, numOfSale, wechatMallNum, weimobMallNum, numOfTmall, numOfDouYin, otherMallNum }; this.orderCount = { numOfCustomer, numOfSale, wechatMallNum, weimobMallNum, numOfTmall, numOfDouYin, otherMallNum };
}) })
}, },
// 全渠道
getAllReportData() {
doFetch(url.ajaxMembersInfo, { memberId: this.memberId, orderType: 0 }).then(res => {
const { result } = res.data || {};
const memberInfo = result.memberInfo || {};
this.allOrderReport.forEach(el => {
el.value = memberInfo[el.key];
});
});
},
// 门店
getStoreReportData() { getStoreReportData() {
doFetch(url.ajaxMembersInfo, { memberId: this.memberId }).then(res => { doFetch(url.ajaxMembersInfo, { memberId: this.memberId }).then(res => {
const { result } = res.data || {}; const { result } = res.data || {};
...@@ -100,48 +188,132 @@ export default { ...@@ -100,48 +188,132 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.orderListBox {
background: #FFFFFF;
.orderListTop {
background: #F7F8FA;
margin: 20px;
margin-bottom: -10px;
.order-report-content {
display: flex;
.order-content-left {
box-sizing: border-box;
padding: 18px 0 16px 12px;
width: 110px;
border-right: 1px solid #DCDFE6;
.order-report-title {
padding-bottom: 14px;
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
color: #303133;
}
p {
display: flex;
height: 24px;
img {
width: 24px;
height: 24px;
margin-right: 6px;
}
span {
font-size: 14px;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #303133;
line-height: 24px;
}
}
}
.order-content-right {
flex: 1;
margin: 16px 27px 18px 18px;
.order-report-box {
flex: 1;
line-height: 20px;
margin-bottom: 10px;
.order-report-item {
display: flex;
justify-content: space-between;
align-items: center;
.order-report-label {
font-size: 14px;
font-weight: 400;
color: #606266;
line-height: 20px;
}
}
}
.order-report-middle {
margin-bottom: 16px;
}
.order-report-middle, .order-report-bottom {
flex: 1;
display: flex;
justify-content: space-between;
align-items: center;
// .order-report-item {
// flex-shrink: 0;
.order-report-value {
// margin-top: 12px;
font-size: 18px;
font-family: DIN Alternate;
font-weight: bold;
color: #303133;
line-height: 21px;
}
// }
}
}
}
}
}
.order-tab { .order-tab {
height: 100%; height: 100%;
/deep/ .el-tabs__header { /deep/ .el-tabs__header {
margin-bottom: 20px; margin: 20px;
.el-tabs__nav-wrap { .el-tabs__nav-wrap {
padding: 0 20px; // padding: 0 20px;
} }
} }
/deep/ .el-tabs__content { /deep/ .el-tabs__content {
padding: 0 20px 20px; padding: 0 20px 20px;
padding-bottom: 10px;
height: calc(100% - 60px); height: calc(100% - 60px);
overflow-y: auto; overflow-y: auto;
box-sizing: border-box; box-sizing: border-box;
} }
} }
.order-report { // .order-report {
display: flex; // flex: 1;
justify-content: space-between; // display: flex;
align-items: center; // justify-content: space-between;
margin-bottom: 20px; // align-items: center;
padding: 20px 15px; // margin-bottom: 20px;
height: 86px; // padding: 20px 15px;
background: #F7F8FA; // height: 86px;
border-radius: 4px; // // background: #F7F8FA;
box-sizing: border-box; // border-radius: 4px;
.order-report-item { // box-sizing: border-box;
flex-shrink: 0; // .order-report-item {
.order-report-label { // flex-shrink: 0;
font-size: 14px; // .order-report-label {
font-weight: 400; // font-size: 14px;
color: #606266; // font-weight: 400;
line-height: 20px; // color: #606266;
} // line-height: 20px;
.order-report-value { // }
margin-top: 5px; // .order-report-value {
font-size: 20px; // margin-top: 12px;
font-weight: bold; // font-size: 18px;
color: #303133; // font-weight: bold;
line-height: 26px; // color: #303133;
font-family: DIN Alternate; // line-height: 21px;
} // font-family: DIN Alternate;
} // }
} // }
// }
</style> </style>
<template> <template>
<div> <div v-loading="loadings">
<div class="search-bar"> <div class="search-bar">
<el-input v-model="params.orderNumber" @change="onSearch" prefix-icon="el-icon-search" clearable placeholder="请输入订单/退款/退换单号" style="width: 260px"></el-input> <el-input v-model="params.orderNumber" @change="onSearch" prefix-icon="el-icon-search" clearable placeholder="请输入订单/退款/退换单号" style="width: 260px"></el-input>
<el-select v-model="params.orderType" @change="onSearch" clearable placeholder="全部订单类型" style="margin-left: 10px;width: 160px"> <el-select v-model="params.orderType" @change="onSearch" clearable placeholder="全部订单类型" style="margin-left: 10px;width: 160px">
...@@ -38,183 +38,184 @@ ...@@ -38,183 +38,184 @@
<el-table-column label="订单金额(元)" min-width="210px"></el-table-column> <el-table-column label="订单金额(元)" min-width="210px"></el-table-column>
<el-table-column label="收货/导购信息" min-width="244px"></el-table-column> <el-table-column label="收货/导购信息" min-width="244px"></el-table-column>
</el-table> </el-table>
<!-- 有数据时列表展示 --> <div :style="{maxHeight: maxHeight}" style="overflow-y:scroll">
<div class="order-list" v-for="el in tableData" :key="el"> <!-- 有数据时列表展示 -->
<!-- 订单号、订单时间、门店等信息 --> <div class="order-list" v-for="el in tableData" :key="el">
<el-table class="order-info-box" :data="[{}]" :span-method="orderInfoSpan" :show-header="false"> <!-- 订单号、订单时间、门店等信息 -->
<el-table-column label="商品信息" min-width="350px" > <el-table class="order-info-box" :data="[{}]" :span-method="orderInfoSpan" :show-header="false">
<div class="order-info"> <el-table-column label="商品信息" min-width="350px" >
<!-- orderType 订单类型 -1 所有,1 销售,2.退货,4.退换货 --> <div class="order-info">
<!-- 购买单、销售单为绿色背景 order-buy --> <!-- orderType 订单类型 -1 所有,1 销售,2.退货,4.退换货 -->
<!-- 退款单背景色为红色 order-refund --> <!-- 购买单、销售单为绿色背景 order-buy -->
<!-- 退换单背景色为黄色 order-exchange --> <!-- 退款单背景色为红色 order-refund -->
<!-- 线下订单orderType=1时为销售单 --> <!-- 退换单背景色为黄色 order-exchange -->
<div v-if="el.orderType == 1" class="order-type-tag order-buy">{{ el.channelType == 3 ? '销售单' : '购买单' }}</div> <!-- 线下订单orderType=1时为销售单 -->
<div v-if="el.orderType == 2" class="order-type-tag order-refund">退款单</div> <div v-if="el.orderType == 1" class="order-type-tag order-buy">{{ el.channelType == 3 ? '销售单' : '购买单' }}</div>
<div v-if="el.orderType == 4" class="order-type-tag order-exchange">退换单</div> <div v-if="el.orderType == 2" class="order-type-tag order-refund">退款单</div>
<!-- 购买单、销售单为订单号 --> <div v-if="el.orderType == 4" class="order-type-tag order-exchange">退换单</div>
<!-- 退款单为退款单号 --> <!-- 购买单、销售单为订单号 -->
<!-- 退换单为退换单号 --> <!-- 退款单为退款单号 -->
<div class="order-num-box"> <!-- 退换单为退换单号 -->
<div v-if="el.orderType == 4" class="order-num">退换单号:{{ el.orderNumber }}</div> <div class="order-num-box">
<div v-else-if="el.orderType == 2" class="order-num">退款单号:{{ el.orderNumber }}</div> <div v-if="el.orderType == 4" class="order-num">退换单号:{{ el.orderNumber }}</div>
<div v-else class="order-num">订单号:{{ el.orderNumber }}</div> <div v-else-if="el.orderType == 2" class="order-num">退款单号:{{ el.orderNumber }}</div>
<!-- 退款单、退换单才有原始单号 --> <div v-else class="order-num">订单号:{{ el.orderNumber }}</div>
<div class="connect-order-num">{{ el.orderType == 2 || el.orderType == 4 ? `原始订单号:${ el.oorderNumber }` : ''}}</div> <!-- 退款单、退换单才有原始单号 -->
</div> <div class="connect-order-num">{{ el.orderType == 2 || el.orderType == 4 ? `原始订单号:${ el.oorderNumber }` : ''}}</div>
</div>
</el-table-column>
<el-table-column label="吊牌价/应收(元)" min-width="130px">abc</el-table-column>
<el-table-column label="数量" min-width="70px">
<div class="order-time-info">
<div class="time-info-box">
<div class="order-create-time">创建时间:{{ el.orderCreateTime | formatTime }}</div>
<div class="order-sync-time">订单同步时间:{{ el.createTime | formatTime }}</div>
</div>
<div class="store-info">
<!-- 天猫、微盟、抖音、门店 -->
<div v-if="formatChannelType(el.channelType)" class="store-type-tag">{{ formatChannelType(el.channelType) }}</div>
<div class="store-name">
{{ el.storeName }}
<br />
<template v-if="el.channelType == 3">{{ el.storeCode }}</template>
</div> </div>
</div> </div>
</div> </el-table-column>
</el-table-column> <el-table-column label="吊牌价/应收(元)" min-width="130px">abc</el-table-column>
<el-table-column label="小计金额(元)" min-width="120px">abc</el-table-column> <el-table-column label="数量" min-width="70px">
<el-table-column label="订单金额(元)" min-width="210px">abc</el-table-column> <div class="order-time-info">
<el-table-column label="收货/导购信息" min-width="244px">abc</el-table-column> <div class="time-info-box">
</el-table> <div class="order-create-time">创建时间:{{ el.orderCreateTime | formatTime }}</div>
<!-- 订单商品、价格等信息 --> <div class="order-sync-time">订单同步时间:{{ el.createTime | formatTime }}</div>
<el-table :data="el.orderItems" :show-header="false" :span-method="({ rowIndex, columnIndex }) => goodsInfoSpan(el, rowIndex, columnIndex)" class="order-detail">
<el-table-column label="商品信息" min-width="350px" show-overflow-tooltip>
<div class="goods-info-box" slot-scope="{ row }">
<div class="goods-logo">
<!-- <img class="goods-logo-icon" :src="row.imageUrl ? row.imageUrl : defaultGoodsIcon" alt=""> -->
<el-image class="goods-logo-icon" :src="row.imageUrl ? row.imageUrl : defaultGoodsIcon" alt="">
<div slot="error" class="image-slot">
<!-- <i class="iconfont-components3 icon-cp-pic-error errorimage"></i> -->
<svg aria-hidden="true" width="60px" height="60px" style="border-radius:4px;">
<use xlink:href="#icon-cp-pic-error"></use>
</svg>
</div>
</el-image>
<!-- productType 商品类型 1正常 2赠品 3换购 -->
<div v-if="row.productType == 2" class="goods-type-icon gift">赠品</div>
<div v-if="row.productType == 3" class="goods-type-icon swap">换购</div>
</div>
<div class="goods-info">
<p class="goods-name">{{ row.productName }}</p>
<p class="goods-num">{{ row.productCode }}</p>
<p class="goods-sku">{{ getSKU(row.skuValue) }}</p>
</div>
</div>
</el-table-column>
<el-table-column label="吊牌价/应收(元)" min-width="130px">
<div slot-scope="{ row }" class="tag-price">
<del v-if="el.channelType == 3" class="del-price">{{ row.unitPrice | fomatFloat }}</del>
<div class="sale-price">{{ row.payPrice | fomatFloat }}</div>
</div>
</el-table-column>
<el-table-column label="数量" prop="skuNum" min-width="70px"></el-table-column>
<el-table-column label="小计金额(元)" min-width="120px">
<div slot-scope="{ row }">{{ row.payPrice * Math.abs(row.skuNum) | fomatFloat }}</div>
</el-table-column>
<el-table-column label="订单金额(元)" class-name="order-amount" min-width="210px">
<div class="order-descript">
<!-- 购买单、退换单、销售单显示应收金额 -->
<!-- 退款单不显示商品合计 -->
<div v-if="el.orderType != 2" class="order-descript-item gray">
<div class="order-descript-label">
<div class="order-descript-label-text">商品合计</div>
</div> </div>
<div class="order-descript-content">{{ el.paidAmount - el.deliveryPaymentAmount | fomatFloat }}</div> <div class="store-info">
</div> <!-- 天猫、微盟、抖音、门店 -->
<div v-if="el.deliveryPaymentAmount" class="order-descript-item gray"> <div v-if="formatChannelType(el.channelType)" class="store-type-tag">{{ formatChannelType(el.channelType) }}</div>
<div class="order-descript-label"> <div class="store-name">
<div class="order-descript-label-text">运费</div> {{ el.storeName }}
<br />
<template v-if="el.channelType == 3">{{ el.storeCode }}</template>
</div>
</div> </div>
<div class="order-descript-content">{{ el.deliveryPaymentAmount | fomatFloat }}</div>
</div> </div>
<!-- 退款单显示应退金额 --> </el-table-column>
<div class="order-descript-item gray"> <el-table-column label="小计金额(元)" min-width="120px">abc</el-table-column>
<div class="order-descript-label"> <el-table-column label="订单金额(元)" min-width="210px">abc</el-table-column>
<div class="order-descript-label-text">{{ el.orderType == 2 ? '应退金额' : '应收金额'}}</div> <el-table-column label="收货/导购信息" min-width="244px">abc</el-table-column>
</el-table>
<!-- 订单商品、价格等信息 -->
<el-table :data="el.orderItems" :show-header="false" :span-method="({ rowIndex, columnIndex }) => goodsInfoSpan(el, rowIndex, columnIndex)" class="order-detail">
<el-table-column label="商品信息" min-width="350px" show-overflow-tooltip>
<div class="goods-info-box" slot-scope="{ row }">
<div class="goods-logo">
<!-- <img class="goods-logo-icon" :src="row.imageUrl ? row.imageUrl : defaultGoodsIcon" alt=""> -->
<el-image class="goods-logo-icon" :src="row.imageUrl ? row.imageUrl : defaultGoodsIcon" alt="">
<div slot="error" class="image-slot">
<!-- <i class="iconfont-components3 icon-cp-pic-error errorimage"></i> -->
<svg aria-hidden="true" width="60px" height="60px" style="border-radius:4px;">
<use xlink:href="#icon-cp-pic-error"></use>
</svg>
</div>
</el-image>
<!-- productType 商品类型 1正常 2赠品 3换购 -->
<div v-if="row.productType == 2" class="goods-type-icon gift">赠品</div>
<div v-if="row.productType == 3" class="goods-type-icon swap">换购</div>
</div> </div>
<div class="order-descript-content"> <div class="goods-info">
<div>{{ el.paidAmount | fomatFloat }}</div> <p class="goods-name">{{ row.productName }}</p>
<p class="goods-num">{{ row.productCode }}</p>
<p class="goods-sku">{{ getSKU(row.skuValue) }}</p>
</div> </div>
</div> </div>
<!-- 购买单、退换单显示优惠 --> </el-table-column>
<div class="order-descript-item gray" v-if="el.promotionAmount > 0"> <el-table-column label="吊牌价/应收(元)" min-width="130px">
<div class="order-descript-label"> <div slot-scope="{ row }" class="tag-price">
<div class="order-descript-label-text">支付优惠</div> <del v-if="el.channelType == 3" class="del-price">{{ row.unitPrice | fomatFloat }}</del>
</div> <div class="sale-price">{{ row.payPrice | fomatFloat }}</div>
<div class="order-descript-content">{{ el.promotionAmount | fomatFloat }}</div>
</div> </div>
<!-- 购买单、销售单显示实付金额 --> </el-table-column>
<!-- 退款单、退换单显示实退金额 --> <el-table-column label="数量" prop="skuNum" min-width="70px"></el-table-column>
<div class="order-descript-item"> <el-table-column label="小计金额(元)" min-width="120px">
<div class="order-descript-label"> <div slot-scope="{ row }">{{ row.payPrice * Math.abs(row.skuNum) | fomatFloat }}</div>
<div class="order-descript-label-text">{{ el.orderType == 2 ? '实退金额' : '实付金额'}}</div> </el-table-column>
<el-table-column label="订单金额(元)" class-name="order-amount" min-width="210px">
<div class="order-descript">
<!-- 购买单、退换单、销售单显示应收金额 -->
<!-- 退款单不显示商品合计 -->
<div v-if="el.orderType != 2" class="order-descript-item gray">
<div class="order-descript-label">
<div class="order-descript-label-text">商品合计</div>
</div>
<div class="order-descript-content">{{ el.paidAmount - el.deliveryPaymentAmount | fomatFloat }}</div>
</div> </div>
<div class="order-descript-content"> <div v-if="el.deliveryPaymentAmount" class="order-descript-item gray">
{{ el.payAmount | fomatFloat }} <div class="order-descript-label">
<el-popover v-if="Array.isArray(el.payInfo) && el.payInfo.length > 0" placement="top" title="支付方式" width="200" trigger="hover"> <div class="order-descript-label-text">运费</div>
<div> </div>
<p v-for="(item, index) in el.payInfo" :key="index">{{ item.name }}:¥{{ item.value | fomatFloat }}</p> <div class="order-descript-content">{{ el.deliveryPaymentAmount | fomatFloat }}</div>
</div>
<span slot="reference" class="payment-type">
<i class="payment-type-icon iconfont icon-chakanxiangqing-copy"></i>
</span>
</el-popover>
</div> </div>
</div> <!-- 退款单显示应退金额 -->
</div> <div class="order-descript-item gray">
</el-table-column> <div class="order-descript-label">
<el-table-column label="收货/导购信息" min-width="244px"> <div class="order-descript-label-text">{{ el.orderType == 2 ? '应退金额' : '应收金额'}}</div>
<div class="order-descript"> </div>
<!-- 门店订单单只显示导购,其他单显示收货信息 --> <div class="order-descript-content">
<div v-if="el.channelType == 3" class="order-descript-item"> <div>{{ el.paidAmount | fomatFloat }}</div>
<div class="order-descript-label"> </div>
<div class="order-descript-label-text">导购</div>
</div> </div>
<div class="order-descript-content"> <!-- 购买单、退换单显示优惠 -->
<div v-if="!Array.isArray(el.clerks) || el.clerks.length == 0">--</div> <div class="order-descript-item gray" v-if="el.promotionAmount > 0">
<template v-else> <div class="order-descript-label">
<div v-for="(item, index) in el.clerks" :key="index">{{ item.clerkName }}({{ item.clerkCode }})</div> <div class="order-descript-label-text">支付优惠</div>
</template> </div>
<div class="order-descript-content">{{ el.promotionAmount | fomatFloat }}</div>
</div>
<!-- 购买单、销售单显示实付金额 -->
<!-- 退款单、退换单显示实退金额 -->
<div class="order-descript-item">
<div class="order-descript-label">
<div class="order-descript-label-text">{{ el.orderType == 2 ? '实退金额' : '实付金额'}}</div>
</div>
<div class="order-descript-content">
{{ el.payAmount | fomatFloat }}
<el-popover v-if="Array.isArray(el.payInfo) && el.payInfo.length > 0" placement="top" title="支付方式" width="200" trigger="hover">
<div>
<p v-for="(item, index) in el.payInfo" :key="index">{{ item.name }}:¥{{ item.value | fomatFloat }}</p>
</div>
<span slot="reference" class="payment-type">
<i class="payment-type-icon iconfont icon-chakanxiangqing-copy"></i>
</span>
</el-popover>
</div>
</div> </div>
</div> </div>
<template v-else> </el-table-column>
<!-- 收货人、手机号、收货地址都无数据时,只显示一个-- --> <el-table-column label="收货/导购信息" min-width="244px">
<template v-if="!el.receiverName && !el.phoneNumber && !el.receiverAddress">--</template> <div class="order-descript">
<!-- 门店订单单只显示导购,其他单显示收货信息 -->
<div v-if="el.channelType == 3" class="order-descript-item">
<div class="order-descript-label">
<div class="order-descript-label-text">导购</div>
</div>
<div class="order-descript-content">
<div v-if="!Array.isArray(el.clerks) || el.clerks.length == 0">--</div>
<template v-else>
<div v-for="(item, index) in el.clerks" :key="index">{{ item.clerkName }}({{ item.clerkCode }})</div>
</template>
</div>
</div>
<template v-else> <template v-else>
<div class="order-descript-item"> <!-- 收货人、手机号、收货地址都无数据时,只显示一个-- -->
<div class="order-descript-label"> <template v-if="!el.receiverName && !el.phoneNumber && !el.receiverAddress">--</template>
<div class="order-descript-label-text">收件人</div> <template v-else>
<div class="order-descript-item">
<div class="order-descript-label">
<div class="order-descript-label-text">收件人</div>
</div>
<div class="order-descript-content">{{ el.receiverName || '--' }}</div>
</div> </div>
<div class="order-descript-content">{{ el.receiverName || '--' }}</div> <div class="order-descript-item">
</div> <div class="order-descript-label">
<div class="order-descript-item"> <div class="order-descript-label-text">手机号</div>
<div class="order-descript-label"> </div>
<div class="order-descript-label-text">手机号</div> <div class="order-descript-content">{{ el.phoneNumber || '--' }}</div>
</div> </div>
<div class="order-descript-content">{{ el.phoneNumber || '--' }}</div> <div class="order-descript-item">
</div> <div class="order-descript-label">
<div class="order-descript-item"> <div class="order-descript-label-text">收货地址</div>
<div class="order-descript-label"> </div>
<div class="order-descript-label-text">收货地址</div> <div class="order-descript-content">{{ el.receiverAddress || '--' }}</div>
</div> </div>
<div class="order-descript-content">{{ el.receiverAddress || '--' }}</div> </template>
</div>
</template> </template>
</template> </div>
</div> </el-table-column>
</el-table-column> </el-table>
</el-table> </div>
</div>
<el-pagination <el-pagination
v-if="params.total > 0" v-if="params.total > 0"
:page-sizes="[20, 40, 60, 80]" :page-sizes="[20, 40, 60, 80]"
...@@ -228,6 +229,7 @@ ...@@ -228,6 +229,7 @@
style="margin-top: 20px; text-align: right" style="margin-top: 20px; text-align: right"
></el-pagination> ></el-pagination>
</div> </div>
</div>
</template> </template>
<script> <script>
...@@ -241,6 +243,7 @@ export default { ...@@ -241,6 +243,7 @@ export default {
}, },
data() { data() {
return { return {
maxHeight: '',
defaultGoodsIcon, defaultGoodsIcon,
params: { params: {
memberId: '', // 会员id memberId: '', // 会员id
...@@ -254,6 +257,7 @@ export default { ...@@ -254,6 +257,7 @@ export default {
dateRange: [], dateRange: [],
total: 0 total: 0
}, },
loadings: false,
tableData: [ tableData: [
// { // {
// orderNumber: '单号(订单/退款单)', // orderNumber: '单号(订单/退款单)',
...@@ -305,6 +309,35 @@ export default { ...@@ -305,6 +309,35 @@ export default {
const channel = { store: 3, demo: 1, weimob: 9, tmall: 8, douyin: 11, other: 10 }; const channel = { store: 3, demo: 1, weimob: 9, tmall: 8, douyin: 11, other: 10 };
this.params.channelType = channel[this.tab]; this.params.channelType = channel[this.tab];
this.getTableData(); this.getTableData();
// if(this.params.channelType == 3) {
// let screenHeight = document.documentElement.clientHeight - 540 + 'px';
// this.$nextTick(() => {
// this.maxHeight = screenHeight;
// });
// }else {
let screenHeight = document.documentElement.clientHeight - 325 + 'px';
this.$nextTick(() => {
this.maxHeight = screenHeight;
});
// }
},
mounted() {
const that = this;
// if(this.params.channelType == 3) {
// window.onresize = () => {
// return (() => {
// let screenHeight = document.documentElement.clientHeight - 540 + 'px';
// that.maxHeight = screenHeight;
// })();
// };
// }else{
window.onresize = () => {
return (() => {
let screenHeight = document.documentElement.clientHeight - 325 + 'px';
that.maxHeight = screenHeight;
})();
};
// }
}, },
methods: { methods: {
orderInfoSpan({rowIndex, columnIndex}) { orderInfoSpan({rowIndex, columnIndex}) {
...@@ -343,6 +376,7 @@ export default { ...@@ -343,6 +376,7 @@ export default {
return result; return result;
}, },
getTableData() { getTableData() {
this.loadings = true;
const { memberId, pageSize, currentPage, orderType, channelType, dateRange, orderNumber } = this.params; const { memberId, pageSize, currentPage, orderType, channelType, dateRange, orderNumber } = this.params;
const params = { memberId, pageSize, currentPage, orderType, channelType, orderNumber }; const params = { memberId, pageSize, currentPage, orderType, channelType, orderNumber };
if (Array.isArray(dateRange) && dateRange.length > 0) { if (Array.isArray(dateRange) && dateRange.length > 0) {
...@@ -359,6 +393,7 @@ export default { ...@@ -359,6 +393,7 @@ export default {
return el; return el;
}); });
this.params.total = page.totalCount; this.params.total = page.totalCount;
this.loadings = false;
}); });
}, },
onSearch() { onSearch() {
......
...@@ -119,6 +119,9 @@ const urlConfig = { ...@@ -119,6 +119,9 @@ const urlConfig = {
getFrozenWhiteList: '/api-member/white-member-list',//获取冻结白名单列表 getFrozenWhiteList: '/api-member/white-member-list',//获取冻结白名单列表
removeFrozenWhiteMember:'/api-member//white-member-remove',// 移出白名单 removeFrozenWhiteMember:'/api-member//white-member-remove',// 移出白名单
frozenMemberExportExcel: '/api-admin/frozen-member-export-excel',// 异常会员搜索结果导出 frozenMemberExportExcel: '/api-admin/frozen-member-export-excel',// 异常会员搜索结果导出
cliqueMemberRelation: '/api-member/clique-member-relation',//判断是否有展示会员导入的权限 1不可,2,null可
weChantToPos: '/api-member/member-change-wechat-member-pos'
} }
const defaultUrl = Object.assign({}, urlConfig); const defaultUrl = Object.assign({}, urlConfig);
......
...@@ -72,7 +72,10 @@ ...@@ -72,7 +72,10 @@
> </el-table-column> > </el-table-column>
<el-table-column label="基本信息"> <el-table-column label="基本信息">
<div slot-scope="{ row }" class="customer-info-cell"> <div slot-scope="{ row }" class="customer-info-cell">
<img :src="row.thirdImgUrl||require('../../../static/img/default.png')" alt=""> <img v-if="row.thirdImgUrl" :src="row.thirdImgUrl" class="customer-icon" alt="">
<svg v-else aria-hidden="true" class="customer-icon">
<use xlink:href="#icon-user-default"></use>
</svg>
<p class="memberName"> <p class="memberName">
{{ row.memberName | formatMember }} {{ row.memberName | formatMember }}
</p> </p>
...@@ -179,7 +182,7 @@ export default { ...memberReturn }; ...@@ -179,7 +182,7 @@ export default { ...memberReturn };
.customer-info-cell { .customer-info-cell {
display: flex; display: flex;
align-items: center; align-items: center;
img { .customer-icon {
display: block; display: block;
width: 60px; width: 60px;
height: 60px; height: 60px;
......
...@@ -141,9 +141,6 @@ export default { ...@@ -141,9 +141,6 @@ export default {
} }
}, },
filters: { filters: {
defaultImg: val => {
if(!val) return './static/img/default.png';
},
formatColorSize: val => { formatColorSize: val => {
let temp = ''; let temp = '';
if(val) { if(val) {
......
...@@ -108,7 +108,12 @@ ...@@ -108,7 +108,12 @@
<el-table-column prop="clerkImageUrl" label="导购信息" width="260px"> <el-table-column prop="clerkImageUrl" label="导购信息" width="260px">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="record-clerk"> <div class="record-clerk">
<span class="record-clerkimg"><img style="vertical-align: middle" width="60" height="60" :src="scope.row.clerkImageUrl | defaultImg" alt=""></span> <span class="record-clerkimg">
<img v-if="scope.row.clerkImageUrl" style="vertical-align: middle" width="60" height="60" :src="scope.row.clerkImageUrl" alt="">
<svg v-else aria-hidden="true" width="60px" height="60px">
<use xlink:href="#icon-user-default"></use>
</svg>
</span>
<span class="record-clerkname">{{ scope.row.clerkName }}<br>{{ scope.row.clerkCode }}</span> <span class="record-clerkname">{{ scope.row.clerkName }}<br>{{ scope.row.clerkCode }}</span>
</div> </div>
</template> </template>
...@@ -164,7 +169,11 @@ ...@@ -164,7 +169,11 @@
<el-table-column prop="productName" label="商品信息" width="200px"> <el-table-column prop="productName" label="商品信息" width="200px">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="record-info"> <div class="record-info">
<div class="record-infoimg"><img width="60" height="60" src="/static/img/default.png" alt=""></div> <div class="record-infoimg">
<svg aria-hidden="true" width="60px" height="60px">
<use xlink:href="#icon-user-default"></use>
</svg>
</div>
<div class="record-infocontent"> <div class="record-infocontent">
<div>{{ scope.row.productName }}</div> <div>{{ scope.row.productName }}</div>
<div>{{ scope.row.productCode }}</div> <div>{{ scope.row.productCode }}</div>
......
...@@ -60,12 +60,12 @@ ...@@ -60,12 +60,12 @@
> >
<div class="pointer"> <div class="pointer">
<div class="singelinfo"> <div class="singelinfo">
<div class="singelinfo-img"><img <div class="singelinfo-img">
width="100" <img v-if="scope.row.thirdImgUrl" width="100" height="100" :src="scope.row.thirdImgUrl" alt="">
height="100" <svg v-else aria-hidden="true" width="100px" height="100px">
:src="scope.row.thirdImgUrl ? scope.row.thirdImgUrl : './static/img/default.png'" <use xlink:href="#icon-user-default"></use>
alt="" </svg>
></div> </div>
<div class="singelinfo-content pLeft10 pRight10"> <div class="singelinfo-content pLeft10 pRight10">
<span class="lheigth0">{{ scope.row.memberName }} <span class="lheigth0">{{ scope.row.memberName }}
<span <span
...@@ -104,13 +104,12 @@ ...@@ -104,13 +104,12 @@
<a class="singelinfo-jlitem">卡券记录 ({{ singleInfo.couponCount }})</a> <a class="singelinfo-jlitem">卡券记录 ({{ singleInfo.couponCount }})</a>
</div> </div>
</div> </div>
<span slot="reference" class="member-span"><img <span slot="reference" class="member-span">
class="tablecontent-cellimg mr6" <img v-if="scope.row.thirdImgUrl" class="tablecontent-cellimg mr6" width="60" height="60" :src="scope.row.thirdImgUrl" alt="">
width="60" <svg v-else aria-hidden="true" class="tablecontent-cellimg mr6" width="60px" height="60px">
height="60" <use xlink:href="#icon-user-default"></use>
:src="scope.row.thirdImgUrl ? scope.row.thirdImgUrl : './static/img/default.png'" </svg>
alt="" </span>
></span>
</el-popover> </el-popover>
<span class="fix-block">{{scope.row.memberName}}</span> <span class="fix-block">{{scope.row.memberName}}</span>
</div> </div>
...@@ -159,10 +158,10 @@ ...@@ -159,10 +158,10 @@
:key="index" :key="index"
> >
<div class="basic-info"> <div class="basic-info">
<img <img v-if="item.thirdImgUrl" :src="item.thirdImgUrl" class="list-img">
:src="item.thirdImgUrl ? item.thirdImgUrl : './static/img/default.png'" <svg v-else aria-hidden="true" class="list-img">
class="list-img" <use xlink:href="#icon-user-default"></use>
> </svg>
<span class="txt">{{item.memberName}}</span> <span class="txt">{{item.memberName}}</span>
</div> </div>
<i <i
......
...@@ -5,7 +5,6 @@ import { ...@@ -5,7 +5,6 @@ import {
checkSuccess checkSuccess
} from "../../../../../static/js/checkStatus"; } from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth"; import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import { formatLongTime, paddingBorth } from "@/utils/utils"; import { formatLongTime, paddingBorth } from "@/utils/utils";
import FreezeDialog from "../../components/dialog/freeze.vue"; import FreezeDialog from "../../components/dialog/freeze.vue";
import MemberFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue"; import MemberFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue";
...@@ -76,7 +75,6 @@ export default { ...@@ -76,7 +75,6 @@ export default {
}, },
dialogMemberFieldVisible: false, dialogMemberFieldVisible: false,
dialogExportFieldVisible: false, dialogExportFieldVisible: false,
defaultImg,
settingType: 0, // 0未查询 1已设置 2未设置 settingType: 0, // 0未查询 1已设置 2未设置
selectPage: { selectPage: {
type: 0, type: 0,
......
...@@ -114,7 +114,10 @@ ...@@ -114,7 +114,10 @@
class="basic-info-table" class="basic-info-table"
@click.native="linkDetail(row.memberId)" @click.native="linkDetail(row.memberId)"
> >
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" /> <img v-if="row.thirdImgUrl" :src="row.thirdImgUrl" class="basic-img" />
<svg v-else aria-hidden="true" class="basic-img">
<use xlink:href="#icon-user-default"></use>
</svg>
<div> <div>
<div class="member-name"> <div class="member-name">
...@@ -227,6 +230,10 @@ ...@@ -227,6 +230,10 @@
<div v-else-if="colum.code == 'lastCostTime'"> <div v-else-if="colum.code == 'lastCostTime'">
<div>{{ row.lastCostTime | formatDate("ymd") }}</div> <div>{{ row.lastCostTime | formatDate("ymd") }}</div>
</div> </div>
<!-- 最近消费时间(全渠道) -->
<div v-else-if="colum.code == 'allChannelLastCostTime'">
<div>{{ row.allChannelLastCostTime | formatDate("ymd") }}</div>
</div>
<!-- 生日 --> <!-- 生日 -->
<div v-else-if="colum.code == 'birthday'"> <div v-else-if="colum.code == 'birthday'">
<div>{{ row.birthdayMD | formatBirth() }}</div> <div>{{ row.birthdayMD | formatBirth() }}</div>
......
...@@ -263,12 +263,12 @@ ...@@ -263,12 +263,12 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div class="record-info"> <div class="record-info">
<div class="record-infoimg"><img <div class="record-infoimg">
width="60" <img v-if="scope.row.imageUrl" width="60" height="60" :src="scope.row.imageUrl" alt="">
height="60" <svg v-else aria-hidden="true" width="60px" height="60px">
:src="scope.row.imageUrl ? scope.row.imageUrl : './static/img/default.png'" <use xlink:href="#icon-user-default"></use>
alt="" </svg>
></div> </div>
<div class="record-infocontent"> <div class="record-infocontent">
<div>{{ scope.row.productName }}</div> <div>{{ scope.row.productName }}</div>
<div>{{ scope.row.productCode }}</div> <div>{{ scope.row.productCode }}</div>
......
...@@ -93,7 +93,7 @@ export default { ...@@ -93,7 +93,7 @@ export default {
.table-colum-wrap { .table-colum-wrap {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
width: 100%; width: 105%;
.table-colum-item { .table-colum-item {
flex: 25%; flex: 25%;
line-height: 35px; line-height: 35px;
......
...@@ -5,7 +5,6 @@ import { ...@@ -5,7 +5,6 @@ import {
checkSuccess checkSuccess
} from "../../../../../static/js/checkStatus"; } from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth"; import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import { formatLongTime,paddingBorth } from "@/utils/utils"; import { formatLongTime,paddingBorth } from "@/utils/utils";
import FreezeDialog from "../../components/dialog/freeze.vue"; import FreezeDialog from "../../components/dialog/freeze.vue";
import MemberFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue"; import MemberFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue";
...@@ -53,7 +52,6 @@ export default { ...@@ -53,7 +52,6 @@ export default {
}, },
dialogMemberFieldVisible: false, dialogMemberFieldVisible: false,
dialogExportFieldVisible: false, dialogExportFieldVisible: false,
defaultImg,
settingType: 0, // 0未查询 1已设置 2未设置 settingType: 0, // 0未查询 1已设置 2未设置
selectPage: { selectPage: {
type: 0, type: 0,
......
...@@ -110,7 +110,10 @@ ...@@ -110,7 +110,10 @@
class="basic-info-table" class="basic-info-table"
@click.native="linkDetail(row.memberId)" @click.native="linkDetail(row.memberId)"
> >
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" /> <img v-if="row.thirdImgUrl" :src="row.thirdImgUrl" class="basic-img" />
<svg v-else aria-hidden="true" class="basic-img">
<use xlink:href="#icon-user-default"></use>
</svg>
<div> <div>
<div class="member-name"> <div class="member-name">
...@@ -222,6 +225,10 @@ ...@@ -222,6 +225,10 @@
<div v-else-if="colum.code == 'lastCostTime'"> <div v-else-if="colum.code == 'lastCostTime'">
<div>{{ row.lastCostTime | formatDate("ymd") }}</div> <div>{{ row.lastCostTime | formatDate("ymd") }}</div>
</div> </div>
<!-- 最近消费时间(全渠道) -->
<div v-else-if="colum.code == 'allChannelLastCostTime'">
<div>{{ row.allChannelLastCostTime | formatDate("ymd") }}</div>
</div>
<!-- 生日 --> <!-- 生日 -->
<div v-else-if="colum.code == 'birthday'"> <div v-else-if="colum.code == 'birthday'">
<div>{{ row.birthdayMD | formatBirth }}</div> <div>{{ row.birthdayMD | formatBirth }}</div>
......
...@@ -5,7 +5,6 @@ import { ...@@ -5,7 +5,6 @@ import {
checkSuccess checkSuccess
} from "../../../../../static/js/checkStatus"; } from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth"; import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import ImportDialog from "@/components/allCustomers/components/importDialog.vue"; import ImportDialog from "@/components/allCustomers/components/importDialog.vue";
import { formatLongTime } from "@/utils/utils"; import { formatLongTime } from "@/utils/utils";
export default { export default {
...@@ -23,7 +22,6 @@ export default { ...@@ -23,7 +22,6 @@ export default {
data() { data() {
return { return {
dialogImportVisible: false, dialogImportVisible: false,
defaultImg,
searchData: { searchData: {
pageSize: 20, pageSize: 20,
currentPage: 1, currentPage: 1,
......
...@@ -41,7 +41,10 @@ ...@@ -41,7 +41,10 @@
<!-- 基本信息 --> <!-- 基本信息 -->
<el-row type="flex" align="middle" class="basic-info-table" <el-row type="flex" align="middle" class="basic-info-table"
@click.native="linkDetail(row.memberId)"> @click.native="linkDetail(row.memberId)">
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" /> <img v-if="row.thirdImgUrl" :src="row.thirdImgUrl" class="basic-img" />
<svg v-else aria-hidden="true" class="basic-img">
<use xlink:href="#icon-user-default"></use>
</svg>
<div> <div>
<div class="member-name"> <div class="member-name">
<span v-if="row.memberName">{{ row.memberName }}</span> <span v-if="row.memberName">{{ row.memberName }}</span>
...@@ -98,7 +101,10 @@ ...@@ -98,7 +101,10 @@
</el-row> </el-row>
<div class="selected-list"> <div class="selected-list">
<div class="selected-item" v-for="item in multipleList" :key="item"> <div class="selected-item" v-for="item in multipleList" :key="item">
<img :src="item.thirdImgUrl || defaultImg" class="user-header" /> <img v-if="item.thirdImgUrl" :src="item.thirdImgUrl || defaultImg" class="user-header" />
<svg v-else aria-hidden="true" class="user-header">
<use xlink:href="#icon-user-default"></use>
</svg>
<div class="user-name"> <div class="user-name">
<span v-if="item.memberName">{{ item.memberName }}</span> <span v-if="item.memberName">{{ item.memberName }}</span>
<span class="nick-name" v-if="item.nickName" <span class="nick-name" v-if="item.nickName"
......
...@@ -5,7 +5,6 @@ import { ...@@ -5,7 +5,6 @@ import {
checkSuccess checkSuccess
} from "../../../../../static/js/checkStatus"; } from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth"; import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import ImportDialog from "@/components/allCustomers/components/importDialog.vue"; import ImportDialog from "@/components/allCustomers/components/importDialog.vue";
import { formatLongTime, paddingBorth } from "@/utils/utils"; import { formatLongTime, paddingBorth } from "@/utils/utils";
import {dateformat} from '@/utils/formatTime'; import {dateformat} from '@/utils/formatTime';
...@@ -65,7 +64,6 @@ export default { ...@@ -65,7 +64,6 @@ export default {
} }
], ],
dialogImportVisible: false, dialogImportVisible: false,
defaultImg,
searchData: { searchData: {
pageSize: 20, pageSize: 20,
currentPage: 1, currentPage: 1,
......
...@@ -48,7 +48,10 @@ ...@@ -48,7 +48,10 @@
class="basic-info-table" class="basic-info-table"
@click.native="linkDetail(row.memberId)" @click.native="linkDetail(row.memberId)"
> >
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" /> <img v-if="row.thirdImgUrl" :src="row.thirdImgUrl" class="basic-img" />
<svg v-else aria-hidden="true" class="basic-img">
<use xlink:href="#icon-user-default"></use>
</svg>
<div> <div>
<div class="member-name"> <div class="member-name">
<span v-if="row.memberName">{{ row.memberName }}</span> <span v-if="row.memberName">{{ row.memberName }}</span>
......
...@@ -3975,8 +3975,9 @@ ...@@ -3975,8 +3975,9 @@
.el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close { .el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close {
color: #2F54EB; } color: #2F54EB; }
.el-dialog__title { .el-dialog__title {
line-height: 24px; line-height: 22px;
font-size: 18px; font-size: 16px !important;
font-weight: 500;
color: #303133; } color: #303133; }
.el-dialog__body { .el-dialog__body {
padding: 20px 20px 10px 20px; padding: 20px 20px 10px 20px;
...@@ -28292,7 +28293,7 @@ ...@@ -28292,7 +28293,7 @@
left: 0; left: 0;
bottom: 0; bottom: 0;
width: 100%; width: 100%;
height: 2px; height: 1px;
background-color: #e4e7ed; background-color: #e4e7ed;
z-index: 1; } z-index: 1; }
.el-tabs__nav-wrap.is-scrollable { .el-tabs__nav-wrap.is-scrollable {
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