Commit 7ef7fe75 authored by chenwei's avatar chenwei

Merge branch 'feature/099_customer_filter' into 'dev'

Feature/099 customer filter

See merge request !2
parents 5e49d6ca 6e9469c3
import request from "@/utils/request";
//获取网点列表
export function getNodeList(query) {
return request({
url: "/ecw/node/list-all-simple",
method: "get",
params: query,
});
}
//获取积分列表
export function getGiftList(data) {
return request({
url: "/ecw/reward/page",
method: "post",
params: {
page: data.page,
rows: data.rows,
},
data: data,
});
}
//新增礼品
export function addRewards(data) {
return request({
url: "/ecw/reward/create",
method: "post",
data: data,
});
}
//删除礼品
export function deleteRewards(data) {
return request({
url: "/ecw/reward/delete?id=" + data.id,
method: "delete",
});
}
//礼品延期
export function delayRewards(data) {
return request({
url: "/ecw/reward/delay",
method: "post",
data: data,
});
}
//编辑礼品
export function editRewards(data) {
return request({
url: "/ecw/reward/update",
method: "post",
data: data,
});
}
//礼品状态变更
export function changeRewardsStatus(data) {
return request({
url: "/ecw/reward/status",
method: "post",
data: data,
});
}
//复制礼品
export function copyRewardsAPI(id) {
return request({
url: "/ecw/reward/copy/" + id,
method: "post",
});
}
//获取单个礼品详情
export function getRewardsDetails(data) {
return request({
url: "/ecw/reward/get",
method: "get",
params: data,
});
}
//获取国家列表
export function getTradeCountryList() {
return request({
url: "/ecw/region/getTradeCountryList",
method: "get",
});
}
//获取城市列表
export function getCityList(query) {
return request({
url: "/ecw/region/getCityListByParent",
method: "get",
params: query,
});
}
//获取会员积分列表
export function getMemberList(data) {
return request({
url: "/member/user-score/page",
method: "post",
data,
});
}
//批量兑换礼品
export function bulkConversion(data) {
return request({
url: "/reward/redeem/batch",
method: "post",
data,
});
}
import request from "@/utils/request";
//操作积分
export function operateMemberScore(data) {
return request({
url: "/member/user-score/operate",
method: "post",
data: data,
});
}
//积分记录分页
export function queryMemberScoreRecord(data) {
return request({
url: "/member/user-score-log/page",
method: "post",
data: data,
});
}
//兑换记录分页
export function queryMemberExchangeRecord(data) {
return request({
url: "/reward/redeem/record/page",
method: "post",
data: data,
});
}
//批量核销按钮
export function batchVerifyAPI(data) {
return request({
url: "/reward/redeem/record/batch/verify",
method: "post",
data: data,
});
}
//兑换记录导出
export function batchRecordExport(data) {
return request({
url: "/reward/redeem/record/export",
method: "post",
data: data,
});
}
//兑换记录导入
export function batchRecordImport(data) {
return request({
url: "/reward/redeem/record/import",
method: "post",
data: data,
});
}
//兑换记录导入模板下载
export function batchRecordImportTemplate() {
return request({
url: "/reward/redeem/record/import/template",
method: "post",
responseType: "blob",
});
}
//撤销 操作
export function rewardCancelQuery(data) {
return request({
url: "/reward/redeem/record/cancel",
method: "post",
data: data,
});
}
//获取记录详情
export function getRewardDetailQuery(data) {
return request({
url: "/reward/redeem/record/detail",
method: "post",
data: data,
});
}
//更新兑换记录
export function updatedRewardsDetails(data) {
return request({
url: "/reward/redeem/record/update",
method: "post",
data: data,
});
}
//核销回退
export function verifyRollback(data) {
return request({
url: "/reward/redeem/record/verify-back",
method: "post",
data: data,
});
}
//核销 操作
export function verifyRedeem(data) {
return request({
url: "/reward/redeem/record/verify",
method: "post",
data: data,
});
}
//获取积分规则记录
export function getScoreRecordList(data) {
return request({
url: "/member/score-rule/page",
method: "post",
params: {
page: data.page,
rows: data.rows,
},
data,
});
}
//会员积分等级列表
export function getMemberLevelList(data) {
return request({
url: "/member/user-level/page",
method: "post",
data,
});
}
//新增会员等级设置
export function addNewMemberLevel(data) {
return request({
url: "/member/user-level/add",
method: "post",
data,
});
}
//删除会员等级
export function delMemberLevel(data) {
return request({
url: "/member/user-level/delete",
method: "post",
data,
});
}
//edit member level
export function editMemberLevel(data) {
return request({
url: "/member/user-level/update",
method: "post",
data,
});
}
//获得目的国、目的城市、目的仓列表
export function getRegionTreeList() {
return request({
url: "/member/score-rule/warehouse-tree-region-list",
method: "get",
});
}
//获取渠道列表
export function getChannelList() {
return request({
url: "/ecw/channel/list-all-simple",
method: "get",
});
}
//积分规则创建
export function createIntegralRule(data) {
return request({
url: "/member/score-rule/create",
method: "post",
data,
});
}
//启用关闭 积分规则
export function integralRuleStatus(data) {
return request({
url: "/member/score-rule/status",
method: "post",
data,
});
}
//复制积分规则
export function integralRuleCopy(data) {
return request({
url: "/member/score-rule/copy",
method: "post",
data,
});
}
//延期积分规则
export function integralRuleDelay(data) {
return request({
url: "/member/score-rule/delay",
method: "post",
data,
});
}
//删除积分规则
export function integralRuleDelete(data) {
return request({
url: "/member/score-rule/delete",
method: "post",
data,
});
}
<template>
<div class="dict-selector">
<el-select v-if="formType == 'select'" v-model="valueSync" :placeholder="placeholder || $t('请选择')" :clearable="clearable" :multiple="multiple" :disabled="disabled" @change="val => $emit('change', val)">
<el-option v-for="dict in formattedList"
:key="dict.value" :label="$l(dict, 'label')" :value="dict.value"/>
<el-select
v-if="formType == 'select'"
v-model="valueSync"
:placeholder="placeholder || $t('请选择')"
:clearable="clearable"
:multiple="multiple"
:disabled="disabled"
@change="(val) => $emit('change', val)"
>
<el-option
v-for="dict in formattedList"
:key="dict.value"
:label="$l(dict, 'label')"
:value="dict.value"
/>
</el-select>
<el-radio-group v-if="formType == 'radio'" v-model="valueSync" :disabled="disabled">
<el-radio v-for="dict in formattedList" :label="dict.value" :checked="valueSync === dict.value" :key="dict.value">{{$l(dict, 'label')}}</el-radio>
<el-radio-group
v-if="formType == 'radio'"
v-model="valueSync"
:disabled="disabled"
>
<el-radio
v-for="dict in formattedList"
:label="dict.value"
:checked="valueSync === dict.value"
:key="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
<el-checkbox-group v-if="formType == 'checkbox'" v-model="valueSync" :disabled="disabled">
<el-checkbox v-for="dict in formattedList" :label="dict.value" :key="dict.value">{{$l(dict, 'label')}}</el-checkbox>
<el-checkbox-group
v-if="formType == 'checkbox'"
v-model="valueSync"
:disabled="disabled"
>
<el-checkbox
v-for="dict in formattedList"
:label="dict.value"
:key="dict.value"
>{{ $l(dict, "label") }}</el-checkbox
>
</el-checkbox-group>
</div>
</template>
<script>
const FORMATTERS = {
"string": String,
"bool": function(val){
return [false, 'false', 0, "0"].indexOf(val) < 0
string: String,
bool: function (val) {
return [false, "false", 0, "0"].indexOf(val) < 0;
},
'number': Number,
'array': function(val){
return typeof val == 'string' ? val.split(',').filter(item => item && item !== '') : val
}
}
number: Number,
array: function (val) {
return typeof val == "string"
? val.split(",").filter((item) => item && item !== "")
: val;
},
};
export default {
props:{
props: {
placeholder: {
type: String,
default: null
default: null,
},
type: String,
value: [String, Number, Array, Boolean],
multiple: Boolean,
formType:{
formType: {
type: String,
default: 'select'
default: "select",
},
formatter: {
type: [Function, String],
default: String
default: String,
},
defaultable: Boolean, // 是否默认选择第一个
disabled: Boolean,
......@@ -47,92 +80,104 @@ export default {
*/
filter: {
type: Function,
default: () => true
default: () => true,
},
clearable: Boolean
clearable: Boolean,
},
data(){
data() {
return {
valueSync: this.multiple ? [] : null
}
valueSync: this.multiple ? [] : null,
};
},
computed:{
dicts(){
return this.getList(this.type)
computed: {
dicts() {
return this.getList(this.type);
},
dictList(){
return this.dicts.filter(this.filter)
dictList() {
return this.dicts.filter(this.filter);
},
formattedList(){
let arr = []
this.dictList.forEach(item => {
formattedList() {
let arr = [];
this.dictList.forEach((item) => {
arr.push({
label: item.label,
labelEn: item.labelEn,
value: this.format(item.value),
cssClass: item.cssClass,
colorType: item.colorType
})
})
return arr
}
colorType: item.colorType,
});
});
return arr;
},
watch:{
valueSync(val){
this.$emit('input', val)
},
value(val){
if(val != this.valueSync)this.setValueSync()
watch: {
valueSync(val) {
this.$emit("input", val);
},
dictList(){
this.setDefault()
}
value(val) {
if (val != this.valueSync) this.setValueSync();
},
created(){
this.setValueSync()
this.setDefault()
},
methods:{
format(val){
if(val === null || val == undefined || val == '') return val
let formatter = typeof this.formatter == 'function' ? this.formatter : FORMATTERS[this.formatter]
if(!formatter){
console.warn('格式器无效', this.formatter)
return val
}
return formatter(val)
dictList() {
this.setDefault();
},
changeValue(val){
this.valueSync = val
},
setValueSync(){
if(this.value === null || this.value === undefined || this.value === ''){
return this.valueSync = this.multiple ? [] : this.value
}
if(this.multiple){
let value = this.value || []
if(typeof this.value == 'string'){
value = this.value.split(',').filter(item => item && item != '')
created() {
this.setValueSync();
this.setDefault();
},
methods: {
format(val) {
if (val === null || val == undefined || val == "") return val;
let formatter =
typeof this.formatter == "function"
? this.formatter
: FORMATTERS[this.formatter];
if (!formatter) {
console.warn("格式器无效", this.formatter);
return val;
}
this.valueSync = value.map(item => this.format(item))
}else{
this.valueSync = this.format(this.value)
return formatter(val);
},
changeValue(val) {
this.valueSync = val;
},
setValueSync() {
if (
this.value === null ||
this.value === undefined ||
this.value === ""
) {
return (this.valueSync = this.multiple ? [] : this.value);
}
},
getList(){
return this.getDictDatas(this.type)
},
setDefault(){
if(!this.defaultable) return
if(this.dictList.length && (this.valueSync === null || this.valueSync == undefined || this.valueSync == '')){
this.valueSync = this.multiple ? [] : this.formattedList[0].value
if (this.multiple) {
let value = this.value || [];
if (typeof this.value == "string") {
value = this.value.split(",").filter((item) => item && item != "");
}
this.valueSync = value.map((item) => this.format(item));
} else {
this.valueSync = this.format(this.value);
}
},
getList() {
return this.getDictDatas(this.type);
},
setDefault() {
if (!this.defaultable) return;
if (
this.dictList.length &&
(this.valueSync === null ||
this.valueSync == undefined ||
this.valueSync == "")
) {
this.valueSync = this.multiple ? [] : this.formattedList[0].value;
}
}
},
},
};
</script>
<style scoped>
.dict-selector{
.dict-selector {
display: inline-block;
}
</style>
......@@ -6,6 +6,7 @@
:before-upload="handleBeforeUpload"
:file-list="fileList"
:limit="limit"
:disabled="disabled"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
......@@ -15,24 +16,40 @@
ref="upload"
>
<!-- 上传按钮 -->
<el-button size="mini" type="primary">{{$t('选取文件')}}</el-button>
<el-button size="mini" type="primary" :disabled="disabled">{{
$t("选取文件")
}}</el-button>
<!-- 上传提示 -->
<div class="el-upload__tip" slot="tip" v-if="showTip">
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
</template>
的文件
</div>
</el-upload>
<!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
<transition-group
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
>
<li
:key="file.url"
class="el-upload-list__item ele-upload-list__item-content"
v-for="(file, index) in fileList"
>
<el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
<el-link :underline="false" @click="handleDelete(index)" type="danger"
>删除</el-link
>
</div>
</li>
</transition-group>
......@@ -62,18 +79,23 @@ export default {
type: Array,
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
},
disabled: {
type: Boolean,
default: false,
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true
}
default: true,
},
},
data() {
return {
number: 0,
uploadList: [],
baseUrl: process.env.VUE_APP_BASE_API,
uploadFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/org-name/up", // 上传的文件服务器地址
uploadFileUrl:
process.env.VUE_APP_BASE_API + "/admin-api/infra/file/org-name/up", // 上传的文件服务器地址
headers: {
Authorization: "Bearer " + getToken(),
},
......@@ -86,9 +108,9 @@ export default {
if (val) {
let temp = 1;
// 首先将值转为数组
const list = Array.isArray(val) ? val : this.value.split(',');
const list = Array.isArray(val) ? val : this.value.split(",");
// 然后将数组转为对象数组
this.fileList = list.map(item => {
this.fileList = list.map((item) => {
if (typeof item === "string") {
item = { name: item, url: item };
}
......@@ -101,8 +123,8 @@ export default {
}
},
deep: true,
immediate: true
}
immediate: true,
},
},
computed: {
// 是否显示提示
......@@ -117,7 +139,9 @@ export default {
if (this.fileType) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1).toLowerCase();
fileExtension = file.name
.slice(file.name.lastIndexOf(".") + 1)
.toLowerCase();
}
const isTypeOk = this.fileType.some((type) => {
if (file.type.indexOf(type) > -1) return true;
......@@ -125,7 +149,9 @@ export default {
return false;
});
if (!isTypeOk) {
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
this.$modal.msgError(
`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
);
return false;
}
}
......@@ -148,7 +174,7 @@ export default {
// 上传失败
handleUploadError(err) {
this.$modal.msgError("上传图片失败,请重试");
this.$modal.closeLoading()
this.$modal.closeLoading();
},
// 上传成功回调
handleUploadSuccess(res) {
......@@ -182,9 +208,9 @@ export default {
for (let i in list) {
strs += list[i].url + separator;
}
return strs != '' ? strs.substr(0, strs.length - 1) : '';
}
}
return strs != "" ? strs.substr(0, strs.length - 1) : "";
},
},
};
</script>
......
......@@ -16,7 +16,7 @@
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(item)">
<i class="el-icon-zoom-in"></i>
</span>
<span class="el-upload-list__item-delete" @click="handleRemove(item)">
<span class="el-upload-list__item-delete" @click="handleRemove(item)" v-if ="isShowEditButton">
<i class="el-icon-delete"></i>
</span>
</span>
......@@ -24,6 +24,7 @@
</ul>
<el-upload
v-if ="isShowEditButton"
multiple
:action="uploadImgUrl"
list-type="picture-card"
......@@ -94,6 +95,11 @@ export default {
isShowTip: {
type: Boolean,
default: true
},
//是否显示编辑按钮
isShowEditButton:{
type: Boolean,
default: true
}
},
data() {
......
......@@ -4507,10 +4507,136 @@
"身份证认证状态": "Identity card authentication status",
"角标字段": "Subscript field",
"不清楚请留空,已设勿改": "Unclear, please leave blank. It has been set to remain unchanged",
"退仓/已混箱品名":"Returned/mixed Box",
"请输入会员编号":"Please input Member ID",
"退仓/已混箱品名": "Returned/mixed Box",
"请输入会员编号": "Please input Member ID",
"会员名称": "Member nickname",
"请输入会员名称": "Please input Member nickname",
"会员电话":"Member Phone NO.",
"请输入会员电话":"Please input Member Phone NO."
"会员电话": "Member Phone NO.",
"请输入会员电话": "Please input Member Phone NO.",
"礼品名称": "gift name",
"请输入礼品名称": "Please input gift name",
"请输入数字": "Please input number",
"兑换积分": "Redeem Points",
"领取方式": "Collection method",
"兑换网点": "Exchange outlet",
"请选择兑换网点": "Please select an exchange outlet",
"剩余数量": "Remaining Quantity",
"礼品ID": "Gift ID",
"允许兑换次数": "Allow redemption times",
"已兑换次数": "Redemption times",
"剩余次数": "Remaining times",
"添加礼品": "Add Gift",
"查看礼品": "View gifts",
"中文礼品名称": "Chinese gift name",
"英文礼品名称": "English gift name",
"中文礼品图片": "Chinese Gift picture",
"英文礼品图片": "English gift picture",
"活动时间": "Activity Time ",
"兑换": "Exchange",
"中文备注": "Chinese Remarks",
"英文备注": "English Remarks",
"长度在 0 到 500 个字符": "Length 0 to 500 characters",
"请选择延期时间": "Please select an extension time",
"延期成功": "Successful extension",
"否关闭当前礼品?": "Do you close the current gift?",
"是否启用当前礼品?": "Do you want to enable current gifts",
"启用成功": "Enabled successfully",
"关闭成功": "Closed successfully",
"是否确认删除此礼品": "Do you want to delete this gift? ",
"请选择领取方式": "Please select the collection method",
"编辑礼品": "Edit Gifts",
"新增礼品": "New Gift ",
"请输入剩余数量": "Please enter remaining quantity",
"请选择网点": "Please select a network",
"请输入兑换积分": "Please enter redemption points",
"长度在 0 到 50 个字符": "Length 0 to 50 characters",
"请输入英文礼品名称": "Please enter English gift name",
"请输入中文礼品名称": "Please enter Chinese gift name",
"请先添加准备兑换礼品的会员": "Please add a member who is ready to redeem the gift",
"添加会员": "Add Member",
"礼品选择": "Gift Selection",
"礼品积分": "Gift Points",
"当前积分": "Current Score",
"本次兑换积分": "Redeem points this time",
"兑换后剩余积分": "Remaining points after redemption",
"请选择快递公司": "Please select a Courier company",
"请输入本次兑换积分": "Please enter this redemption points",
"兑换数量": "Redemption Quantity",
"请输入兑换数量": "Please enter the amount of redemption",
"兑换方式": "Method of Exchange",
"兑换入口": "Exchange entry",
"收件人姓名": "Recipient's name",
"请输入收件人姓名": "Please enter recipient name",
"收件人电话": "Recipient phone number",
"请输入收件人电话": "Please enter recipient phone number ",
"收件人地址": "Recipient Address",
"请输入收件人地址": "Please enter recipient address",
"兑换人": "Changer",
"请输入兑换人": "Please enter the changer ",
"兑换时间": "Redemption Time",
"选择兑换时间": "Select the exchange time",
"兑换积分大于当前总积分,请重新输入兑换数量": "The redemption points are greater than the current total points, please re-enter the redemption amount",
"兑换失败,请填写必要的信息": "Redemption failed, please fill in the necessary information",
"请输入会员名称/会员编号/手机号": "Please enter member name/Member ID/mobile number",
"兑换成功": "Successful exchange ",
"是否确认删除此数据": "Do you want to delete this data",
"快递日期": "Delivery Date",
"选择快递日期": "Select delivery date ",
"请输入整数或保留小数点后两位": "Please enter an integer number or keep two decimal places",
"快递寄出人": "Courier",
"请输入快递寄出人": "Please enter an Courier",
"请先选择会员再进行操作": "Please select a member before proceeding",
"累计最高积分": "Cumulative maximum points:",
"指标类型": "pointer type",
"中文封面图": "Chinese cover picture",
"英文封面图": "English cover picture",
"首单": "first order",
"积分规则": "integration rule",
"积分": "integral",
"活动有效期": "Activity validity period",
"积分有效期": "Point validity period",
"是否推送": "Push or not",
"展示平台": "display platform",
"英文规则说明": "English rule description",
"中文规则说明": "Chinese rule description",
"注:此说明用于展示给会员查看积分原因,请规范填写": "Note: This description is used to show the reason for members to view the points, please fill in the standard",
"请选择活动有效期": "Please select an activity validity period",
"请选择注册平台": "Please select the registration platform",
"请选择指标类型": "Please select the indicator type",
"请输入积分有效天数": "Please enter the number of days the credits are valid",
"请输入整数": "Please enter an integer",
"请输入中文规则说明": "Please enter the rule description in Chinese",
"请输入英文规则说明": "Please enter English rule description",
"请输入积分规则": "Please enter the scoring rules",
"请选择是否推送": "Please select whether to push",
"保存并启用": "Save and Enable",
"订单入口": "Order Entry",
"是否确认重置此礼品规则表单": "Do you want to reset this gift rule form?",
"注册平台": "Registration platform",
"等级名称": "User level name",
"是否确认启用此礼品规则": "Do you confirm to enable this gift rule?",
"是否确认复制礼品规则": "Do you want to copy gift rules?",
"是否确认关闭此礼品规则": "Do you want to confirm to turn off this gift rule?",
"单次积分": "Single integration",
"规则说明": "Specification of rules",
"最高积分": "Maximum points ",
"会员注册时间": "Member Registration Time",
"已兑换积分": "Redeemed points",
"已失效积分": "Expired integral",
"请输入关键词查找": "Please enter keyword search",
"以上数据格式有问题": "There is a problem with the above data format",
"积分记录ID": "Integral record ID",
"封面图片": "cover picture",
"分值": "Score",
"类别": "Category",
"积分来源": "Integral source",
"操作积分时间": "Operation integration time",
"导入失败:": "Import failure:",
"此操作积分可能存在到期积分, 撤销后积分将进行扣除,是否继续?": "This operation point may have expired points, points will be deducted after cancellation, do you want to continue?",
"是否继续核销回退?": "Do you continue to write off the rollback?",
"规则标题": "Rule Title",
"请输入会员昵称": "Please enter a member nickname",
"请输入礼品ID": "Please enter the gift ID",
"新增兑换": "New exchange",
"兑换信息导入": "Exchange Information Import"
}
This diff is collapsed.
<template>
<el-dialog
:title="$t('选择会员')"
:visible.sync="dialogVisible"
width="80%"
:before-close="dialogBeforeClose"
>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="120px"
>
<el-form-item :label="$t('当前积分')">
<el-row :gutter="10">
<el-col :span="8">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.holdScoreOperate"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="16">
<el-input
v-model.trim="queryParams.holdScore"
:placeholder="$t('请输入数字')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-col>
</el-row>
</el-form-item>
<el-form-item :label="$t('关键词')">
<el-input
style="width: 300px"
v-model.trim="queryParams.key"
:placeholder="$t('请输入会员名称/会员编号/手机号')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('国家')">
<el-select
v-model="queryParams.country"
:placeholder="$t('请选择国家')"
clearable
@change="handleGetCityList($event)"
size="small"
>
<el-option
v-for="nodeItem in countryList"
:key="nodeItem.id"
:label="isChinese ? nodeItem.titleZh : nodeItem.titleEn"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('城市')">
<el-select
v-model="queryParams.city"
:placeholder="$t('请选择城市')"
clearable
size="small"
>
<el-option
v-for="nodeItem in cityList"
:key="nodeItem.id"
:label="isChinese ? nodeItem.titleZh : nodeItem.titleEn"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
@click="handleQuery"
>{{ $t("搜索") }}</el-button
>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
v-loading="loading"
@selection-change="handleSelectionChange"
:data="memberList"
>
<el-table-column type="selection" width="55" :selectable="selectable">
</el-table-column>
<el-table-column
:label="$t('会员名称')"
align="center"
:prop="isChinese ? 'memberNameZh' : 'memberNameEn'"
></el-table-column>
<el-table-column
width="140"
:label="$t('会员编号')"
align="center"
prop="id"
></el-table-column>
<el-table-column
width="140"
:label="$t('手机号')"
align="center"
prop="mobile"
></el-table-column>
<el-table-column
width="140"
align="center"
:label="$t('国家')"
:prop="isChinese ? 'countryNameZh' : 'countryNameEn'"
></el-table-column>
<el-table-column
:label="$t('城市')"
align="center"
:prop="isChinese ? 'cityNameZh' : 'cityNameEn'"
></el-table-column>
<el-table-column
:label="$t('当前积分')"
align="center"
prop="holdScore"
></el-table-column>
</el-table>
<!-- //分页列表 -->
<span v-show="selectedMember.memberList.length > 0"
>{{ $t("已选择:") }} {{ selectedMember.memberName }} {{ $t("") }}
<span style="color: red"> {{ selectedMember.memberList.length }} </span>
{{ $t("") }}</span
>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="handleQueryPagination"
/>
</div>
<div slot="footer">
<el-button @click="dialogBeforeClose">取 消</el-button>
<el-button type="primary" @click="transferSelectMember">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import {
getCityList,
getTradeCountryList,
getMemberList,
} from "@/api/ecw/giftManagement";
import { color } from "echarts/lib/export";
export default {
name: "chooseMember",
props: {
dialogVisible: {
type: Boolean,
default: false,
},
memberSelectList: {
type: Array,
default: () => [],
},
},
watch: {
dialogVisible(val) {
if (val == true) {
this.handleQuery();
}
},
memberSelectList(val) {
this.selectedMember.memberList = val;
},
},
data() {
return {
selectedMember: { memberList: [], memberName: "" },
countryList: [],
cityList: [],
total: 0,
loading: true,
memberList: [],
queryParams: {
country: null,
city: null,
endTime: "",
holdScore: null,
holdScoreOperate: null,
key: "",
pageNo: 1,
pageSize: 10,
startTime: "",
usedScore: 0,
usedScoreOperate: 0,
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.handleQuery();
this.getCountryList();
},
activated() {
this.handleQuery();
},
methods: {
selectable(row, index) {
if (this.memberSelectList.length > 0) {
return this.memberSelectList.some((item) => {
return item.id != row.id;
});
} else {
return true;
}
},
handleSelectionChange(val) {
this.selectedMember.memberList = val;
let arraryMemberName = [];
if (val) {
this.selectedMember.memberList.forEach((element) => {
if (this.isChinese) {
arraryMemberName.push(element.memberNameZh);
} else {
arraryMemberName.push(element.memberNameEn);
}
});
}
this.selectedMember.memberName = arraryMemberName.join("");
},
transferSelectMember() {
this.dialogBeforeClose();
this.$emit("transferSelectMemberInfo", this.selectedMember.memberList);
},
dialogBeforeClose() {
this.loading = true;
this.queryParams = {
country: null,
city: null,
endTime: null,
holdScore: null,
holdScoreOperate: null,
key: null,
pageNo: 1,
pageSize: 10,
startTime: null,
usedScore: null,
usedScoreOperate: null,
};
// this.dialogVisible = false;
this.$emit("update:dialogVisible", false);
},
getCountryList() {
getTradeCountryList().then((res) => {
this.countryList = res.data;
});
},
handleGetCityList(id) {
let params = {
id: id,
};
getCityList(params).then((res) => {});
},
handleQuery() {
this.queryParams.pageNo = 1;
let params = { ...this.queryParams };
getMemberList(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
getMemberList(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
resetQuery() {
this.loading = true;
this.queryParams = {
country: null,
city: null,
endTime: null,
holdScore: null,
holdScoreOperate: null,
key: null,
pageNo: 1,
pageSize: 10,
startTime: null,
usedScore: null,
usedScoreOperate: null,
};
this.handleQuery();
},
},
};
</script>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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