Commit 7e0c1c55 authored by yujinyao's avatar yujinyao

en_US.json和dict.js文件冲突

parents a378af4f 0f782c13
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,
});
}
//获取积分规则详情
export function integralRuleDetails(data) {
return request({
url: "/member/score-rule/get",
method: "post",
data,
});
}
//编辑积分规则
export function integralRuleUpdated(data) {
return request({
url: "/member/score-rule/update",
method: "post",
data,
});
}
<template> <template>
<div class="dict-selector"> <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-select
<el-option v-for="dict in formattedList" v-if="formType == 'select'"
:key="dict.value" :label="$l(dict, 'label')" :value="dict.value"/> v-model="valueSync"
</el-select> :placeholder="placeholder || $t('请选择')"
<el-radio-group v-if="formType == 'radio'" v-model="valueSync" :disabled="disabled"> :clearable="clearable"
<el-radio v-for="dict in formattedList" :label="dict.value" :checked="valueSync === dict.value" :key="dict.value">{{$l(dict, 'label')}}</el-radio> :multiple="multiple"
</el-radio-group> :disabled="disabled"
<el-checkbox-group v-if="formType == 'checkbox'" v-model="valueSync" :disabled="disabled"> @change="(val) => $emit('change', val)"
<el-checkbox v-for="dict in formattedList" :label="dict.value" :key="dict.value">{{$l(dict, 'label')}}</el-checkbox> >
</el-checkbox-group> <el-option
</div> 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>
<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> </template>
<script> <script>
const FORMATTERS = { const FORMATTERS = {
"string": String, string: String,
"bool": function(val){ bool: function (val) {
return [false, 'false', 0, "0"].indexOf(val) < 0 return [false, "false", 0, "0"].indexOf(val) < 0;
}, },
'number': Number, number: Number,
'array': function(val){ array: function (val) {
return typeof val == 'string' ? val.split(',').filter(item => item && item !== '') : val return typeof val == "string"
} ? val.split(",").filter((item) => item && item !== "")
} : val;
},
};
export default { export default {
props:{ props: {
placeholder: { placeholder: {
type: String, type: String,
default: null default: null,
},
type: String,
value: [String, Number, Array, Boolean],
multiple: Boolean,
formType:{
type: String,
default: 'select'
},
formatter: {
type: [Function, String],
default: String
},
defaultable: Boolean, // 是否默认选择第一个
disabled: Boolean,
/**
* 过滤字典项,用于只使用部分字典项的场景
*/
filter: {
type: Function,
default: () => true
},
clearable: Boolean
}, },
data(){ type: String,
return { value: [String, Number, Array, Boolean],
valueSync: this.multiple ? [] : null multiple: Boolean,
} formType: {
type: String,
default: "select",
}, },
computed:{ formatter: {
dicts(){ type: [Function, String],
return this.getList(this.type) default: String,
},
dictList(){
return this.dicts.filter(this.filter)
},
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
}
}, },
watch:{ defaultable: Boolean, // 是否默认选择第一个
valueSync(val){ disabled: Boolean,
this.$emit('input', val) /**
}, * 过滤字典项,用于只使用部分字典项的场景
value(val){ */
if(val != this.valueSync)this.setValueSync() filter: {
}, type: Function,
dictList(){ default: () => true,
this.setDefault() },
} clearable: Boolean,
},
data() {
return {
valueSync: this.multiple ? [] : null,
};
},
computed: {
dicts() {
return this.getList(this.type);
},
dictList() {
return this.dicts.filter(this.filter);
},
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;
}, },
created(){ },
this.setValueSync() watch: {
this.setDefault() valueSync(val) {
this.$emit("input", val);
}, },
methods:{ value(val) {
format(val){ if (val != this.valueSync) this.setValueSync();
if(val === null || val == undefined || val == '') return val },
let formatter = typeof this.formatter == 'function' ? this.formatter : FORMATTERS[this.formatter] dictList() {
if(!formatter){ this.setDefault();
console.warn('格式器无效', this.formatter) },
return val },
} created() {
return formatter(val) this.setValueSync();
}, this.setDefault();
changeValue(val){ },
this.valueSync = val methods: {
}, format(val) {
setValueSync(){ if (val === null || val == undefined || val == "") return val;
if(this.value === null || this.value === undefined || this.value === ''){
return this.valueSync = this.multiple ? [] : this.value let formatter =
} typeof this.formatter == "function"
if(this.multiple){ ? this.formatter
let value = this.value || [] : FORMATTERS[this.formatter];
if(typeof this.value == 'string'){
value = this.value.split(',').filter(item => item && item != '') if (!formatter) {
} console.warn("格式器无效", this.formatter);
this.valueSync = value.map(item => this.format(item)) return val;
}else{ }
this.valueSync = this.format(this.value)
} return formatter(val);
}, },
getList(){ changeValue(val) {
return this.getDictDatas(this.type) this.valueSync = val;
}, },
setDefault(){ setValueSync() {
if(!this.defaultable) return if (
if(this.dictList.length && (this.valueSync === null || this.valueSync == undefined || this.valueSync == '')){ this.value === null ||
this.valueSync = this.multiple ? [] : this.formattedList[0].value 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 != "");
} }
} 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> </script>
<style scoped> <style scoped>
.dict-selector{ .dict-selector {
display: inline-block; display: inline-block;
} }
</style> </style>
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
:before-upload="handleBeforeUpload" :before-upload="handleBeforeUpload"
:file-list="fileList" :file-list="fileList"
:limit="limit" :limit="limit"
:disabled="disabled"
:on-error="handleUploadError" :on-error="handleUploadError"
:on-exceed="handleExceed" :on-exceed="handleExceed"
:on-success="handleUploadSuccess" :on-success="handleUploadSuccess"
...@@ -15,24 +16,40 @@ ...@@ -15,24 +16,40 @@
ref="upload" 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"> <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="fileSize">
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
</template>
的文件 的文件
</div> </div>
</el-upload> </el-upload>
<!-- 文件列表 --> <!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> <transition-group
<li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> 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"> <el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span> <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link> </el-link>
<div class="ele-upload-list__item-content-action"> <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> </div>
</li> </li>
</transition-group> </transition-group>
...@@ -62,18 +79,23 @@ export default { ...@@ -62,18 +79,23 @@ export default {
type: Array, type: Array,
default: () => ["doc", "xls", "ppt", "txt", "pdf"], default: () => ["doc", "xls", "ppt", "txt", "pdf"],
}, },
disabled: {
type: Boolean,
default: false,
},
// 是否显示提示 // 是否显示提示
isShowTip: { isShowTip: {
type: Boolean, type: Boolean,
default: true default: true,
} },
}, },
data() { data() {
return { return {
number: 0, number: 0,
uploadList: [], uploadList: [],
baseUrl: process.env.VUE_APP_BASE_API, 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: { headers: {
Authorization: "Bearer " + getToken(), Authorization: "Bearer " + getToken(),
}, },
...@@ -86,9 +108,9 @@ export default { ...@@ -86,9 +108,9 @@ export default {
if (val) { if (val) {
let temp = 1; 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") { if (typeof item === "string") {
item = { name: item, url: item }; item = { name: item, url: item };
} }
...@@ -101,8 +123,8 @@ export default { ...@@ -101,8 +123,8 @@ export default {
} }
}, },
deep: true, deep: true,
immediate: true immediate: true,
} },
}, },
computed: { computed: {
// 是否显示提示 // 是否显示提示
...@@ -117,7 +139,9 @@ export default { ...@@ -117,7 +139,9 @@ export default {
if (this.fileType) { if (this.fileType) {
let fileExtension = ""; let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) { 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) => { const isTypeOk = this.fileType.some((type) => {
if (file.type.indexOf(type) > -1) return true; if (file.type.indexOf(type) > -1) return true;
...@@ -125,7 +149,9 @@ export default { ...@@ -125,7 +149,9 @@ export default {
return false; return false;
}); });
if (!isTypeOk) { if (!isTypeOk) {
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`); this.$modal.msgError(
`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
);
return false; return false;
} }
} }
...@@ -148,7 +174,7 @@ export default { ...@@ -148,7 +174,7 @@ export default {
// 上传失败 // 上传失败
handleUploadError(err) { handleUploadError(err) {
this.$modal.msgError("上传图片失败,请重试"); this.$modal.msgError("上传图片失败,请重试");
this.$modal.closeLoading() this.$modal.closeLoading();
}, },
// 上传成功回调 // 上传成功回调
handleUploadSuccess(res) { handleUploadSuccess(res) {
...@@ -182,9 +208,9 @@ export default { ...@@ -182,9 +208,9 @@ export default {
for (let i in list) { for (let i in list) {
strs += list[i].url + separator; strs += list[i].url + separator;
} }
return strs != '' ? strs.substr(0, strs.length - 1) : ''; return strs != "" ? strs.substr(0, strs.length - 1) : "";
} },
} },
}; };
</script> </script>
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(item)"> <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(item)">
<i class="el-icon-zoom-in"></i> <i class="el-icon-zoom-in"></i>
</span> </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> <i class="el-icon-delete"></i>
</span> </span>
</span> </span>
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
</ul> </ul>
<el-upload <el-upload
v-if ="isShowEditButton"
multiple multiple
:action="uploadImgUrl" :action="uploadImgUrl"
list-type="picture-card" list-type="picture-card"
...@@ -94,6 +95,11 @@ export default { ...@@ -94,6 +95,11 @@ export default {
isShowTip: { isShowTip: {
type: Boolean, type: Boolean,
default: true default: true
},
//是否显示编辑按钮
isShowEditButton:{
type: Boolean,
default: true
} }
}, },
data() { data() {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -3,157 +3,157 @@ ...@@ -3,157 +3,157 @@
* *
* 数据字典工具类 * 数据字典工具类
*/ */
import store from '@/store' import store from "@/store";
import i18n from '@/i18n' import i18n from "@/i18n";
export const DICT_TYPE = { export const DICT_TYPE = {
USER_TYPE: 'user_type', USER_TYPE: "user_type",
COMMON_STATUS: 'common_status', COMMON_STATUS: "common_status",
AUDIT_STATUS: 'audit_status', AUDIT_STATUS: "audit_status",
ADVANCE_STATUS: 'advance_status', ADVANCE_STATUS: "advance_status",
BOX_SHIPMENT_STATUS: 'box_shipment_status', BOX_SHIPMENT_STATUS: "box_shipment_status",
BOX_SEA_AIR_SHIPMENT_STATUS: 'shipment_sea_air_state', BOX_SEA_AIR_SHIPMENT_STATUS: "shipment_sea_air_state",
// ========== SYSTEM 模块 ========== // ========== SYSTEM 模块 ==========
SYSTEM_USER_SEX: 'system_user_sex', SYSTEM_USER_SEX: "system_user_sex",
SYSTEM_MENU_TYPE: 'system_menu_type', SYSTEM_MENU_TYPE: "system_menu_type",
SYSTEM_ROLE_TYPE: 'system_role_type', SYSTEM_ROLE_TYPE: "system_role_type",
SYSTEM_DATA_SCOPE: 'system_data_scope', SYSTEM_DATA_SCOPE: "system_data_scope",
SYSTEM_NOTICE_TYPE: 'system_notice_type', SYSTEM_NOTICE_TYPE: "system_notice_type",
SYSTEM_OPERATE_TYPE: 'system_operate_type', SYSTEM_OPERATE_TYPE: "system_operate_type",
SYSTEM_LOGIN_TYPE: 'system_login_type', SYSTEM_LOGIN_TYPE: "system_login_type",
SYSTEM_LOGIN_RESULT: 'system_login_result', SYSTEM_LOGIN_RESULT: "system_login_result",
SYSTEM_SMS_CHANNEL_CODE: 'system_sms_channel_code', SYSTEM_SMS_CHANNEL_CODE: "system_sms_channel_code",
SYSTEM_SMS_TEMPLATE_TYPE: 'system_sms_template_type', SYSTEM_SMS_TEMPLATE_TYPE: "system_sms_template_type",
SYSTEM_SMS_SEND_STATUS: 'system_sms_send_status', SYSTEM_SMS_SEND_STATUS: "system_sms_send_status",
SYSTEM_SMS_RECEIVE_STATUS: 'system_sms_receive_status', SYSTEM_SMS_RECEIVE_STATUS: "system_sms_receive_status",
SYSTEM_MAIL_SEND_STATUS: 'mail_send_status', SYSTEM_MAIL_SEND_STATUS: "mail_send_status",
SYSTEM_ERROR_CODE_TYPE: 'system_error_code_type', SYSTEM_ERROR_CODE_TYPE: "system_error_code_type",
INTERNAL_MESSAGE_TYPE: 'internal_message_type', INTERNAL_MESSAGE_TYPE: "internal_message_type",
INTERNAL_MESSAGE_READ_STATUS: 'internal_message_read_status', INTERNAL_MESSAGE_READ_STATUS: "internal_message_read_status",
SYSTEM_LOCALE: 'system_locale', // 语言列表 SYSTEM_LOCALE: "system_locale", // 语言列表
HELP_DOC_STATUS: 'help_doc_status', HELP_DOC_STATUS: "help_doc_status",
// ========== INFRA 模块 ========== // ========== INFRA 模块 ==========
INFRA_BOOLEAN_STRING: 'infra_boolean_string', INFRA_BOOLEAN_STRING: "infra_boolean_string",
INFRA_REDIS_TIMEOUT_TYPE: 'infra_redis_timeout_type', INFRA_REDIS_TIMEOUT_TYPE: "infra_redis_timeout_type",
INFRA_JOB_STATUS: 'infra_job_status', INFRA_JOB_STATUS: "infra_job_status",
INFRA_JOB_LOG_STATUS: 'infra_job_log_status', INFRA_JOB_LOG_STATUS: "infra_job_log_status",
INFRA_API_ERROR_LOG_PROCESS_STATUS: 'infra_api_error_log_process_status', INFRA_API_ERROR_LOG_PROCESS_STATUS: "infra_api_error_log_process_status",
INFRA_CONFIG_TYPE: 'infra_config_type', INFRA_CONFIG_TYPE: "infra_config_type",
INFRA_CODEGEN_TEMPLATE_TYPE: 'infra_codegen_template_type', INFRA_CODEGEN_TEMPLATE_TYPE: "infra_codegen_template_type",
INFRA_CODEGEN_SCENE: 'infra_codegen_scene', INFRA_CODEGEN_SCENE: "infra_codegen_scene",
INFRA_FILE_STORAGE: 'infra_file_storage', INFRA_FILE_STORAGE: "infra_file_storage",
// ========== BPM 模块 ========== // ========== BPM 模块 ==========
BPM_MODEL_CATEGORY: 'bpm_model_category', BPM_MODEL_CATEGORY: "bpm_model_category",
BPM_MODEL_FORM_TYPE: 'bpm_model_form_type', BPM_MODEL_FORM_TYPE: "bpm_model_form_type",
BPM_TASK_ASSIGN_RULE_TYPE: 'bpm_task_assign_rule_type', BPM_TASK_ASSIGN_RULE_TYPE: "bpm_task_assign_rule_type",
BPM_PROCESS_INSTANCE_STATUS: 'bpm_process_instance_status', BPM_PROCESS_INSTANCE_STATUS: "bpm_process_instance_status",
BPM_PROCESS_INSTANCE_RESULT: 'bpm_process_instance_result', BPM_PROCESS_INSTANCE_RESULT: "bpm_process_instance_result",
BPM_TASK_ASSIGN_SCRIPT: 'bpm_task_assign_script', BPM_TASK_ASSIGN_SCRIPT: "bpm_task_assign_script",
BPM_OA_LEAVE_TYPE: 'bpm_oa_leave_type', BPM_OA_LEAVE_TYPE: "bpm_oa_leave_type",
// ========== PAY 模块 ========== // ========== PAY 模块 ==========
PAY_CHANNEL_WECHAT_VERSION: 'pay_channel_wechat_version', // 微信渠道版本 PAY_CHANNEL_WECHAT_VERSION: "pay_channel_wechat_version", // 微信渠道版本
PAY_CHANNEL_ALIPAY_SIGN_TYPE: 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型 PAY_CHANNEL_ALIPAY_SIGN_TYPE: "pay_channel_alipay_sign_type", // 支付渠道支付宝算法类型
PAY_CHANNEL_ALIPAY_MODE: 'pay_channel_alipay_mode', // 支付宝公钥类型 PAY_CHANNEL_ALIPAY_MODE: "pay_channel_alipay_mode", // 支付宝公钥类型
PAY_CHANNEL_ALIPAY_SERVER_TYPE: 'pay_channel_alipay_server_type', // 支付宝网关地址 PAY_CHANNEL_ALIPAY_SERVER_TYPE: "pay_channel_alipay_server_type", // 支付宝网关地址
PAY_CHANNEL_CODE_TYPE: 'pay_channel_code_type', // 支付渠道编码类型 PAY_CHANNEL_CODE_TYPE: "pay_channel_code_type", // 支付渠道编码类型
PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', // 商户支付订单回调状态 PAY_ORDER_NOTIFY_STATUS: "pay_order_notify_status", // 商户支付订单回调状态
PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态 PAY_ORDER_STATUS: "pay_order_status", // 商户支付订单状态
PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', // 商户支付订单退款状态 PAY_ORDER_REFUND_STATUS: "pay_order_refund_status", // 商户支付订单退款状态
PAY_REFUND_ORDER_STATUS: 'pay_refund_order_status', // 退款订单状态 PAY_REFUND_ORDER_STATUS: "pay_refund_order_status", // 退款订单状态
PAY_REFUND_ORDER_TYPE: 'pay_refund_order_type', // 退款订单类别 PAY_REFUND_ORDER_TYPE: "pay_refund_order_type", // 退款订单类别
ECW_BANK_TYPE: 'bank_type', // 银行账号类型 ECW_BANK_TYPE: "bank_type", // 银行账号类型
ECW_DATA_SOURCE: 'data_source', // 数据来源 ECW_DATA_SOURCE: "data_source", // 数据来源
ECW_REGION_TYPE: 'region_trade_type', // 区域类型 ECW_REGION_TYPE: "region_trade_type", // 区域类型
ECW_TRANSPORT_TYPE: 'transport_type', //货运方式 ECW_TRANSPORT_TYPE: "transport_type", //货运方式
ECW_KYC_DATA: 'member_control_reuest', //会员控单方式 ECW_KYC_DATA: "member_control_reuest", //会员控单方式
ECW_CHARGE_TYPE: 'warehouse_charge_type', //仓储收费方式 ECW_CHARGE_TYPE: "warehouse_charge_type", //仓储收费方式
ECW_SHELF_TYPE: 'shelf_type', //货架类型 ECW_SHELF_TYPE: "shelf_type", //货架类型
ECW_PRODUCT_MATERIAL: 'product_material', //商品材质 ECW_PRODUCT_MATERIAL: "product_material", //商品材质
ECW_PACKAGING_TYPE: 'packaging_type', //包装要求 ECW_PACKAGING_TYPE: "packaging_type", //包装要求
ECW_CONTAINER_LOCATION: 'container_location', //默认货柜位置 ECW_CONTAINER_LOCATION: "container_location", //默认货柜位置
ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS: 'special_req_for_line_products', // 特殊需求 ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS: "special_req_for_line_products", // 特殊需求
ECW_COUPON_TYPE: 'coupon_type', // 优惠券类型 ECW_COUPON_TYPE: "coupon_type", // 优惠券类型
ECW_COUPON_STATUS: 'coupon_status', // 优惠券状态 ECW_COUPON_STATUS: "coupon_status", // 优惠券状态
ECW_COUPON_COST_TYPE: 'coupon_cost_type', // 优惠券费用类型 ECW_COUPON_COST_TYPE: "coupon_cost_type", // 优惠券费用类型
ECW_COUPON_OVERDUE_STATUS: 'coupon_overdue_status', // 优惠券状态 ECW_COUPON_OVERDUE_STATUS: "coupon_overdue_status", // 优惠券状态
ECW_COUPON_PUTON_STATUS: 'coupon_puton_status', ECW_COUPON_PUTON_STATUS: "coupon_puton_status",
ECW_SUITABLE_USER_TYPE: 'suitable_user_type', // 适用用户类型 ECW_SUITABLE_USER_TYPE: "suitable_user_type", // 适用用户类型
ECW_SUITABLE_LINE_TYPE: 'suitable_line_type', // 适用线路类型 ECW_SUITABLE_LINE_TYPE: "suitable_line_type", // 适用线路类型
ECW_SUITABLE_PROD_TYPE: 'suitable_prod_type', // 适用产品类型 ECW_SUITABLE_PROD_TYPE: "suitable_prod_type", // 适用产品类型
ECW_ORDER_ATTR: 'order_attr', // 订单属性 ECW_ORDER_ATTR: "order_attr", // 订单属性
ECW_YESNO: 'yesno', // 是否 1,0 ECW_YESNO: "yesno", // 是否 1,0
ECW_COMPANY_TYPE: 'company_type', // 供应商类别 ECW_COMPANY_TYPE: "company_type", // 供应商类别
ECW_COOPERATION_TYPE: 'cooperation_type', // 合作类型 ECW_COOPERATION_TYPE: "cooperation_type", // 合作类型
ECW_SHIPPING_DECLARATION_TYPE: 'shipping_declaration_type', // 出货报关方式(与订单报关方式相同) ECW_SHIPPING_DECLARATION_TYPE: "shipping_declaration_type", // 出货报关方式(与订单报关方式相同)
ECW_CUSTOMS_TYPE: 'customs_type', // 订单报关方式(非出货报关),优惠券中的单证报关 ECW_CUSTOMS_TYPE: "customs_type", // 订单报关方式(非出货报关),优惠券中的单证报关
// ECW_PACKAGE_TYPE: 'packageType', // 包装单位 // ECW_PACKAGE_TYPE: 'packageType', // 包装单位
ECW_DOUBLE_CLEAR: 'double_clear', // 是否双清 ECW_DOUBLE_CLEAR: "double_clear", // 是否双清
ECW_TRADE_TYPE: 'trade_type', // 交货放肆 ECW_TRADE_TYPE: "trade_type", // 交货放肆
ECW_OFFER_RESULT: 'offer_result', // 报单结果 赢单 输单 ECW_OFFER_RESULT: "offer_result", // 报单结果 赢单 输单
ECW_WAREHOUSING_TYPE: 'warehousing_type', // 入仓类型 ECW_WAREHOUSING_TYPE: "warehousing_type", // 入仓类型
ECW_OFFER_STATUS: 'offer_status', // 销售阶段(报价单) ECW_OFFER_STATUS: "offer_status", // 销售阶段(报价单)
ECW_IS_BRAND: 'is_brand', // 有无品牌 ECW_IS_BRAND: "is_brand", // 有无品牌
ECW_OFFER_TYPE: 'offer_type', // 跟进类型 ECW_OFFER_TYPE: "offer_type", // 跟进类型
ECW_OFFER_METHOD: 'offer_method', // 跟进方式 ECW_OFFER_METHOD: "offer_method", // 跟进方式
ECW_RECEIPT_STATE: 'receipt_state',//收款单状态 ECW_RECEIPT_STATE: "receipt_state", //收款单状态
ECW_RECEIVABLE_STATE: 'receivable_state',//应收明细状态 ECW_RECEIVABLE_STATE: "receivable_state", //应收明细状态
ECW_SUING_METHOD: 'suing_method', // 出单方式 ECW_SUING_METHOD: "suing_method", // 出单方式
ECW_HARVEST_METHOD: 'harvest_method', // 收货方式 ECW_HARVEST_METHOD: "harvest_method", // 收货方式
ECW_PAY_ADVANCE: 'pay_advance', // 是否预付 ECW_PAY_ADVANCE: "pay_advance", // 是否预付
ECW_BEGINTIME_TYPE_ENDTIME: 'begintime_type_endtime', // 时间筛选字段(订单) ECW_BEGINTIME_TYPE_ENDTIME: "begintime_type_endtime", // 时间筛选字段(订单)
ECW_CUSTOM_DRAWEE: 'custom_drawee', // 自定义付款人费用类型 ECW_CUSTOM_DRAWEE: "custom_drawee", // 自定义付款人费用类型
ECW_IS_DRAFT: 'is_draft', // 草稿发布状态 ECW_IS_DRAFT: "is_draft", // 草稿发布状态
ECW_PAYMENT_STATE: 'payment_state',//付款单状态 ECW_PAYMENT_STATE: "payment_state", //付款单状态
ECW_INVOICING_TYPE: 'invoicing_type', ECW_INVOICING_TYPE: "invoicing_type",
ECW_PRICE_TYPE: 'price_type', ECW_PRICE_TYPE: "price_type",
ECW_RELEASE_STATUS: 'release_status', // 放货状态 ECW_RELEASE_STATUS: "release_status", // 放货状态
ECW_PICK_RECURRENT_NUCLEAR_TYPE: 'PICK_RECURRENT_NUCLEAR_TYPE', // 放货反复核类型 ECW_PICK_RECURRENT_NUCLEAR_TYPE: "PICK_RECURRENT_NUCLEAR_TYPE", // 放货反复核类型
ECW_COST_FEE_TYPE: 'cost_fee_type', // 清单费用类型 ECW_COST_FEE_TYPE: "cost_fee_type", // 清单费用类型
ECW_PRICE_AUDIT_STATUS: 'price_audit_status', // 路线价格审核状态 ECW_PRICE_AUDIT_STATUS: "price_audit_status", // 路线价格审核状态
ECW_CANCEL_PICK_TYPE: 'cancel_pick_type', // 取消放货类型 ECW_CANCEL_PICK_TYPE: "cancel_pick_type", // 取消放货类型
ECW_CUSTOMER_RESOURCE_TYPE: 'customer_resource_type', // 客户资源类型 ECW_CUSTOMER_RESOURCE_TYPE: "customer_resource_type", // 客户资源类型
ECW_CUSTOMER_TRANSPORT_TYPE: 'customer_transport_type', // 客户出货渠道(跟运输方式相同,但是显示全部) ECW_CUSTOMER_TRANSPORT_TYPE: "customer_transport_type", // 客户出货渠道(跟运输方式相同,但是显示全部)
ECW_ORDER_APPROVAL_TYPE: 'order_approval_type', // 订单相关审批类型 ECW_ORDER_APPROVAL_TYPE: "order_approval_type", // 订单相关审批类型
ECW_FEE_SOURCE: 'fee_source', // 费用来源 ECW_FEE_SOURCE: "fee_source", // 费用来源
STOCK_UP_EXCEPTION_TYPE: 'stock_up_exception_type', // 备货异常类型, STOCK_UP_EXCEPTION_TYPE: "stock_up_exception_type", // 备货异常类型,
ORDER_ITEM_PACK_STATUS: 'order_item_pack_status', // 空运备货打包状态 ORDER_ITEM_PACK_STATUS: "order_item_pack_status", // 空运备货打包状态
RECEIPT_FEE_TYPE:'receipt_fee_type', RECEIPT_FEE_TYPE: "receipt_fee_type",
DOWNLOAD_LOG_STATUS: 'download_log_status', // 下载日志状态 DOWNLOAD_LOG_STATUS: "download_log_status", // 下载日志状态
DOWNLOAD_TYPE: 'download_type', // 下载类型 DOWNLOAD_TYPE: "download_type", // 下载类型
//--------ecw--------- //--------ecw---------
CUSTOMER_STATUS: 'customer_status', CUSTOMER_STATUS: "customer_status",
CUSTOMER_SOURCE: 'customer_source', CUSTOMER_SOURCE: "customer_source",
CUSTOMER_BALANCE: 'customer_balance', CUSTOMER_BALANCE: "customer_balance",
CUSTOMER_TYPE: 'customer_type', CUSTOMER_TYPE: "customer_type",
CUSTOMER_LEVEL: 'customer_level', CUSTOMER_LEVEL: "customer_level",
CUSTOMER_COMPLAINT_TYPE: 'customer_complaint_type', CUSTOMER_COMPLAINT_TYPE: "customer_complaint_type",
CUSTOMER_COMPLAINT_STATUS: 'customer_complaint_status', CUSTOMER_COMPLAINT_STATUS: "customer_complaint_status",
ECW_MESSAGE_LEAVE_TYPE: 'ecw_message_leave_type', ECW_MESSAGE_LEAVE_TYPE: "ecw_message_leave_type",
ECW_MESSAGE_LEAVE_STATUS: 'ecw_message_leave_status', ECW_MESSAGE_LEAVE_STATUS: "ecw_message_leave_status",
PWD_TYPE: 'pwd_type', PWD_TYPE: "pwd_type",
ZHONG_PAO_TYPE: 'zhong_pao_type', ZHONG_PAO_TYPE: "zhong_pao_type",
TRANSPORT_TYPE: 'transport_type', TRANSPORT_TYPE: "transport_type",
BRAND_REG_TYPE: 'brand_registry_type', BRAND_REG_TYPE: "brand_registry_type",
BRAND_AUTH_STATUS: 'brand_authorization_status', BRAND_AUTH_STATUS: "brand_authorization_status",
BRAND_CUSTOMER_CHARGING_MODEL: 'customer_charging_model', BRAND_CUSTOMER_CHARGING_MODEL: "customer_charging_model",
COUNTRY: 'country', // 国家地区 COUNTRY: "country", // 国家地区
AREA_CODE: 'area_code', // 区号 AREA_CODE: "area_code", // 区号
SOCIAL: 'customer_social_tools', // 社交软件 SOCIAL: "customer_social_tools", // 社交软件
IS_DEFAULT: 'is_default', // 默认联系人 IS_DEFAULT: "is_default", // 默认联系人
CUSTOMER_FOLLOW_TYPE: 'customer_follow_type', // 跟进类型 CUSTOMER_FOLLOW_TYPE: "customer_follow_type", // 跟进类型
CUSTOMER_FOLLOW_METHOD: 'customer_follow_method', // 跟进方式 CUSTOMER_FOLLOW_METHOD: "customer_follow_method", // 跟进方式
COMMISSION_PRODUCT_APPROVAL: 'commission_product_approval', //佣金备案 COMMISSION_PRODUCT_APPROVAL: "commission_product_approval", //佣金备案
SHIPPING_DECLARATION_TYPE: 'shipping_declaration_type',//出货报关方式(与订单报关方式相同) SHIPPING_DECLARATION_TYPE: "shipping_declaration_type", //出货报关方式(与订单报关方式相同)
COMMISSION_TYPE: 'commission_type',//佣金类型 COMMISSION_TYPE: "commission_type", //佣金类型
COMMISSION_DARK_TYPE: 'commission_dark_type',//暗涌类型 COMMISSION_DARK_TYPE: "commission_dark_type", //暗涌类型
// COMMISSION_UNIT: 'commission_unit',//佣金货物单位 // COMMISSION_UNIT: 'commission_unit',//佣金货物单位
ECW_PORT_TYPE: 'port_type', //港口类型 ECW_PORT_TYPE: "port_type", //港口类型
CERTIFICATE_TYPE: 'certificate_type',//证件类型 CERTIFICATE_TYPE: "certificate_type", //证件类型
//customer //customer
CUSTOMER_CREDIT_RULE_TYPE: 'customer_credit_rule_type', CUSTOMER_CREDIT_RULE_TYPE: 'customer_credit_rule_type',
CUSTOMER_LEVEL_RULE_TYPE: 'customer_level_rule_type', CUSTOMER_LEVEL_RULE_TYPE: 'customer_level_rule_type',
...@@ -165,89 +165,101 @@ export const DICT_TYPE = { ...@@ -165,89 +165,101 @@ export const DICT_TYPE = {
CUSTOMER_ROLE: 'customer_role', //角色 CUSTOMER_ROLE: 'customer_role', //角色
MAJOR_COMPETITORS: 'major_competitors', //主要竞争对手 MAJOR_COMPETITORS: 'major_competitors', //主要竞争对手
// order // order
ORDER_TYPE: 'order_type', // 订单类型 ORDER_TYPE: "order_type", // 订单类型
PRODUCT_RECORD_ATTRIBUTE: 'product_record_attribute', //产品备案属性 PRODUCT_RECORD_ATTRIBUTE: "product_record_attribute", //产品备案属性
CONTROL_GOODS_STATUS: 'control_goods_status', //控货状态 CONTROL_GOODS_STATUS: "control_goods_status", //控货状态
DISBURSEMENT_TYPE: 'disbursement_type',//垫付类型 DISBURSEMENT_TYPE: "disbursement_type", //垫付类型
DRAWEE: 'drawee', // 付款人 DRAWEE: "drawee", // 付款人
ORDER_STATUS: 'order_status',//订单状态 ORDER_STATUS: "order_status", //订单状态
ORDER_ITEM_STATUS:'order_item_status', ORDER_ITEM_STATUS: "order_item_status",
BEGINTIME_TYPE_ENDTIME: 'begintime_type_endtime',//订单日期筛选类别 BEGINTIME_TYPE_ENDTIME: "begintime_type_endtime", //订单日期筛选类别
ORDER_ERROR_TYPE:'order_error_type',//订单异常类型 ORDER_ERROR_TYPE: "order_error_type", //订单异常类型
ORDER_EXCEPTION_STATUS:'order_exception_status',//异常订单状态 ORDER_EXCEPTION_STATUS: "order_exception_status", //异常订单状态
PAYMENT_TYPE:'payment_type',//收款类型 PAYMENT_TYPE: "payment_type", //收款类型
ORDER_WAREHOUSE_IN_STATUS: 'order_warehouse_in_diff_status', // 入仓状态 ORDER_WAREHOUSE_IN_STATUS: "order_warehouse_in_diff_status", // 入仓状态
ORDER_NO_QUOTE_EXCEPTION_RESULT:'order_no_quote_exception_result',//未报价异常处理结果 ORDER_NO_QUOTE_EXCEPTION_RESULT: "order_no_quote_exception_result", //未报价异常处理结果
ORDER_SUPERFLUOUS_BOX_EXCEPTION_RESULT:'order_superfluous_box_exception_result',//多箱异常处理结果 ORDER_SUPERFLUOUS_BOX_EXCEPTION_RESULT:
ORDER_LACI_BOX_EXCEPTION_RESULT:'order_lack_box_exception_result',//少箱异常处理结果 "order_superfluous_box_exception_result", //多箱异常处理结果
ORDER_PAY_EXCEPTION_RESULT:'order_pay_exception_result',//预付异常处理结果 ORDER_LACI_BOX_EXCEPTION_RESULT: "order_lack_box_exception_result", //少箱异常处理结果
ORDER_MISS_EXCEPTION_RESULT:'order_miss_exception_result',//货物丢失异常处理结果 ORDER_PAY_EXCEPTION_RESULT: "order_pay_exception_result", //预付异常处理结果
ORDER_SUPERFLUOUS_GOODS_EXCEPTION_RESULT:'order_superfluous_goods_exception_result',//货物增多异常处理结果 ORDER_MISS_EXCEPTION_RESULT: "order_miss_exception_result", //货物丢失异常处理结果
ORDER_DAMAGE_EXCEPTION_RESULT:'order_damage_exception_result',//货物破损异常处理结果 ORDER_SUPERFLUOUS_GOODS_EXCEPTION_RESULT:
ORDER_IN_WATER_EXCEPTION_RESULT:'order_in_water_exception_result',//货物浸水异常处理结果 "order_superfluous_goods_exception_result", //货物增多异常处理结果
ORDER_HEAVY_CARGO_EXCEPTION_RESULT:'order_heavy_cargo_exception_result',//重货异常处理结果 ORDER_DAMAGE_EXCEPTION_RESULT: "order_damage_exception_result", //货物破损异常处理结果
ORDER_DOC_EXCEPTION_RESULT:'order_doc_exception_result',//单证异常处理结果 ORDER_IN_WATER_EXCEPTION_RESULT: "order_in_water_exception_result", //货物浸水异常处理结果
ORDER_CONSIGNOR_EXCEPTION_RESULT:'order_consignor_exception_result',//发货人异常处理结果 ORDER_HEAVY_CARGO_EXCEPTION_RESULT: "order_heavy_cargo_exception_result", //重货异常处理结果
ORDER_COD_EXCEPTION_RESULT:'order_cod_exception_result',//代收货款异常处理结果 ORDER_DOC_EXCEPTION_RESULT: "order_doc_exception_result", //单证异常处理结果
ORDER_OTHER_EXCEPTION_RESULT:'order_other_exception_result',//其它异常处理结果 ORDER_CONSIGNOR_EXCEPTION_RESULT: "order_consignor_exception_result", //发货人异常处理结果
ORDER_BULKY_CARGO_EXCEPTION_RESULT:'order_bulky_cargo_exception_result',//泡货异常处理结果 ORDER_COD_EXCEPTION_RESULT: "order_cod_exception_result", //代收货款异常处理结果
ORDER_QUERY_PROD_FIELD: 'order_query_prod_field',//订单查询产品字段 ORDER_OTHER_EXCEPTION_RESULT: "order_other_exception_result", //其它异常处理结果
ORDER_QUERY_NO_FIELD: 'order_query_no_field',//订单查询非产品字段 ORDER_BULKY_CARGO_EXCEPTION_RESULT: "order_bulky_cargo_exception_result", //泡货异常处理结果
NEED_KNOW_TYPE:'need_know_type',//需知类型 ORDER_QUERY_PROD_FIELD: "order_query_prod_field", //订单查询产品字段
NEED_KNOW_STATUS:'need_know_status',//需知状态 ORDER_QUERY_NO_FIELD: "order_query_no_field", //订单查询非产品字段
MANUAL_EXCEPTION_TYPE:'manual_exception_type', NEED_KNOW_TYPE: "need_know_type", //需知类型
APPLY_STATUS:'apply_status',//特价申请审核状态 NEED_KNOW_STATUS: "need_know_status", //需知状态
WAREHOUSING_SPECIFICATION_TYPE: 'warehousing_specification_type', MANUAL_EXCEPTION_TYPE: "manual_exception_type",
WAREHOUSING_RECORD_DETAIL_USAGE: 'warehousing_record_detail_usage', // 入仓规格类型 APPLY_STATUS: "apply_status", //特价申请审核状态
ECW_AUTH_TYPE:'auth_type',//品牌授权 WAREHOUSING_SPECIFICATION_TYPE: "warehousing_specification_type",
OREER_ITEM_USAGE:'order_item_usage',//用途 WAREHOUSING_RECORD_DETAIL_USAGE: "warehousing_record_detail_usage", // 入仓规格类型
ECW_AUTH_TYPE: "auth_type", //品牌授权
OREER_ITEM_USAGE: "order_item_usage", //用途
NEED_ORDER_INQUIRY: 'need_order_inquiry', // 是否需要単询 NEED_ORDER_INQUIRY: "need_order_inquiry", // 是否需要単询
EXCEPTION_SELECT_FILED:'exception_select_filed', EXCEPTION_SELECT_FILED: "exception_select_filed",
ECASH_INIT:'ecash_init', //e-cash ECASH_INIT: "ecash_init", //e-cash
FEE_TYPE:'receivable_fee_type', FEE_TYPE: "receivable_fee_type",
// PAY_TYPE:'payment_type', // PAY_TYPE:'payment_type',
RECEIVE_FLAG:'receive_flag', RECEIVE_FLAG: "receive_flag",
COMDINED_VALUE_ADDED_FEE:'combined_value_added_fee', COMDINED_VALUE_ADDED_FEE: "combined_value_added_fee",
ORDER_SPECIAL_NEEDS:'order_special_needs', // 订单特殊需求 ORDER_SPECIAL_NEEDS: "order_special_needs", // 订单特殊需求
ORDER_ABNORMAL_STATE:'order_abnormal_state', ORDER_ABNORMAL_STATE: "order_abnormal_state",
TARGET_TYPE:'target_type',//部门业绩目标类型 TARGET_TYPE: "target_type", //部门业绩目标类型
CEBE_UNIT:'cube_unit',//目标单位 CEBE_UNIT: "cube_unit", //目标单位
RECEIPT_ITEM_STATE:'receipt_item_state',//收款单明细状态 RECEIPT_ITEM_STATE: "receipt_item_state", //收款单明细状态
// ========== 出货模块 ========== // ========== 出货模块 ==========
BOX_SHIPPING_TRAILER_STATUS: 'shipping_trailer_status', // 拖车状态 BOX_SHIPPING_TRAILER_STATUS: "shipping_trailer_status", // 拖车状态
BOX_SHIPPING_CUSTOMS_TYPE: 'shipping_customs_type', // 报关方式 BOX_SHIPPING_CUSTOMS_TYPE: "shipping_customs_type", // 报关方式
BOX_SHIPPING_DCCUSTOMS_STATUS: 'shipping_dcCustoms_status', // 报关放行状态 BOX_SHIPPING_DCCUSTOMS_STATUS: "shipping_dcCustoms_status", // 报关放行状态
BOX_SHIPPING_CHECK_STATUS: 'shipping_check_status', // 查验状态 BOX_SHIPPING_CHECK_STATUS: "shipping_check_status", // 查验状态
BOX_SHIPPING_UNLOADING_ERROR: 'shipping_unloading_error', // 卸柜异常类型 BOX_SHIPPING_UNLOADING_ERROR: "shipping_unloading_error", // 卸柜异常类型
BOX_SHIPPING_PRICE_UNIT: 'shipping_price_unit', // 金额单位 BOX_SHIPPING_PRICE_UNIT: "shipping_price_unit", // 金额单位
BOX_SHIPPING_TICKET_EXCEPTION: 'shipping_ticket_exception', // 票异常 BOX_SHIPPING_TICKET_EXCEPTION: "shipping_ticket_exception", // 票异常
BOX_SHIPPING_PROCESS: 'shipping_process', // 海运出货流程 BOX_SHIPPING_PROCESS: "shipping_process", // 海运出货流程
BOX_AIR_SHIPMENT_PROCESS: 'air_shipment_process', // 空运出货 BOX_AIR_SHIPMENT_PROCESS: "air_shipment_process", // 空运出货
BOX_SEA_AIR: 'shipping_process_sea_air', // 海空联运流程流程 BOX_SEA_AIR: "shipping_process_sea_air", // 海空联运流程流程
BOX_SHIPPING_BRAND_TYPE: 'shipping_brand_type', // 出货品牌类型 BOX_SHIPPING_BRAND_TYPE: "shipping_brand_type", // 出货品牌类型
BOX_SHIPPING_NOTICE_TYPE: 'shipping_notice_type', // 出货通知类型 BOX_SHIPPING_NOTICE_TYPE: "shipping_notice_type", // 出货通知类型
BOX_ORDER_SHIPMENT_STATE: 'order_shipment_state', BOX_ORDER_SHIPMENT_STATE: "order_shipment_state",
BOX_AIR_SHIPMENT_STATE: 'air_shipment_status', BOX_AIR_SHIPMENT_STATE: "air_shipment_status",
BOX_INSPECTION_TIME_CUSTOMS: 'inspection_time_customs', // 校验时间-报关 BOX_INSPECTION_TIME_CUSTOMS: "inspection_time_customs", // 校验时间-报关
BOX_INSPECTION_TIME_SHIPPING: 'inspection_time_shipping', // 校验时间-起运 BOX_INSPECTION_TIME_SHIPPING: "inspection_time_shipping", // 校验时间-起运
BOX_INSPECTION_TIME_ARRIVAL: 'inspection_time_arrival', // 校验时间-到港 BOX_INSPECTION_TIME_ARRIVAL: "inspection_time_arrival", // 校验时间-到港
BOX_SHIPPING_UPDATE_TYPE: "shipping_update_type",// 更新类型 BOX_SHIPPING_UPDATE_TYPE: "shipping_update_type", // 更新类型
BOX_CUSTOMS_ERROR_TYPE: "customs_error_type",// 报关异常状态 BOX_CUSTOMS_ERROR_TYPE: "customs_error_type", // 报关异常状态
BOX_SHIPPING_ERROR_TYPE: "shipping_error_type",// 起运异常状态 BOX_SHIPPING_ERROR_TYPE: "shipping_error_type", // 起运异常状态
BOX_ARRIVAL_ERROR_TYPE: "arrival_error_type",// 到港异常状态 BOX_ARRIVAL_ERROR_TYPE: "arrival_error_type", // 到港异常状态
BOX_FLYING_ERROR_TYPE: 'flying_error_type',// 航班异常状态 BOX_FLYING_ERROR_TYPE: "flying_error_type", // 航班异常状态
SETTLEMENT_STATUS: 'settlement_status', // 结算状态 SETTLEMENT_STATUS: "settlement_status", // 结算状态
FLYING_TICKET_EXCEPTION: 'flying_ticket_exception', // 起飞异常 FLYING_TICKET_EXCEPTION: "flying_ticket_exception", // 起飞异常
ARRIVAL_TICKET_EXCEPTION: 'arrival_ticket_exception', // 到港异常 ARRIVAL_TICKET_EXCEPTION: "arrival_ticket_exception", // 到港异常
CLEARANCE_TICKET_EXCEPTION: 'clearance_ticket_exception', // 清关异常 CLEARANCE_TICKET_EXCEPTION: "clearance_ticket_exception", // 清关异常
APP_TYPE:"app_type", //系统类型 APP_TYPE: "app_type", //系统类型
AIR_SHIPMENT_PROCESS:'air_shipment_process', AIR_SHIPMENT_PROCESS: "air_shipment_process",
CUSTOM_CLEARANCE:'custom _clearance', //全部列表空运订单重量上限 CUSTOM_CLEARANCE: "custom _clearance", //全部列表空运订单重量上限
AIR_COMMODITY_CUSTOM_CLEARANCE:'air_commodity_custom _clearance'//商品渠道清关费, AIR_COMMODITY_CUSTOM_CLEARANCE: "air_commodity_custom _clearance", //商品渠道清关费,
QUANTITATIVE_RELATION_SYMBOL: "quantitative_relation_symbol", //数量关系符号
} WAY_OF_RECEIVING: "way_of_receiving", //领取方式
GIFT_STATUS: "gift_status", //礼品状态
GIFT_ENABLE_STATUS: "gift_enable_status", //礼品启用状态
PLATFORM_TYPE: "platform_type", //平台入口
REWARD_REDEEM_STATUS: "reward_redeem_status", //礼品兑换状态
MEMBER_SCORE_OPERATE_TYPE: "member_user_score_log_operate_type", //会员积分日志操作类型
SCORE_RULE_TYPE: "score_rule_type", //积分规则指标类型
YES_OR_NO: "yes_or_no",
CLIENT_PLATFORM: "client_platform",
MEMBER_SCORE_SOURCE: "member_score_source", //会员积分来源
};
/** /**
* 获取 dictType 对应的数据字典数组 * 获取 dictType 对应的数据字典数组
...@@ -261,7 +273,7 @@ export function getDictDatas(dictType) { ...@@ -261,7 +273,7 @@ export function getDictDatas(dictType) {
// debugger // debugger
// } // }
// debugger // debugger
return store.getters.dict_datas[dictType] || [] return store.getters.dict_datas[dictType] || [];
} }
/** /**
...@@ -294,24 +306,23 @@ export function getDictDatas2(dictType, values) { ...@@ -294,24 +306,23 @@ export function getDictDatas2(dictType, values) {
export function getDictData(dictType, value) { export function getDictData(dictType, value) {
// 获取 dictType 对应的数据字典数组 // 获取 dictType 对应的数据字典数组
const dictDatas = getDictDatas(dictType) const dictDatas = getDictDatas(dictType);
if (!dictDatas || dictDatas.length === 0) { if (!dictDatas || dictDatas.length === 0) {
return '' return "";
} }
// 获取 value 对应的展示名 // 获取 value 对应的展示名
value = value + '' // 强制转换成字符串,因为 DictData 小类数值,是字符串 value = value + ""; // 强制转换成字符串,因为 DictData 小类数值,是字符串
for (const dictData of dictDatas) { for (const dictData of dictDatas) {
if (dictData.value === value) { if (dictData.value === value) {
return dictData; return dictData;
} }
} }
return undefined return undefined;
} }
export function getDictDataLabel(dictType, value) { export function getDictDataLabel(dictType, value) {
const dict = getDictData(dictType, value); const dict = getDictData(dictType, value);
return dict ? i18n.l(dict, 'label') : ''; return dict ? i18n.l(dict, "label") : "";
} }
export class getDictDataL { export class getDictDataL {}
}
import axios from 'axios' import axios from "axios";
import { Notification, MessageBox, Message } from 'element-ui' import { Notification, MessageBox, Message } from "element-ui";
import store from '@/store' import store from "@/store";
import { getToken } from '@/utils/auth' import { getToken } from "@/utils/auth";
import errorCode from '@/utils/errorCode' import errorCode from "@/utils/errorCode";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import {getTenantEnable} from "@/utils/ruoyi"; import { getTenantEnable } from "@/utils/ruoyi";
import { getLocale } from '@/utils/db'; import { getLocale } from "@/utils/db";
import i18n from "@/i18n"; import i18n from "@/i18n";
// 是否显示重新登录 // 是否显示重新登录
export let isRelogin = { show: false }; export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分 // axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: (localStorage.VUE_APP_BASE_API || process.env.VUE_APP_BASE_API) + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/ baseURL:
(localStorage.VUE_APP_BASE_API || process.env.VUE_APP_BASE_API) +
"/admin-api/", // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/
// 超时 // 超时
timeout: 1000 * 30 timeout: 1000 * 30,
}) });
// 如果是生产环境则打印提示 // 如果是生产环境则打印提示
if (process.env.NODE_ENV === 'development' && service.defaults.baseURL === 'https://api2.groupage.cn/admin-api/') { if (
console.log('%c请注意,当前为生产环境请谨慎操作!!', 'background-color: red; font-size: 3em; color:yellow'); process.env.NODE_ENV === "development" &&
console.log('%c接口地址:' + service.defaults.baseURL, 'background-color: black; font-size: 1.5em; color:yellow !important'); service.defaults.baseURL === "https://api2.groupage.cn/admin-api/"
) {
console.log(
"%c请注意,当前为生产环境请谨慎操作!!",
"background-color: red; font-size: 3em; color:yellow"
);
console.log(
"%c接口地址:" + service.defaults.baseURL,
"background-color: black; font-size: 1.5em; color:yellow !important"
);
} }
// request拦截器 // request拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(
config.headers['locale'] = getLocale() (config) => {
// 是否需要设置 token config.headers["locale"] = getLocale();
const isToken = (config.headers || {}).isToken === false // 是否需要设置 token
if (getToken() && !isToken) { const isToken = (config.headers || {}).isToken === false;
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 if (getToken() && !isToken) {
} config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
// 设置租户
if (getTenantEnable()) {
const tenantId = Cookies.get('tenantId');
if (tenantId) {
config.headers['tenant-id'] = tenantId;
} }
} // 设置租户
// get请求映射params参数 if (getTenantEnable()) {
if (config.method === 'get' && config.params) { const tenantId = Cookies.get("tenantId");
let url = config.url + '?'; if (tenantId) {
for (const propName of Object.keys(config.params)) { config.headers["tenant-id"] = tenantId;
const value = config.params[propName]; }
var part = encodeURIComponent(propName) + "="; }
if (value !== null && typeof(value) !== "undefined") { // get请求映射params参数
if (typeof value === 'object') { if (config.method === "get" && config.params) {
for (const key of Object.keys(value)) { let url = config.url + "?";
let params = propName + '[' + key + ']'; for (const propName of Object.keys(config.params)) {
var subPart = encodeURIComponent(params) + "="; const value = config.params[propName];
url += subPart + encodeURIComponent(value[key]) + "&"; var part = encodeURIComponent(propName) + "=";
if (value !== null && typeof value !== "undefined") {
if (typeof value === "object") {
for (const key of Object.keys(value)) {
let params = propName + "[" + key + "]";
var subPart = encodeURIComponent(params) + "=";
url += subPart + encodeURIComponent(value[key]) + "&";
}
} else {
url += part + encodeURIComponent(value) + "&";
} }
} else {
url += part + encodeURIComponent(value) + "&";
} }
} }
url = url.slice(0, -1);
config.params = {};
config.url = url;
} }
url = url.slice(0, -1); return config;
config.params = {}; },
config.url = url; (error) => {
console.log(error);
Promise.reject(error);
} }
return config );
}, error => {
console.log(error)
Promise.reject(error)
})
// 响应拦截器 // 响应拦截器
service.interceptors.response.use(res => { service.interceptors.response.use(
(res) => {
// 未设置状态码则默认成功状态 // 未设置状态码则默认成功状态
const code = res.data.code || 200; const code = res.data.code || 200;
// 获取错误信息 // 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default'] const msg = errorCode[code] || res.data.msg || errorCode["default"];
if (code === 401) { if (code === 401) {
if (!isRelogin.show) { if (!isRelogin.show) {
isRelogin.show = true; isRelogin.show = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { MessageBox.confirm(
confirmButtonText: '重新登录', "登录状态已过期,您可以继续留在该页面,或者重新登录",
cancelButtonText: '取消', "系统提示",
type: 'warning' {
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
} }
).then(() => { )
isRelogin.show = false; .then(() => {
store.dispatch('LogOut').then(() => { isRelogin.show = false;
location.href = '/'; store.dispatch("LogOut").then(() => {
location.href = "/";
});
}) })
}).catch(() => { .catch(() => {
isRelogin.show = false; isRelogin.show = false;
}); });
} }
return Promise.reject('无效的会话,或者会话已过期,请重新登录。') return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
} else if (code === 500) { } else if (code === 500) {
Message({ Message({
dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true,
message: msg, message: msg,
type: 'error' type: "error",
}) });
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg));
} else if (code === 901) { } else if (code === 901) {
Message({ Message({
type: 'error', type: "error",
duration: 0, duration: 0,
dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true,
message: '<div>演示模式,无法进行写操作</div>' message:
+ '<div> &nbsp; </div>' "<div>演示模式,无法进行写操作</div>" +
+ '<div>参考 https://doc.iocoder.cn/ 教程</div>' "<div> &nbsp; </div>" +
+ '<div> &nbsp; </div>' "<div>参考 https://doc.iocoder.cn/ 教程</div>" +
+ '<div>5 分钟搭建本地环境</div>', "<div> &nbsp; </div>" +
}) "<div>5 分钟搭建本地环境</div>",
return Promise.reject(new Error(msg)) });
return Promise.reject(new Error(msg));
} else if (code === 555) { } else if (code === 555) {
// 额外情况 // 额外情况
return Promise.reject(res.data) return Promise.reject(res.data);
} else if (code === 566) { } else if (code === 566) {
// 额外情况 // 额外情况
return Promise.reject(res.data) return Promise.reject(res.data);
} else if (code === 666) { } else if (code === 666) {
// 额外情况 // 额外情况
return Promise.reject(res.data) return Promise.reject(res.data);
} else if (code !== 200) { } else if (code !== 200) {
// 如果内容很长则用alert提示,不然可能显示不全,自动隐藏也会导致看不完整就消失了 // 如果内容很长则用alert提示,不然可能显示不全,自动隐藏也会导致看不完整就消失了
if(msg.length > 300){ if (msg.length > 300) {
MessageBox.alert(msg, i18n.t('错误提示'), i18n.t('确定')) MessageBox.alert(msg, i18n.t("错误提示"), i18n.t("确定"));
}else{ } else {
Notification.error({ Notification.error({
title: msg title: msg,
}) });
} }
return Promise.reject(msg || 'error') return Promise.reject(msg || "error");
} else { } else {
return res.data return res.data;
} }
}, },
error => { (error) => {
console.log('err' + error) console.log("err" + error);
let { message } = error; let { message } = error;
if (message === "Network Error") { if (message === "Network Error") {
message = "后端接口连接异常"; message = "后端接口连接异常";
} } else if (message.includes("timeout")) {
else if (message.includes("timeout")) {
message = "系统接口请求超时"; message = "系统接口请求超时";
} } else if (message.includes("Request failed with status code")) {
else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
Message({ Message({
message: message, message: message,
type: 'error', type: "error",
duration: 5 * 1000 duration: 5 * 1000,
}) });
return Promise.reject(error) return Promise.reject(error);
} }
) );
export function getBaseHeader() { export function getBaseHeader() {
return { return {
'Authorization': "Bearer " + getToken(), Authorization: "Bearer " + getToken(),
'tenant-id': Cookies.get('tenantId'), "tenant-id": Cookies.get("tenantId"),
} };
} }
export default service export default service;
...@@ -601,7 +601,7 @@ export default { ...@@ -601,7 +601,7 @@ export default {
regError, regError,
editForm, editForm,
updateError, updateError,
//lanbm 2024-05-23 异常登记对话框 //异常登记对话框
unloadingError, unloadingError,
}, },
created() { created() {
...@@ -615,7 +615,7 @@ export default { ...@@ -615,7 +615,7 @@ export default {
const { data } = res; const { data } = res;
this.allUsers = data.list ?? []; this.allUsers = data.list ?? [];
}); });
//lanbm 2024-05-16 add //add
/* 不用此方式 /* 不用此方式
getCurrencyList().then((res) => { getCurrencyList().then((res) => {
this.currencyList = res.data ?? []; this.currencyList = res.data ?? [];
......
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 -->
<el-form <el-form
:model="queryParams" :model="queryParams"
ref="queryForm" ref="queryForm"
...@@ -15,7 +14,8 @@ ...@@ -15,7 +14,8 @@
:placeholder="$t('请输入客户编号')" :placeholder="$t('请输入客户编号')"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"/> onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('客户名称')" prop="name"> <el-form-item :label="$t('客户名称')" prop="name">
<el-input <el-input
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="$t('客户等级')" prop="level"> <el-form-item :label="$t('客户等级')" prop="level">
<el-select <el-select
multiple multiple
v-model="queryParams.level" v-model="queryParams.level"
:placeholder="$t('请选择客户等级')" :placeholder="$t('请选择客户等级')"
clearable clearable
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="$t('客户类别')" prop="level"> <el-form-item :label="$t('客户类别')" prop="level">
<dict-selector <dict-selector
multiple multiple
clearable clearable
:type="DICT_TYPE.CUSTOMER_TYPE" :type="DICT_TYPE.CUSTOMER_TYPE"
v-model="queryParams.type" v-model="queryParams.type"
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="$t('国家')" prop="source"> <el-form-item :label="$t('国家')" prop="source">
<el-select <el-select
multiple multiple
clearable clearable
v-model="queryParams.country" v-model="queryParams.country"
:placeholder="$t('请选择国家')" :placeholder="$t('请选择国家')"
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
</el-form-item> </el-form-item>
<el-form-item :label="$t('客户状态')" prop="status"> <el-form-item :label="$t('客户状态')" prop="status">
<el-select <el-select
multiple multiple
clearable clearable
v-model="queryParams.status" v-model="queryParams.status"
:placeholder="$t('请选择客户状态')" :placeholder="$t('请选择客户状态')"
...@@ -136,13 +136,11 @@ ...@@ -136,13 +136,11 @@
range-separator="-" range-separator="-"
:start-placeholder="$t('开始日期')" :start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')" :end-placeholder="$t('结束日期')"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('信用等级')" prop="department"> <el-form-item :label="$t('信用等级')" prop="department">
<el-select multiple clearable v-model="queryParams.creditLevel"> <el-select multiple clearable v-model="queryParams.creditLevel">
<el-option <el-option
v-for="(item, index) in creditList" v-for="(item, index) in creditList"
:label="isChinese ? item.nameZh : item.nameEn" :label="isChinese ? item.nameZh : item.nameEn"
:key="index" :key="index"
...@@ -160,6 +158,36 @@ ...@@ -160,6 +158,36 @@
formatter="number" formatter="number"
@change="handleQuery" @change="handleQuery"
></dict-selector> ></dict-selector>
</el-form-item>
<el-form-item :label="$t('会员电话')" prop="department">
<el-col :span="11">
<area-code-selector style="width: 100%;" v-model="queryParams.memberAreaCode" />
</el-col>
<el-col class="line" :span="2"></el-col>
<el-col :span="11">
<el-input maxlength="11"
width="100%"
class="ml-10 w-200"
clearable
v-model.number="queryParams.memberMobile"
:placeholder="$t('请输入会员电话')"/>
</el-col>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="number">
<el-input
v-model.trim="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员名称')" prop="name">
<el-input
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
...@@ -268,6 +296,18 @@ ...@@ -268,6 +296,18 @@
>{{ $t("新增潜在客户") }}</el-button >{{ $t("新增潜在客户") }}</el-button
> >
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleMergeCus"
>{{ $t("合并客户") }}</el-button
>
</el-col>
<right-toolbar <right-toolbar
:showSearch.sync="showSearch" :showSearch.sync="showSearch"
@queryTable="getList" @queryTable="getList"
...@@ -1035,6 +1075,8 @@ import AddPotentialCustom from "@/views/ecw/customer/addPotentialCustom.vue"; ...@@ -1035,6 +1075,8 @@ import AddPotentialCustom from "@/views/ecw/customer/addPotentialCustom.vue";
import Contacts from "@/views/ecw/customer/components/contacts.vue"; import Contacts from "@/views/ecw/customer/components/contacts.vue";
import { getUserProfile } from "@/api/system/user"; import { getUserProfile } from "@/api/system/user";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
export default { export default {
name: "EcwCustomerIndex", name: "EcwCustomerIndex",
components: { components: {
...@@ -1045,6 +1087,7 @@ export default { ...@@ -1045,6 +1087,7 @@ export default {
CustomerFollowList, CustomerFollowList,
customerComplaints, customerComplaints,
transferCustomer, transferCustomer,
AreaCodeSelector
}, },
data() { data() {
return { return {
...@@ -1056,7 +1099,7 @@ export default { ...@@ -1056,7 +1099,7 @@ export default {
// 导出遮罩层 // 导出遮罩层
exportLoading: false, exportLoading: false,
// 显示搜索条件 // 显示搜索条件
showSearch: true, showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// 客户列表 // 客户列表
...@@ -1080,6 +1123,10 @@ export default { ...@@ -1080,6 +1123,10 @@ export default {
creditLevel: null, creditLevel: null,
country: null, country: null,
resourceType: null, resourceType: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}, },
// 表单参数 // 表单参数
form: {}, form: {},
...@@ -1220,6 +1267,9 @@ export default { ...@@ -1220,6 +1267,9 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
handleMergeCus() {
//合并客户
},
recovery(row) { recovery(row) {
this.$confirm(this.$t("是否要回收当前{name}", row), "提示", { this.$confirm(this.$t("是否要回收当前{name}", row), "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
...@@ -1470,6 +1520,10 @@ export default { ...@@ -1470,6 +1520,10 @@ export default {
department: null, department: null,
creditLevel: null, creditLevel: null,
country: null, country: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}; };
this.handleQuery(); this.handleQuery();
}, },
......
...@@ -28,6 +28,36 @@ ...@@ -28,6 +28,36 @@
<el-form-item :label="$t('市场获客')" prop="department"> <el-form-item :label="$t('市场获客')" prop="department">
<dict-selector clearable :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number" @change="handleQuery"></dict-selector> <dict-selector clearable :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number" @change="handleQuery"></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('会员电话')" prop="department">
<el-col :span="11">
<area-code-selector style="width: 100%;" v-model="queryParams.memberAreaCode" />
</el-col>
<el-col class="line" :span="2"></el-col>
<el-col :span="11">
<el-input maxlength="11"
width="100%"
class="ml-10 w-200"
clearable
v-model.number="queryParams.memberMobile"
:placeholder="$t('请输入会员电话')"/>
</el-col>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="number">
<el-input
v-model.trim="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员名称')" prop="name">
<el-input
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <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-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button>
...@@ -35,6 +65,13 @@ ...@@ -35,6 +65,13 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8">
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table ref="multipleTable" v-loading="loading" :data="list" @selection-change="handleSelectionChange"> <el-table ref="multipleTable" v-loading="loading" :data="list" @selection-change="handleSelectionChange">
<el-table-column <el-table-column
...@@ -43,7 +80,6 @@ ...@@ -43,7 +80,6 @@
</el-table-column> </el-table-column>
<el-table-column :label="$t('客户名称')" align="center" prop="name" > <el-table-column :label="$t('客户名称')" align="center" prop="name" >
<template v-slot="scope"> <template v-slot="scope">
<span>{{ $l(scope.row,'name') }}</span> <span>{{ $l(scope.row,'name') }}</span>
</template> </template>
</el-table-column> </el-table-column>
...@@ -99,9 +135,13 @@ import { getDictDatas, DICT_TYPE } from '@/utils/dict'; ...@@ -99,9 +135,13 @@ import { getDictDatas, DICT_TYPE } from '@/utils/dict';
import {listServiceUser} from "@/api/system/user"; import {listServiceUser} from "@/api/system/user";
import {exportCustomerComplaintExcel} from "@/api/ecw/customerComplaint"; import {exportCustomerComplaintExcel} from "@/api/ecw/customerComplaint";
import {indirectCustomerExportExcel} from "@/api/ecw/customer"; import {indirectCustomerExportExcel} from "@/api/ecw/customer";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
export default { export default {
name: "EcwCustomerIndirectcustomer", name: "EcwCustomerIndirectcustomer",
components: {
AreaCodeSelector
},
activated() { activated() {
this.getList() this.getList()
}, },
...@@ -114,7 +154,7 @@ export default { ...@@ -114,7 +154,7 @@ export default {
loading: true, loading: true,
// 导出遮罩层 // 导出遮罩层
// 显示搜索条件 // 显示搜索条件
showSearch: true, showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// 客户列表 // 客户列表
...@@ -131,7 +171,11 @@ export default { ...@@ -131,7 +171,11 @@ export default {
name: null, name: null,
source: null, source: null,
customerService: null, customerService: null,
marketType:null marketType:null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}, },
// 网点 // 网点
nodeList: [], nodeList: [],
...@@ -203,6 +247,10 @@ export default { ...@@ -203,6 +247,10 @@ export default {
name: null, name: null,
source: null, source: null,
customerService: null, customerService: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
} }
this.handleQuery(); this.handleQuery();
}, },
......
<template>
<div class="app-container">
<el-card style="margin-bottom: 10px"> </el-card>
<el-card style="margin-bottom: 10px"> </el-card>
</div>
</template>
\ No newline at end of file
...@@ -57,6 +57,36 @@ ...@@ -57,6 +57,36 @@
<el-form-item :label="$t('市场获客')" prop="department"> <el-form-item :label="$t('市场获客')" prop="department">
<dict-selector multiple clearable :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number" @change="handleQuery"></dict-selector> <dict-selector multiple clearable :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number" @change="handleQuery"></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('会员电话')" prop="department">
<el-col :span="11">
<area-code-selector style="width: 100%;" v-model="queryParams.memberAreaCode" />
</el-col>
<el-col class="line" :span="2"></el-col>
<el-col :span="11">
<el-input maxlength="11"
width="100%"
class="ml-10 w-200"
clearable
v-model.number="queryParams.memberMobile"
:placeholder="$t('请输入会员电话')"/>
</el-col>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="number">
<el-input
v-model.trim="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员名称')" prop="name">
<el-input
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <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-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button>
...@@ -373,7 +403,7 @@ import {getCountryListAll} from "@/api/ecw/country"; ...@@ -373,7 +403,7 @@ import {getCountryListAll} from "@/api/ecw/country";
import {getCreditPage} from "@/api/customer/credit"; import {getCreditPage} from "@/api/customer/credit";
import transferCustomer from "@/views/ecw/customer/transferCustomer.vue"; import transferCustomer from "@/views/ecw/customer/transferCustomer.vue";
import Contacts from "@/views/ecw/customer/components/contacts.vue"; import Contacts from "@/views/ecw/customer/components/contacts.vue";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
export default { export default {
...@@ -391,7 +421,8 @@ export default { ...@@ -391,7 +421,8 @@ export default {
}, },
components: { components: {
Contacts, Contacts,
transferCustomer transferCustomer,
AreaCodeSelector
}, },
data() { data() {
return { return {
...@@ -400,7 +431,7 @@ export default { ...@@ -400,7 +431,7 @@ export default {
// 导出遮罩层 // 导出遮罩层
exportLoading: false, exportLoading: false,
// 显示搜索条件 // 显示搜索条件
showSearch: true, showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// 客户列表 // 客户列表
...@@ -425,6 +456,10 @@ export default { ...@@ -425,6 +456,10 @@ export default {
creditLevel:null, creditLevel:null,
country:null, country:null,
marketType:null, marketType:null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}, },
// 表单参数 // 表单参数
form: {}, form: {},
...@@ -563,6 +598,10 @@ export default { ...@@ -563,6 +598,10 @@ export default {
department: null, department: null,
creditLevel:null, creditLevel:null,
country:null, country:null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
} }
this.handleQuery(); this.handleQuery();
}, },
......
...@@ -58,6 +58,36 @@ ...@@ -58,6 +58,36 @@
<el-form-item :label="$t('市场获客')" prop="department"> <el-form-item :label="$t('市场获客')" prop="department">
<dict-selector clearable :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number"></dict-selector> <dict-selector clearable :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number"></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('会员电话')" prop="department">
<el-col :span="11">
<area-code-selector style="width: 100%;" v-model="queryParams.memberAreaCode" />
</el-col>
<el-col class="line" :span="2"></el-col>
<el-col :span="11">
<el-input maxlength="11"
width="100%"
class="ml-10 w-200"
clearable
v-model.number="queryParams.memberMobile"
:placeholder="$t('请输入会员电话')"/>
</el-col>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="number">
<el-input
v-model.trim="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员名称')" prop="name">
<el-input
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <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-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button>
...@@ -180,6 +210,7 @@ import {getCreditPage} from "@/api/customer/credit"; ...@@ -180,6 +210,7 @@ import {getCreditPage} from "@/api/customer/credit";
import transferCustomer from "@/views/ecw/customer/transferCustomer"; import transferCustomer from "@/views/ecw/customer/transferCustomer";
import Template from "@/views/cms/template/index.vue"; import Template from "@/views/cms/template/index.vue";
import Contacts from "@/views/ecw/customer/components/contacts.vue"; import Contacts from "@/views/ecw/customer/components/contacts.vue";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
export default { export default {
name: "EcwCustomertobeassignedIndex", name: "EcwCustomertobeassignedIndex",
activated() { activated() {
...@@ -189,7 +220,8 @@ export default { ...@@ -189,7 +220,8 @@ export default {
Contacts, Contacts,
Template, Template,
upload, upload,
transferCustomer transferCustomer,
AreaCodeSelector
}, },
data() { data() {
return { return {
...@@ -201,7 +233,7 @@ export default { ...@@ -201,7 +233,7 @@ export default {
// 导出遮罩层 // 导出遮罩层
exportLoading: false, exportLoading: false,
// 显示搜索条件 // 显示搜索条件
showSearch: true, showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// 客户列表 // 客户列表
...@@ -226,6 +258,10 @@ export default { ...@@ -226,6 +258,10 @@ export default {
creditLevel:null, creditLevel:null,
country:null, country:null,
marketType:null, marketType:null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}, },
// 表单参数 // 表单参数
form: {}, form: {},
...@@ -357,6 +393,10 @@ export default { ...@@ -357,6 +393,10 @@ export default {
department: null, department: null,
creditLevel:null, creditLevel:null,
country:null, country:null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
} }
this.handleQuery(); this.handleQuery();
}, },
......
<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"
v-show="showSearch"
: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-row class="mb8">
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="handleQueryPagination"
></right-toolbar>
</el-row>
<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: [],
// 显示搜索条件
showSearch: true,
queryParams: {
country: null,
city: null,
endTime: "",
holdScore: null,
holdScoreOperate: null,
key: "",
pageNo: 1,
pageSize: 10,
startTime: "",
usedScore: null,
usedScoreOperate: null,
},
};
},
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) {
if (id) {
let params = {
id: id,
};
getCityList(params).then((res) => {
this.cityList = res.data;
});
} else {
this.cityList = [];
}
},
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>
<template>
<div class="app-container">
<el-button type="success" @click="handleSelectMember">
{{ $t("添加会员") }}</el-button
>
<div class="container">
<div v-if="memberList.length > 0">
<div
class="formBox"
v-for="(item, index) in queryParamsList"
:key="item.memberId"
>
<el-form
:model="queryParamsList[index]"
:ref="`queryForm${item.memberId}`"
size="small"
:inline="true"
:rules="rules"
label-width="168px"
>
<el-card class="box-card">
<div slot="header" class="clearfix">
<el-row :gutter="10">
<span class="card-title">{{ $t("基础信息") }}</span>
<el-button
style="padding: 0 10px"
@click="handleExpand(item)"
type="text"
>{{ item.expand ? $t("收起") : $t("展开")
}}<i
:class="
item.expand
? 'el-icon-caret-top'
: 'el-icon-caret-bottom'
"
></i
></el-button>
<el-button
type="text"
@click="handleDelete(index, item)"
class="del-btn"
>{{ $t("删除") }}</el-button
>
</el-row>
<el-row :gutter="10">
<el-form-item :label="$t('会员名称')">
<el-input
:placeholder="$t('请输入会员名称')"
clearable
:disabled="true"
v-model="item.memberName"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('当前积分')">
<el-input
:placeholder="$t('请输入当前积分')"
clearable
:disabled="true"
v-model="item.holdScore"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('礼品选择')">
<el-input
:placeholder="$t('请选择礼品')"
clearable
:disabled="true"
v-model="item.rewardName"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('礼品积分')">
<el-input
:placeholder="$t('请输入礼品积分')"
clearable
:disabled="true"
v-model="item.pointsRequire"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换数量')" prop="rewardCount">
<el-input
:placeholder="$t('请输入兑换数量')"
clearable
v-model.number="item.rewardCount"
@change="
(val) => {
handleRewardCount(item, index, val);
}
"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('本次兑换积分')">
<el-input
:placeholder="$t('请输入本次兑换积分')"
clearable
:disabled="true"
v-model="item.spendCredit"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换后剩余积分')">
<el-input
:placeholder="$t('兑换后剩余积分')"
clearable
:disabled="true"
v-model="item.remainingPoints"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
</el-row>
<el-row :gutter="10" v-show="item.expand">
<el-row>
<span class="card-title">{{ $t("详细信息") }}</span>
</el-row>
<el-row>
<el-form-item :label="$t('兑换方式')" prop="redeemType">
<dict-selector
clearable
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="item.redeemType"
@change="handleRedeemType(item)"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('兑换入口')">
<dict-selector
clearable
:disabled="true"
v-model="item.entrance"
:type="DICT_TYPE.PLATFORM_TYPE"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('费用')" required>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item prop="expenses">
<el-input
v-model="item.expenses"
:placeholder="$t('请输入数字')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item prop="currency">
<el-select
v-model="item.currency"
:placeholder="$t('请选择币种')"
>
<el-option
v-for="nodeItem in currencyList"
:key="nodeItem.id"
:label="
isChinese
? nodeItem.titleZh
: nodeItem.titleEn
"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item :label="$t('收件人姓名')" prop="recipientName"
><el-input
:placeholder="$t('请输入收件人姓名')"
clearable
v-model="item.recipientName"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('收件人电话')"
prop="recipientPhoneNum"
>
<el-input
:placeholder="$t('请输入收件人电话')"
clearable
v-model="item.recipientPhoneNum"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('收件人地址')"
prop="recipientAddress"
v-if="item.redeemType != '1'"
>
<el-input
:placeholder="$t('请输入收件人地址')"
clearable
v-model="item.recipientAddress"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换人')">
<el-input
:placeholder="$t('请输入兑换人')"
clearable
v-model="item.redeemer"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换时间')">
<el-date-picker
type="date"
placement="bottom-start"
value-format="yyyy-MM-dd HH:mm:ss"
:placeholder="$t('选择兑换时间')"
v-model="item.redemptionTime"
></el-date-picker>
</el-form-item>
<el-form-item
:label="$t('快递公司')"
v-if="item.redeemType != '1'"
>
<el-select
v-model="item.courierCompany"
:placeholder="$t('请选择快递公司')"
>
<el-option
v-for="nodeItem in expressList"
:key="nodeItem.id"
:label="nodeItem.companyName"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('快递单号')"
v-if="item.redeemType != '1'"
>
<el-input
:placeholder="$t('请输入快递单号')"
clearable
v-model="item.expressNo"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('快递日期')"
v-if="item.redeemType != '1'"
>
<el-date-picker
type="date"
:placeholder="$t('选择快递日期')"
v-model="item.expressDate"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
<el-form-item :label="$t('快递寄出人')">
<el-input
:placeholder="$t('请输入快递寄出人')"
clearable
v-model="item.expressSender"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('上传附件')">
<file-upload v-model="item.annex"></file-upload>
</el-form-item>
<el-form-item :label="$t('备注')">
<el-input
style="width: 500px"
type="textarea"
v-model="item.remark"
></el-input>
</el-form-item>
</el-row>
</el-row>
</div>
</el-card>
</el-form>
</div>
</div>
<div v-else class="emptyText">
{{ $t("请先添加准备兑换礼品的会员") }}
</div>
<el-row justify="end" :gutter="20" type="flex" class="handleButton">
<el-col :span="2">
<el-button
v-if="memberList.length > 0"
type="primary"
@click="handleBulkConversion"
>{{ $t("确认兑换") }}</el-button
>
</el-col>
<el-col :span="2">
<el-button @click="handleBack">{{ $t("返回") }}</el-button>
</el-col>
</el-row>
</div>
<choose-Member
:dialogVisible.sync="dialogVisible"
@transferSelectMemberInfo="onGetSelectMemberInfo"
:memberSelectList="memberList"
>
</choose-Member>
</div>
</template>
<script>
import { getRewardsDetails, bulkConversion } from "@/api/ecw/giftManagement";
import FileUpload from "@/components/FileUpload";
import chooseMember from "./components/chooseMember.vue";
import { getExpressPage } from "@/api/ecw/express";
import { getCurrencyList } from "@/api/ecw/currency";
import { getNowDateTime } from "@/utils/ruoyi";
import { handleError } from "@vue/runtime-dom";
export default {
name: "giftManagementList",
components: {
chooseMember,
FileUpload,
},
data() {
var validatePass2 = (rule, value, callback) => {
if (!this.quantityComputation) {
return callback(
new Error(this.$t("兑换积分大于当前总积分,请重新输入兑换数量"))
);
} else {
return callback();
}
};
return {
env: process.env.NODE_ENV,
// 是否显示弹出层
dialogVisible: false,
// 查询参数
queryParamsList: [],
// 网点
nodeList: [],
//快递公司列表
expressList: [],
memberList: [],
currencyList: [],
quantityComputation: null,
checkFormResult: [],
rules: {
rewardCount: [
{
required: true,
message: this.$t("请输入兑换数量"),
trigger: "blur",
},
{
validator: validatePass2,
trigger: "blur",
},
],
expenses: [
{
required: true,
message: this.$t("请输入费用"),
trigger: "blur",
},
{
pattern: /^\d+(\.\d{1,2})?$/,
message: this.$t("请输入整数或保留小数点后两位"),
trigger: "blur",
},
],
currency: [
{
required: true,
message: this.$t("请选择币种"),
trigger: "change",
},
],
redeemType: [
{
required: true,
message: this.$t("请选择兑换方式"),
trigger: "change",
},
],
recipientName: [
{
required: true,
message: this.$t("请输入收件人姓名"),
trigger: "blur",
},
],
recipientPhoneNum: [
{
required: true,
message: this.$t("请输入收件人电话"),
trigger: "blur",
},
],
recipientAddress: [
{
required: true,
message: this.$t("请输入收件人地址"),
trigger: "blur",
},
],
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.getRewardsDetailsAPI();
this.getExpressList();
this.currencyListAPI();
},
activated() {},
methods: {
handleRedeemType(item) {
this.$nextTick(() => {
// queryForm${item.memberId}
this.$refs[`queryForm${item.memberId}`][0].clearValidate();
});
},
handleRewardCount(item, index, value) {
this.queryParamsList[index].spendCredit =
this.queryParamsList[index].pointsRequire * value;
this.queryParamsList[index].remainingPoints =
this.queryParamsList[index].holdScore -
this.queryParamsList[index].spendCredit;
this.quantityComputation =
this.queryParamsList[index].remainingPoints >= 0 ? true : false;
},
handleDelete(index, item) {
this.$modal
.confirm(this.$t("是否确认删除此数据"))
.then(() => {
this.queryParamsList.splice(index, 1);
this.memberList = this.memberList.filter(
(res) => res.id != item.memberId
);
this.$modal.msgSuccess(this.$t("删除成功"));
})
.catch(() => {});
},
handleExpand(item) {
this.queryParamsList.forEach((element) => {
if (element.memberId == item.memberId) {
element.expand = !item.expand;
}
});
},
currencyListAPI() {
getCurrencyList().then((res) => {
this.currencyList = res.data;
});
},
onGetSelectMemberInfo(data) {
if (data.length > 0) {
data.filter((item) => {
let inculde = this.queryParamsList.some((itemQuery) => {
return item.id == itemQuery.memberId;
});
if (!inculde) {
let queryParams = {
expand: true,
memberId: item.id,
holdScore: item.holdScore,
rewardId: this.rewardsDetails.id,
pointsRequire: this.rewardsDetails.pointsRequire,
rewardCount: null,
spendCredit: null, //本次兑换花费积分
remainingPoints: null, //剩余积分
redeemType: null,
entrance: 1,
expenses: null,
currency: null,
recipientName: null,
recipientPhoneNum: null,
recipientAddress: null,
redeemer: this.$store.getters.name,
redemptionTime: getNowDateTime("00:00:00"),
courierCompany: null,
expressNo: null,
expressSender: this.$store.getters.name,
expressDate: null,
remark: null,
annex: null,
};
if (this.isChinese) {
queryParams.memberName = item.memberNameZh;
queryParams.rewardName = this.rewardsDetails.titleZh;
} else {
queryParams.memberName = item.memberNameEn;
queryParams.rewardName = this.rewardsDetails.titleEn;
}
this.memberList.push(item);
this.queryParamsList.push({ ...queryParams });
}
});
}
},
handleSelectMember() {
this.dialogVisible = true;
},
getExpressList() {
let params = {
pageNo: 1,
pageSize: 1000,
};
getExpressPage(params).then((res) => {
this.expressList = res.data.list;
});
},
getRewardsDetailsAPI() {
let params = {
id: this.$route.query.rewardsID,
};
getRewardsDetails(params).then((res) => {
this.rewardsDetails = res.data;
});
},
handleBack() {
this.$store.dispatch("tagsView/delCurrentView");
},
checkForm(formName) {
const result = new Promise((resolve, reject) => {
this.$refs[formName][0].validate((valid) => {
if (valid) {
resolve();
} else {
reject();
}
});
});
this.checkFormResult.push(result);
},
handleBulkConversion() {
this.queryParamsList.forEach((element) => {
this.checkForm(`queryForm${element.memberId}`);
});
Promise.all(this.checkFormResult)
.then((res) => {
this.checkFormResult = [];
let params = this.queryParamsList.map((item) => {
if (item.redeemType == "1") {
let {
recipientAddress,
expressNo,
expressDate,
courierCompany,
...itemNew
} = item;
return itemNew;
} else {
return item;
}
});
bulkConversion(params).then((res) => {
if (res.code == "0") {
this.queryParamsList = [];
this.memberList = [];
this.$message.success(this.$t("兑换成功"));
}
});
})
.catch(() => {
this.checkFormResult = [];
this.$message.error(this.$t("兑换失败,请填写必要的信息"));
});
},
},
};
</script>
<style scoped lang="scss">
.card-title {
padding-right: 10px;
border-right: 4px solid rgb(64, 158, 255);
font-size: 16px;
font-weight: 600;
}
.del-btn {
color: red;
}
.app-container .el-date-editor.el-input,
.el-date-editor.el-input__inner {
width: 194px;
}
.container {
padding: 20px 0;
}
.emptyText {
font-size: 20px;
padding: 20px;
line-height: 200px;
text-align: center;
color: #97a8be;
}
.handleButton {
padding-right: 160px;
margin-top: 50px;
button {
width: 100%;
}
}
</style>
<template>
<el-dialog :title="$t(titleLabel)" :visible="show" @close="close" width="80%">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:rules="rules"
label-width="120px"
>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item :label="$t('中文礼品名称')" prop="titleZh">
<el-input
v-model.trim="queryParams.titleZh"
:placeholder="$t('请输入')"
:disabled="isDisable"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('英文礼品名称')" prop="titleEn">
<el-input
v-model.trim="queryParams.titleEn"
:disabled="isDisable"
:placeholder="$t('请输入')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item :label="$t('中文礼品图片')" prop="number">
<image-upload
v-model="queryParams.imgZh"
:isShowEditButton="!isDisable"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('英文礼品图片')" prop="number">
<image-upload
v-model="queryParams.imgEn"
:isShowEditButton="!isDisable"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" v-for="(item, index) in queryParams.nodeIds">
<el-col :span="6">
<el-form-item
:label="$t('兑换网点')"
:prop="'nodeIds.' + index + '.nodeId'"
:rules="rules.nodeIds.nodeId"
>
<el-select
v-model="item.nodeId"
:placeholder="$t('请选择兑换网点')"
:disabled="isDisable"
clearable
size="small"
>
<el-option
v-for="nodeItem in nodeList"
:key="nodeItem.id"
:label="isChinese ? nodeItem.titleZh : nodeItem.titleEn"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
:label="$t('兑换积分')"
:prop="'nodeIds.' + index + 'points'"
:rules="rules.nodeIds.points"
>
<el-input
v-model.trim="item.points"
:placeholder="$t('请输入')"
:disabled="isDisable"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/> </el-form-item
></el-col>
<el-col :span="1">
<el-button
type="primary"
:icon="index == '0' ? 'el-icon-plus' : 'el-icon-minus'"
@click="handleOrderVRule(item, index)"
></el-button>
</el-col>
</el-row>
<el-form-item :label="$t('剩余数量')" prop="quantityRemain">
<el-input
:disabled="isDisable && disabelEnableStatus"
v-model.trim="queryParams.quantityRemain"
:placeholder="$t('请输入')"
type="number"
/>
</el-form-item>
<el-form-item :label="$t('活动时间')" prop="dateRangeCreateTime">
<el-date-picker
:disabled="isDisable"
type="daterange"
clearable
placement="bottom-start"
v-model="queryParams.dateRangeCreateTime"
style="width: 400px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</el-form-item>
<el-form-item :label="$t('领取方式')" prop="pickMethod">
<dict-selector
clearable
multiple
:disabled="isDisable"
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="queryParams.pickMethod"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('允许兑换次数')" prop="allowCount">
<el-input
v-model.trim="queryParams.allowCount"
:placeholder="$t('请输入')"
clearable
:disabled="isDisable"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item :label="$t('中文备注')" prop="remarkZh">
<el-input
type="textarea"
:disabled="isDisable && disabelEnableStatus"
height="100"
v-model="queryParams.remarkZh"
:placeholder="$t('请输入')"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('英文备注')" prop="remarkEn">
<el-input
type="textarea"
:disabled="isDisable && disabelEnableStatus"
v-model="queryParams.remarkEn"
:placeholder="$t('请输入')"
></el-input>
</el-form-item>
</el-col>
</el-row>
<div>
<el-form-item :label="$t('是否启用')" prop="status" v-if="title == '3'">
<el-radio-group v-model="queryParams.status" :disabled="isDisable">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.GIFT_ENABLE_STATUS)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('状态')" prop="status" v-else>
<el-radio-group v-model="queryParams.status" :disabled="isDisable">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.GIFT_STATUS)"
:key="dict.value"
:label="Number(dict.value)"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
</div>
</el-form>
<div
slot="footer"
class="dialog-footer"
v-if="!isDisable || !disabelEnableStatus"
>
<el-button @click="close">{{ $t("取 消") }}</el-button>
<el-button type="primary" @click="submit">{{ $t("确 定") }}</el-button>
</div>
</el-dialog>
</template>
<script>
import { editRewards, addRewards } from "@/api/ecw/giftManagement";
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import imageUpload from "@/components/ImageUpload";
import { parseTime, resetForm } from "../../../../utils/ruoyi";
import { deepClone } from "@/utils";
export default {
name: "operatingGift",
props: {
title: {
type: String,
default: "",
},
show: {
type: Boolean,
default: false,
},
rewardsDetails: {
type: Object,
default: () => {
return this.queryParams;
},
},
nodeList: {
type: Array,
default: () => [],
},
},
components: {
imageUpload,
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
isDisable() {
let disableStatus = false;
switch (this.title) {
case "1":
disableStatus = true;
this.disabelEnableStatus = true;
break;
case "2":
if (this.queryParams.status == "2") {
disableStatus = false;
this.disabelEnableStatus = true;
} else if (this.queryParams.status == "1") {
disableStatus = true;
this.disabelEnableStatus = false;
} else {
disableStatus = true;
this.disabelEnableStatus = true;
}
break;
case "3":
disableStatus = false;
break;
}
return disableStatus;
},
titleLabel() {
let titleLabelText = "";
switch (this.title) {
case "1":
titleLabelText = this.$t("查看礼品");
break;
case "2":
titleLabelText = this.$t("编辑礼品");
break;
case "3":
this.resetFormQuery();
titleLabelText = this.$t("新增礼品");
break;
}
return titleLabelText;
},
},
watch: {
rewardsDetails(newVal, oldVal) {
if (JSON.stringify(newVal) != "{}") {
this.queryParams = deepClone(newVal);
this.queryParams.dateRangeCreateTime = [
parseTime(newVal.startTime),
parseTime(newVal.endTime),
];
this.queryParams.pickMethod = newVal.pickMethod.split(",");
} else {
this.resetFormQuery();
this.$refs["queryForm"].resetFields();
console.log("Prop is empty");
}
},
},
data() {
return {
queryParams: {
allowCount: null,
endTime: null,
imgEn: null,
imgZh: null,
nodeIds: [{ nodeId: "", points: "" }],
nodeId: null,
pickMethod: null,
pointsRequire: null,
quantityRemain: null,
remarkEn: null,
remarkFr: null,
remarkZh: null,
startTime: null,
status: null,
titleEn: null,
titleZh: null,
dateRangeCreateTime: null,
},
disabelEnableStatus: false,
rules: {
titleZh: [
{
required: true,
message: this.$t("请输入中文礼品名称"),
trigger: "blur",
},
{
min: 0,
max: 50,
message: this.$t("长度在 0 到 50 个字符"),
trigger: "blur",
},
],
titleEn: [
{
required: true,
message: this.$t("请输入英文礼品名称"),
trigger: "blur",
},
{
min: 0,
max: 50,
message: this.$t("长度在 0 到 50 个字符"),
trigger: "blur",
},
],
nodeIds: {
nodeId: [
{
required: true,
message: this.$t("请选择网点"),
trigger: "change",
},
],
points: [
{
required: true,
message: this.$t("请输入兑换积分"),
trigger: "blur",
},
],
},
quantityRemain: [
{
required: true,
message: this.$t("请输入剩余数量"),
trigger: "blur",
},
],
pickMethod: [
{
required: true,
message: this.$t("请选择领取方式"),
trigger: "change",
},
],
allowCount: [
{
required: true,
message: this.$t("请输入允许兑换次数"),
trigger: "blur",
},
],
remarkZh: [
{
min: 0,
max: 500,
message: this.$t("长度在 0 到 500 个字符"),
trigger: "blur",
},
],
remarkEn: [
{
min: 0,
max: 500,
message: this.$t("长度在 0 到 500 个字符"),
trigger: "blur",
},
],
status: [
{
required: true,
message: this.$t("请选择是否启用"),
trigger: "change",
},
],
},
};
},
methods: {
handleOrderVRule(item, index) {
if (index == "0") {
this.queryParams.nodeIds.push({ nodeId: "", points: "" });
} else {
this.queryParams.nodeIds.splice(index, 1);
}
},
submit() {
let params = { ...this.queryParams };
params.startTime = this.queryParams.dateRangeCreateTime[0];
params.endTime = this.queryParams.dateRangeCreateTime[1];
params.pickMethod = this.queryParams.pickMethod.toString();
this.$refs["queryForm"].validate((valid) => {
if (this.title == "2") {
editRewards(params).then((res) => {
this.$emit("update:show", false);
this.$message.success(this.$t("编辑成功"));
this.$refs["queryForm"].resetFields();
this.$parent.getList();
});
} else {
//Add
addRewards(params).then((res) => {
this.$emit("update:show", false);
this.$message.success(this.$t("成功"));
this.$refs["queryForm"].resetFields();
});
}
});
},
close() {
this.$emit("update:show", false);
},
resetFormQuery() {
this.queryParams = {
allowCount: null,
endTime: null,
nodeIds: [{ nodeId: "", points: "" }],
imgEn: null,
imgZh: null,
nodeId: null,
pickMethod: null,
pointsRequire: null,
quantityRemain: null,
remarkEn: null,
remarkFr: null,
remarkZh: null,
startTime: null,
status: null,
titleEn: null,
titleZh: null,
dateRangeCreateTime: null,
};
},
},
};
</script>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('礼品名称')">
<el-input
v-model.trim="queryParams.title"
: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-row :gutter="10">
<el-col :span="8">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.pointsRequireSymbol"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="16">
<el-input
v-model.trim="queryParams.pointsRequire"
: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('领取方式')" prop="level">
<dict-selector
clearable
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="queryParams.pickMethod"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('兑换网点')" prop="level">
<el-select
v-model="queryParams.nodeId"
:placeholder="$t('请选择兑换网点')"
clearable
size="small"
@change="handleQuery"
>
<el-option
v-for="nodeItem in nodeList"
:key="nodeItem.id"
:label="isChinese ? nodeItem.titleZh : nodeItem.titleEn"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('状态')" prop="level">
<dict-selector
clearable
:type="DICT_TYPE.GIFT_STATUS"
v-model="queryParams.status"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('备注')" prop="level">
<el-input
v-model.trim="queryParams.remark"
: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-row :gutter="10">
<el-col :span="8">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.quantityRemainSymbol"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="16">
<el-input
v-model.trim="queryParams.quantityRemain"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</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-row class="mb8">
<el-button
type="success"
size="mini"
icon="el-icon-plus"
@click="handleAddReward"
v-hasPermi="['ecw:giftManagement:add']"
>{{ $t("添加礼品") }}</el-button
>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 礼品列表 -->
<el-table ref="multipleTable" v-loading="loading" :data="list">
<el-table-column
width="140"
:label="$t('礼品ID')"
align="center"
prop="code"
></el-table-column>
<el-table-column :label="$t('礼品名称')" align="center">
<template slot-scope="scope">
<el-button type="text" @click="handleView(scope.row)">{{
isChinese ? scope.row.titleZh : scope.row.titleEn
}}</el-button>
</template>
</el-table-column>
<el-table-column :label="$t('图片')">
<template slot-scope="scope">
<el-image
:src="firstImg(isChinese ? scope.row.imgZh : scope.row.imgEn)"
style="width: 50px; height: 50px"
>{{ $t("") }}</el-image
>
</template>
</el-table-column>
<el-table-column width="100" :label="$t('开始日期')">
<template v-slot="{ row }">
{{ parseTime(row.startTime, "{y}-{m}-{d}") || "/" }}
</template>
</el-table-column>
<el-table-column width="100" :label="$t('结束日期')">
<template v-slot="{ row }">
{{ parseTime(row.endTime, "{y}-{m}-{d}") || "/" }}
</template>
</el-table-column>
<el-table-column
:label="$t('兑换积分')"
prop="pointsRequire"
></el-table-column>
<el-table-column :label="$t('领取方式')" align="center" prop="pickMethod">
<template v-slot="{ row }">
{{ handlePickMethod(row.pickMethod) }}
</template>
</el-table-column>
<el-table-column :label="$t('兑换网点')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeNodeId(row.nodeId).titleZh
: handleExchangeNodeId(row.nodeId).titleEn
}}
</template>
</el-table-column>
<el-table-column
:label="$t('允许兑换次数')"
align="center"
prop="allowCount"
></el-table-column>
<el-table-column :label="$t('状态')">
<template slot-scope="{ row }">
{{
isChinese
? handleRewardsStatus(row.status).label
: handleRewardsStatus(row.status).labelEn
}}
</template>
</el-table-column>
<el-table-column :label="$t('备注')" align="center" width="200">
<template slot-scope="{ row }">
<el-tooltip
popper-class="rewardstToolTip"
:content="isChinese ? row.remarkZh : remarkEn"
placement="top"
>
<div
style="
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
"
>
{{ isChinese ? row.remarkZh : remarkEn }}
</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column :label="$t('已兑换次数')" align="center">
<template slot-scope="scope">
<el-button
type="text"
@click="$router.push('/memberManagement/exchangeRecord')"
>{{ scope.row.exchangeCount }}</el-button
>
</template>
</el-table-column>
<el-table-column
:label="$t('剩余次数')"
align="center"
prop="quantityRemain"
></el-table-column>
<el-table-column
width="220px"
align="center"
:label="$t('操作')"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleView(scope.row)"
v-hasPermi="['ecw:giftManagement:check']"
>{{ $t("查看") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleCloseStatus(scope.row)"
:disabled="scope.row.status == '2'"
v-hasPermi="['ecw:giftManagement:close']"
>{{ $t("关闭") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="copyRewards(scope.row)"
v-hasPermi="['ecw:giftManagement:copy']"
>{{ $t("复制") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handlePostpone(scope.row)"
:disabled="scope.row.status != '1'"
v-hasPermi="['ecw:giftManagement:postpone']"
>{{ $t("延期") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
:disabled="scope.row.status != '2'"
v-hasPermi="['ecw:giftManagement:delete']"
>{{ $t("删除") }}</el-button
>
<el-button
size="mini"
v-has-permi="['ecw:giftManagement:edit']"
type="text"
:disabled="scope.row.status != '2' && scope.row.status != '1'"
icon="el-icon-collection"
@click="editRewards(scope.row)"
>{{ $t("编辑") }}</el-button
>
<el-button
size="mini"
v-has-permi="['ecw:giftManagement:enable']"
type="text"
icon="el-icon-user"
@click="handleLaunchRewards(scope.row)"
>{{ $t("启用") }}</el-button
>
<el-button
:disabled="scope.row.isInOpenSea"
v-has-permi="['ecw:giftManagement:exchange']"
size="mini"
type="text"
icon="el-icon-user"
@click="handleExchange(scope.row)"
>{{ $t("兑换") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.rows"
@pagination="getList"
/>
<!-- 查看 编辑 新增弹窗 -->
<operating-gift
ref="operatingGift"
:title="operatingPagetitle"
:rewardsDetails="rewardsItem"
:show.sync="dialogVisible"
:nodeList="nodeList"
>
</operating-gift>
<el-dialog
:title="$t('提示')"
:visible.sync="dialogPostponeVisible"
width="30%"
>
<el-row class="mb8">{{ $t("请选择延期时间") }}</el-row>
<el-date-picker
type="datetime"
clearable
v-model="postponeDatetime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions"
:placeholder="$t('请选择时间')"
></el-date-picker>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogPostponeVisible = false">{{
$t("取 消")
}}</el-button>
<el-button type="primary" @click="confirmPostponeRewards">{{
$t("确 定")
}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
getNodeList,
getGiftList,
deleteRewards,
copyRewardsAPI,
changeRewardsStatus,
delayRewards,
} from "@/api/ecw/giftManagement";
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import { parseTime } from "../../../utils/ruoyi";
import OperatingGift from "@/views/ecw/giftManagement/components/operatingGift.vue";
import { uploadFile } from "@/api/infra/file";
import ImageUpload from "@/components/ImageUpload";
export default {
name: "giftManagementList",
components: {
OperatingGift,
},
data() {
return {
env: process.env.NODE_ENV,
// 遮罩层
loading: true,
// 导出遮罩层
exportLoading: false,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 礼品列表
list: [],
// 弹出层标题
operatingPagetitle: "",
// 是否显示弹出层
dialogVisible: false,
rewardsItem: {},
dateRangeCreateTime: [],
postponeDatetime: "",
postponeRewardsID: "",
dialogPostponeVisible: false,
// 查询参数
queryParams: {
page: 1,
rows: 10,
title: null,
pointsRequire: null,
pointsRequireSymbol: null,
pickMethod: null,
nodeId: null,
status: null,
remark: null,
quantityRemainSymbol: null,
quantityRemain: null,
beginCreateTime: null,
endCreateTime: null,
},
// 网点
nodeList: [],
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now() - 8.64e7;
},
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.getList();
this.getNodeList();
},
activated() {
this.getList();
},
methods: {
arraysEqual(arr1, arr2) {
return arr1.filter((current) => {
return arr2.find((item) => item == current.value.toString())
? true
: false;
});
},
handleRewardsStatus(status) {
return this.getDictDatas(DICT_TYPE.GIFT_STATUS).filter(
(dicItem) => dicItem.value.toString() == status
)[0];
},
firstImg(imgString) {
if (!imgString || imgString == "") return imgString;
let imgs = imgString.split(",");
return imgs.length ? imgs[0] : null;
},
handlePickMethod(pickMethod) {
let pickMethodLabel = [];
if (this.isChinese) {
this.arraysEqual(
this.getDictDatas(DICT_TYPE.WAY_OF_RECEIVING),
pickMethod.split(",")
).forEach((element) => {
pickMethodLabel.push(element.label);
});
} else {
this.arraysEqual(
this.getDictDatas(DICT_TYPE.WAY_OF_RECEIVING),
pickMethod.split(",")
).forEach((element) => {
pickMethodLabel.push(element.labelEn);
});
}
return pickMethodLabel.join();
},
handleExchangeNodeId(nodeId) {
return this.nodeList.filter((nodeItem) => nodeItem.id == nodeId)[0];
},
handleAddReward() {
this.rewardsItem = {};
this.dialogVisible = true;
this.operatingPagetitle = "3";
},
handleExchange(row) {
this.$router.push({
path: "/giftManagement/bulkExchange",
query: { rewardsID: row.id },
});
},
/** 延期按钮操作 */
handlePostpone(row) {
this.postponeRewardsID = row.id;
this.dialogPostponeVisible = true;
},
confirmPostponeRewards() {
this.dialogPostponeVisible = false;
delayRewards({
id: this.postponeRewardsID,
endTime: this.postponeDatetime,
}).then((res) => {
this.getList();
this.$message.success(this.$t("延期成功"));
});
},
/** 关闭按钮操作 */
handleCloseStatus(row) {
this.$confirm(this.$t("是否关闭当前礼品?"), this.$t("提示"), {
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
})
.then((_) => {
return changeRewardsStatus({ id: row.id, status: "3" });
})
.then((res) => {
this.getList();
this.$message.success(this.$t("关闭成功"));
})
.catch((_) => {
// this.queryAllData();
});
},
//启用礼品状态
handleLaunchRewards(row) {
this.$confirm(this.$t("是否启用当前礼品?"), this.$t("提示"), {
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
})
.then(() => {
changeRewardsStatus({ id: row.id, status: "1" }).then((r) => {
this.$message.success(this.$t("启用成功"));
this.getList();
});
})
.catch(() => {});
},
getNodeList() {
getNodeList().then((res) => {
this.nodeList = res.data;
});
},
getList() {
this.loading = true;
// 处理查询参数
let params = { ...this.queryParams };
this.addBeginAndEndTime(
params,
this.dateRangeCreateTime,
"createTime",
false
);
getGiftList(params).then((res) => {
this.loading = false;
this.list = res.data.list;
this.total = res.data.total;
});
},
// 新增潜在客户
handleAddPotential() {
this.$refs.potentialCustom.dialogTableVisible = true;
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal
.confirm(this.$t("是否确认删除此礼品"))
.then(function () {
return deleteRewards({ id: row.id });
})
.then(() => {
this.getList();
this.$modal.msgSuccess(this.$t("删除成功"));
})
.catch(() => {});
},
/** 搜索按钮操作 */
handleQuery() {
this.$nextTick(() => {
this.queryParams.page = 1;
this.getList();
});
},
/** 查看按钮操作 */
handleView(row) {
this.dialogVisible = true;
this.operatingPagetitle = "1";
this.rewardsItem = row;
},
/** 编辑按钮操作 */
editRewards(row) {
this.dialogVisible = true;
this.operatingPagetitle = "2";
this.rewardsItem = row;
},
/** 复制按钮操作 */
copyRewards(row) {
copyRewardsAPI(row.id).then((res) => {
this.$modal.msgSuccess(this.$t("复制成功"));
this.handleQuery();
});
},
/** 重置按钮操作 */
resetQuery() {
this.dateRangeCreateTime = [];
this.queryParams = {
page: 1,
rows: 10,
number: null,
name: null,
level: null,
source: null,
customerService: null,
status: null,
department: null,
creditLevel: null,
country: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null,
};
this.handleQuery();
},
},
};
</script>
<style>
.rewardstToolTip {
max-width: 90%;
}
</style>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:rules="rules"
:disabled="showViewTime"
label-width="120px"
>
<el-form-item :label="$t('指标类型')" prop="type">
<dict-selector
clearable
:type="DICT_TYPE.SCORE_RULE_TYPE"
v-model="queryParams.type"
>
</dict-selector>
</el-form-item>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item :label="$t('中文标题')" prop="titleZh">
<el-input
style="width: 300px"
v-model.trim="queryParams.titleZh"
:placeholder="$t('请输入查找')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
<el-button
size="mini"
type="text"
style="margin-left: 10px"
v-if="queryParams.type == '4' && !showViewTime"
@click="handleSelectBannerDialog()"
>{{ $t("选择") }}</el-button
>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('英文标题')" prop="titleEn">
<el-input
style="width: 300px"
v-model.trim="queryParams.titleEn"
:placeholder="$t('请输入查找')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/> </el-form-item
></el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item :label="$t('中文封面图')" prop="coverImageZh">
<image-upload v-model="queryParams.coverImageZh" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('英文封面图')" prop="coverImageEn">
<image-upload v-model="queryParams.coverImageEn" />
</el-form-item>
</el-col>
</el-row>
<!--分享活动内容 -->
<el-form-item
:label="$t('中文活动内容')"
prop="extraShare.activityDescZh"
v-if="queryParams.type == '4'"
>
<editor
:readOnly="showViewTime"
:class="{ readOnlyEditor: showViewTime }"
v-model="queryParams.extraShare.activityDescZh"
:min-height="150"
/>
</el-form-item>
<el-form-item
:label="$t('英文活动内容')"
prop="extraShare.activityDescEn"
v-if="queryParams.type == '4'"
>
<editor
:class="{ readOnlyEditor: showViewTime }"
:readOnly="showViewTime"
v-model="queryParams.extraShare.activityDescEn"
:min-height="150"
/>
</el-form-item>
<!-- 链接 -->
<el-form-item :label="$t('活动链接')" v-if="queryParams.type == '4'">
<el-input
v-model="queryParams.extraShare.activityUrl"
:placeholder="$t('请输入活动链接')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<!-- 推荐分享文案 -->
<el-row :gutter="10" v-if="queryParams.type == '3'">
<el-col :span="12">
<el-form-item
:label="$t('中文分享文案 ')"
prop="extraRecommend.shareContentZh"
>
<el-input
type="textarea"
style="width: 300px"
v-model.trim="queryParams.extraRecommend.shareContentZh"
:placeholder="$t('请输入分享文案')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item
:label="$t('英文分享文案')"
prop="extraRecommend.shareContentEn"
>
<el-input
type="textarea"
style="width: 300px"
v-model.trim="queryParams.extraRecommend.shareContentEn"
:placeholder="$t('请输入分享文案')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/> </el-form-item
></el-col>
</el-row>
<el-form-item v-if="queryParams.type == '1'" :label="$t('首单')">
<el-radio-group v-model="queryParams.extraOrderV.firstOrder">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.YES_OR_NO)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
:label="$t('运输方式')"
v-if="queryParams.type == '1'"
prop="extraOrderV.transportType"
>
<dict-selector
clearable
:type="DICT_TYPE.TRANSPORT_TYPE"
v-model="queryParams.extraOrderV.transportType"
>
</dict-selector>
</el-form-item>
<el-form-item
:label="$t('提货点')"
v-if="queryParams.type == '1'"
prop="extraOrderV.receiveAddrList"
>
<el-cascader
v-if="cascaderState"
style="width: 400px"
:options="regionTreeList"
v-model="queryParams.extraOrderV.receiveAddrList"
:props="cascaderProps"
clearable
></el-cascader>
</el-form-item>
<el-form-item
:label="$t('渠道')"
v-if="queryParams.extraOrderV.transportType == '3'"
>
<el-select v-model="queryParams.channel" multiple placeholder="请选择">
<el-option
v-for="item in channelList"
:key="item.channelId"
:label="isChinese ? item.nameZh : item.nameEn"
:value="item.channelId"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
:label="$t('积分规则')"
v-if="queryParams.type == '1'"
required
>
<el-row
type="flex"
justify="start"
v-for="(item, index) in queryParams.extraOrderV.orderVRule"
>
<el-col :span="2">
<el-form-item
:prop="'extraOrderV.orderVRule.' + index + '.low'"
:rules="rules.extraOrderV.orderVRule.low"
>
<el-input
style="width: 100px"
v-model.number="item.low"
></el-input
></el-form-item>
</el-col>
<el-col :span="1">
{{ queryParams.extraOrderV.transportType == "3" ? "kg" : "" }}
{{ $t("") }}
</el-col>
<el-col :span="2">
<el-form-item
:prop="'extraOrderV.orderVRule.' + index + '.high'"
:rules="rules.extraOrderV.orderVRule.high"
>
<el-input
style="width: 100px"
v-model.number="item.high"
></el-input> </el-form-item
></el-col>
<el-col :span="1">
{{ queryParams.extraOrderV.transportType == "3" ? "kg" : "" }} =
</el-col>
<el-col :span="2">
<el-form-item
:prop="'extraOrderV.orderVRule.' + index + '.score'"
:rules="rules.extraOrderV.orderVRule.score"
><el-input
style="width: 100px"
v-model.number="item.score"
></el-input
></el-form-item>
</el-col>
<el-col :span="1">
{{ $t("积分") }}
</el-col>
<el-col :span="1">
<el-button
type="primary"
:icon="index == '0' ? 'el-icon-plus' : 'el-icon-minus'"
@click="handleOrderVRule(item, index)"
></el-button>
</el-col>
</el-row>
</el-form-item>
<!-- 除v值之外的积分规则 -->
<el-form-item
v-if="queryParams.type != '1'"
:label="$t('积分规则')"
prop="getScoreOnce"
>
<el-input
style="width: 300px"
v-model.number="queryParams.getScoreOnce"
:placeholder="$t('请输入数字')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item v-if="queryParams.type != '2'" :label="$t('累计最高积分')">
<el-input
style="width: 300px"
v-model.number="queryParams.maxScoreTotal"
:placeholder="$t('请输入累计最高积分')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
v-if="queryParams.type == '1'"
:label="$t('订单入口')"
prop="extraOrderV.orderEntry"
>
<dict-selector
clearable
:multiple="true"
:type="DICT_TYPE.PLATFORM_TYPE"
v-model="queryParams.extraOrderV.orderEntry"
>
</dict-selector>
</el-form-item>
<el-form-item
:label="$t('活动有效期')"
prop="dateRangeCreateTime"
:rules="rules.dateRangeCreateTime"
>
<el-date-picker
type="daterange"
clearable
placement="bottom-start"
v-model="queryParams.dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</el-form-item>
<el-form-item :label="$t('积分有效期')" prop="scorePeriod">
<el-input
v-model.number="queryParams.scorePeriod"
:placeholder="$t('请输入积分有效期天数')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('排序')" prop="orderNum">
<el-input
v-model.number="queryParams.orderNum"
:placeholder="$t('请输入排序')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item :label="$t('中文规则说明')" prop="descZh">
<el-input type="textarea" v-model="queryParams.descZh"></el-input>
</el-form-item>
<span class="del-btn">{{
$t("注:此说明用于展示给会员查看积分原因,请规范填写")
}}</span>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('英文规则说明')" prop="descEn">
<el-input type="textarea" v-model="queryParams.descEn"></el-input>
</el-form-item>
<span class="del-btn">{{
$t("注:此说明用于展示给会员查看积分原因,请规范填写")
}}</span>
</el-col>
</el-row>
<el-form-item :label="$t('是否推送')" prop="pushActivity">
<el-radio-group v-model="queryParams.pushActivity">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.YES_OR_NO)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('展示平台')">
<dict-selector
clearable
formType="checkbox"
:multiple="true"
:type="DICT_TYPE.PLATFORM_TYPE"
v-model="queryParams.showPlatform"
>
</dict-selector>
</el-form-item>
<el-form-item
v-if="queryParams.type == '2'"
:label="$t('注册平台')"
prop="extraRegister.registerPlatform"
>
<dict-selector
clearable
:multiple="true"
:type="DICT_TYPE.CLIENT_PLATFORM"
v-model="queryParams.extraRegister.registerPlatform"
>
</dict-selector>
</el-form-item>
<el-form-item
:label="$t('是否分享')"
prop="extraRecommend.shareStatus"
v-if="queryParams.type == '3'"
>
<el-radio-group v-model="queryParams.extraRecommend.shareStatus">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.YES_OR_NO)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
:label="$t('是否分享')"
prop="extraShare.shareStatus"
v-if="queryParams.type == '4'"
>
<el-radio-group v-model="queryParams.extraShare.shareStatus">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.YES_OR_NO)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<!-- 编辑相关内容 -->
<div v-if="showViewTime">
<el-form-item :label="$t('创建人')">
<el-input
v-model.number="queryParams.creator"
:placeholder="$t('请输入创建人')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('创建时间')">
<el-date-picker
type="date"
:placeholder="$t('选择创建时间')"
v-model="queryParams.createTime"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
<el-form-item :label="$t('最后更新人')">
<el-input
v-model.number="queryParams.updater"
:placeholder="$t('请输入最后更新人')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('最后更新时间')">
<el-date-picker
type="date"
:placeholder="$t('选择最后更新时间')"
v-model="queryParams.updateTime"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
</div>
</el-form>
<el-row justify="end" :gutter="20" type="flex">
<el-col :span="3" v-if="$route.query.pageStatus == 'new'">
<el-button
type="primary"
@click="handleSaveIntegralRule"
style="width: 100%"
>{{ $t("保存") }}</el-button
>
</el-col>
<el-col :span="3" v-if="$route.query.pageStatus == 'new'">
<el-button
type="primary"
style="width: 100%"
@click="handleEnableIntegralRule"
>{{ $t("保存并启用") }}</el-button
>
</el-col>
<el-col :span="3" v-if="$route.query.pageStatus == 'edit'">
<el-button
type="primary"
style="width: 100%"
@click="handleUpdatedIntegralRule"
>{{ $t("更新") }}</el-button
>
</el-col>
<el-col :span="3">
<el-button
type="primary"
style="width: 100%"
@click="handleResetIntegralRule"
>{{ $t("重置") }}</el-button
>
</el-col>
<el-col :span="3">
<el-button style="width: 100%" type="primary" @click="handleGoBack">{{
$t("返回")
}}</el-button>
</el-col>
</el-row>
<!-- 选择广告弹窗 -->
<el-dialog
:title="$t('选择广告')"
:visible.sync="dialogVisible"
width="50%"
>
<el-table v-loading="loading" :data="list">
<el-table-column label="" align="center" prop="id" />
<el-table-column :label="$t('标题')" align="center" prop="titleZh" />
<el-table-column
:label="$t('WEB端图片')"
align="center"
prop="bannerUrlWeb"
>
<template slot-scope="scope">
<el-image :src="scope.row.bannerUrlWeb"></el-image>
</template>
</el-table-column>
<el-table-column
:label="$t('APP端图片')"
align="center"
prop="bannerUrlApp"
>
<template slot-scope="scope">
<el-image :src="scope.row.bannerUrlApp"></el-image>
</template>
</el-table-column>
<el-table-column :label="$t('状态')" align="center" prop="status">
<template slot-scope="scope">
<span>{{ statusName(scope.row.status) }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('创建时间')"
align="center"
prop="createTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('操作')"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="handleSelectAdvertising(scope.row)"
>{{ $t("选择") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-dialog>
</div>
</template>
<script>
import { CommonStatusEnum } from "@/utils/constants";
import { getBannerPage } from "@/api/ecw/banner";
import Editor from "@/components/Editor";
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import {
getRegionTreeList,
getChannelList,
createIntegralRule,
integralRuleDetails,
integralRuleUpdated,
} from "@/api/ecw/memberManagement";
import { deepClone } from "@/utils/index";
import ImageUpload from "@/components/ImageUpload";
import { parseTime } from "@/utils/ruoyi";
import { isNumber } from "min-dash";
import { mergeWith } from "lodash";
export default {
name: "addIntegrationRuleOperation",
components: {
ImageUpload,
Editor,
},
data() {
const validatePass2 = (rule, value, callback) => {
const index = Number(rule.field.split(".")[2]);
if (index == "0") {
if (
this.queryParams.extraOrderV.orderVRule[index].low >=
this.queryParams.extraOrderV.orderVRule[index].high &&
this.queryParams.extraOrderV.orderVRule[index].high
) {
callback(this.$t("开始积分应小于本次最终积分"));
} else {
callback();
}
} else if (index > "0") {
if (
this.queryParams.extraOrderV.orderVRule[index].low >=
this.queryParams.extraOrderV.orderVRule[index].high &&
this.queryParams.extraOrderV.orderVRule[index].high
) {
callback(this.$t("开始积分应小于本次最终积分"));
} else if (
this.queryParams.extraOrderV.orderVRule[index].low <=
this.queryParams.extraOrderV.orderVRule[index - 1].high
) {
callback(this.$t("开始积分应大于上一次最终积分"));
} else {
callback();
}
} else {
callback();
}
};
const validatehigh = (rule, value, callback) => {
const index = Number(rule.field.split(".")[2]);
if (index == "0") {
if (
this.queryParams.extraOrderV.orderVRule[index].low &&
this.queryParams.extraOrderV.orderVRule[index].low >=
this.queryParams.extraOrderV.orderVRule[index].high
) {
callback(this.$t("本次最终积分应大于本次开始积分"));
} else if (
this.queryParams.extraOrderV.orderVRule[index + 1] &&
this.queryParams.extraOrderV.orderVRule[index + 1].low &&
this.queryParams.extraOrderV.orderVRule[index + 1].low <=
this.queryParams.extraOrderV.orderVRule[index].high
) {
callback(this.$t("本次最终积分应小于下一次开始积分"));
} else {
callback();
}
} else if (index > "0") {
if (
this.queryParams.extraOrderV.orderVRule[index].low &&
this.queryParams.extraOrderV.orderVRule[index].low >=
this.queryParams.extraOrderV.orderVRule[index].high
) {
callback(this.$t("本次最终积分应大于本次开始积分"));
} else if (
this.queryParams.extraOrderV.orderVRule[index].high <=
this.queryParams.extraOrderV.orderVRule[index + 1].low
) {
callback(this.$t("本次最终积分应小于下一次开始积分"));
} else {
callback();
}
} else {
callback();
}
};
return {
//查看显示时间详情
showViewTime: false,
CommonStatusEnum: CommonStatusEnum,
statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS),
loading: true,
total: 0,
// 广告设置列表
list: [],
queryadvertisingParams: {
pageNo: 1,
pageSize: 10,
titleZh: null,
titleEn: null,
contentZh: null,
contentEn: null,
bannerUrlWeb: null,
bannerUrlApp: null,
status: null,
},
cascaderState: true,
channelList: [],
regionTreeList: [],
dialogVisible: false,
rules: {
pushActivity: [
{
required: true,
message: this.$t("请选择是否推送"),
trigger: "change",
},
],
getScoreOnce: [
{
required: true,
message: this.$t("请输入积分规则"),
trigger: "blur",
},
{
type: "number",
message: this.$t("请输入整数"),
trigger: "blur",
},
],
descEn: [
{
required: true,
message: this.$t("请输入英文规则说明"),
trigger: "blur",
},
],
descZh: [
{
required: true,
message: this.$t("请输入中文规则说明"),
trigger: "blur",
},
],
titleZh: [
{
required: true,
message: this.$t("请输入中文标题"),
trigger: "blur",
},
],
titleEn: [
{
required: true,
message: this.$t("请输入中文标题"),
trigger: "blur",
},
],
orderNum: [
{
required: true,
message: this.$t("请输入排序"),
trigger: "blur",
},
{
type: "number",
message: this.$t("请输入整数"),
trigger: "blur",
},
],
scorePeriod: [
{
type: "number",
message: this.$t("请输入整数"),
trigger: "blur",
},
{
required: true,
message: this.$t("请输入积分有效天数"),
trigger: "blur",
},
],
type: [
{
required: true,
message: this.$t("请选择指标类型"),
trigger: "change",
},
],
dateRangeCreateTime: [
{
required: true,
message: this.$t("请选择活动有效期"),
trigger: "change",
},
],
//推荐
extraRecommend: {
shareContentEn: [
{
required: true,
message: this.$t("请输入分享文案"),
trigger: "blur",
},
],
shareContentZh: [
{
required: true,
message: this.$t("请输入分享文案"),
trigger: "blur",
},
],
shareStatus: [
{
required: true,
message: this.$t("请选择是否分享"),
trigger: "change",
},
],
},
//v值
extraOrderV: {
orderEntry: [
{ required: true, message: "请选择订单入口", trigger: "change" },
],
transportType: [
{ required: true, message: "请选择运输方式", trigger: "change" },
],
receiveAddrList: [
{ required: true, message: "请选择提货点", trigger: "change" },
],
orderVRule: {
low: [
{
required: true,
message: this.$t("不能为空"),
trigger: "blur",
},
{
type: "number",
message: this.$t("请输入整数"),
trigger: "blur",
},
{ validator: validatePass2, trigger: "blur" },
],
score: [
{
required: true,
message: this.$t("不能为空"),
trigger: "blur",
},
{
type: "number",
message: this.$t("请输入整数"),
trigger: "blur",
},
],
high: [
{
required: true,
message: this.$t("不能为空"),
trigger: "blur",
},
{
type: "number",
message: this.$t("请输入整数"),
trigger: "blur",
},
{ validator: validatehigh, trigger: "blur" },
],
},
},
//注册
extraRegister: {
registerPlatform: [
{
required: true,
message: this.$t("请选择注册平台"),
trigger: "change",
},
],
},
//分享
extraShare: {
activityDescEn: [
{
required: true,
message: this.$t("中文活动内容不能为空"),
trigger: "blur",
},
],
activityDescZh: [
{
required: true,
message: this.$t("英文活动内容不能为空"),
trigger: "blur",
},
],
shareStatus: [
{
required: true,
message: this.$t("请选择是否分享"),
trigger: "change",
},
],
},
},
queryParams: {
dateRangeCreateTime: [], //活动有效期
type: "", //指标类型
titleZh: "",
titleEn: "",
coverImageZh: "",
coverImageEn: "",
maxScoreTotal: "",
endTime: "",
startTime: "", //活动开始时间
scorePeriod: "", //积分有效期
orderNum: "", //排序
descZh: "",
pushActivity: "0", //是否推送(0是,1否)默认是
descEn: "",
getScoreOnce: "", //除v值之外的积分规则
showPlatform: "1,2,3", //展示平台
extraRecommend: {
//推荐
shareContentEn: "",
shareContentZh: "",
shareStatus: "0", //是否分享(0是,1否)默认是
},
extraRegister: {
// 注册扩展字段
registerPlatform: null,
},
extraOrderV: {
//订单V值扩展字段
firstOrder: "1",
orderEntry: null,
transportType: "", //运输方式
receiveAddrList: [],
orderVRule: [{ low: "", high: "", score: "" }],
},
extraShare: {
// 分享扩展字段
activityDescEn: null,
activityDescZh: null,
activityUrl: "",
shareStatus: "0",
},
},
};
},
computed: {
statusName() {
return (value) => {
for (let index in this.statusDictDatas) {
let dictItem = this.statusDictDatas[index];
if (dictItem.value == value) {
return dictItem.value == CommonStatusEnum.ENABLE + ""
? this.$t("正常")
: this.$t("禁用");
}
}
};
},
isChinese() {
return this.$i18n.locale === "zh_CN";
},
cascaderProps() {
const label = this.isChinese ? "labelZh" : "labelEn";
return { multiple: true, value: "id", label };
},
},
watch: {
"queryParams.dateRangeCreateTime": {
handler: function (newVal, oldVal) {
this.$nextTick(() => {
if (newVal.length) {
this.queryParams.startTime = newVal[0];
this.queryParams.endTime = newVal[1];
} else {
this.queryParams.startTime = "";
this.queryParams.endTime = "";
}
});
},
immediate: true,
},
isChinese: {
handler: function (newVal, oldVal) {
this.cascaderState = false;
this.$nextTick(() => {
this.cascaderState = true;
});
},
immediate: true,
},
},
created() {
this.handleGetChannelList();
this.handleGetRegionTreeList();
this.getList();
if (this.$route.query.pageStatus == "edit") {
this.handleIntegralRuleDetails();
}
if (this.$route.query.pageStatus == "view") {
this.showViewTime = true;
this.handleIntegralRuleDetails();
}
},
activated() {},
methods: {
//编辑更新积分规则
handleUpdatedIntegralRule() {
this.$refs["queryForm"].validate((valid) => {
if (valid) {
let params = deepClone(this.queryParams);
params.showPlatform = this.queryParams.showPlatform?.join();
params.extraOrderV.orderEntry =
this.queryParams.extraOrderV?.orderEntry?.join();
params.extraRegister.registerPlatform =
this.queryParams.extraRegister.registerPlatform?.join();
integralRuleUpdated(params).then((res) => {
this.$message.success(this.$t("更新成功"));
this.$router.go(-1);
});
} else {
console.log("error submit!!");
return false;
}
});
},
//获取积分规则详情
handleIntegralRuleDetails() {
this.queryParams.showPlatform = [];
integralRuleDetails({ id: this.$route.query.id }).then((res) => {
const params = mergeWith(
deepClone(this.queryParams),
res.data,
(a, b) => {
return b === null ? a : undefined;
}
);
params.createTime = parseTime(res.data.createTime);
params.updateTime = parseTime(res.data.updateTime);
if (isNumber(res.data.extraOrderV?.firstOrder)) {
params.extraOrderV.firstOrder =
res.data.extraOrderV?.firstOrder.toString();
}
if (isNumber(res.data.pushActivity)) {
params.pushActivity = res.data.pushActivity.toString();
}
if (isNumber(res.data.extraShare?.shareStatus)) {
params.extraShare.shareStatus =
params.extraShare.shareStatus.toString();
}
if (isNumber(res.data.extraRecommend?.shareStatus)) {
params.extraRecommend.shareStatus =
res.data.extraRecommend?.shareStatus.toString();
}
console.log(params);
params.dateRangeCreateTime = [
parseTime(res.data.startTime),
parseTime(res.data.endTime),
];
this.queryParams = { ...params };
});
},
handleSelectBannerDialog() {
this.dialogVisible = true;
},
handleSelectAdvertising(row) {
this.dialogVisible = false;
this.queryParams.titleZh = row.titleZh;
this.queryParams.titleEn = row.titleEn;
this.queryParams.coverImageZh = row.bannerUrlApp;
this.queryParams.coverImageEn = row.bannerUrlApp;
this.queryParams.extraShare.activityDescZh = row.contentEn;
this.queryParams.extraShare.activityDescEn = row.contentZh;
},
/** 查询列表 */
getList() {
this.loading = true;
// 处理查询参数
let params = { ...this.queryadvertisingParams };
getBannerPage(params).then((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
},
//重置按钮操作
handleResetIntegralRule() {
this.$modal
.confirm(this.$t("是否确认重置此礼品规则表单"), this.$t("提示"))
.then(() => {
this.$refs["queryForm"].resetFields();
this.$modal.msgSuccess(this.$t("重置成功"));
})
.catch(() => {});
},
//返回按钮操作
handleGoBack() {
this.$modal
.confirm(this.$t("是否确认返回"), this.$t("提示"))
.then(() => {
// this.$router.go(-1);
this.$store.dispatch("tagsView/delCurrentView");
this.$modal.msgSuccess(this.$t("成功"));
})
.catch(() => {});
},
//保存
handleSaveIntegralRule() {
this.$refs["queryForm"].validate((valid) => {
if (valid) {
let params = deepClone(this.queryParams);
params.showPlatform = this.queryParams.showPlatform?.join();
params.extraOrderV.orderEntry =
this.queryParams.extraOrderV?.orderEntry?.join();
params.extraRegister.registerPlatform =
this.queryParams.extraRegister.registerPlatform?.join();
params.status = this.queryParams.status || "2";
createIntegralRule(params).then((res) => {
this.$message.success(this.$t("成功"));
this.$router.go(-1);
});
} else {
console.log("error submit!!");
return false;
}
});
},
//保存并启用
handleEnableIntegralRule() {
this.$refs["queryForm"].validate((valid) => {
if (valid) {
let params = deepClone(this.queryParams);
params.showPlatform = this.queryParams.showPlatform?.join();
params.extraOrderV.orderEntry =
this.queryParams.extraOrderV.orderEntry?.join();
params.extraRegister.registerPlatform =
this.queryParams.extraRegister.registerPlatform?.join();
params.status = this.queryParams.status || "1";
createIntegralRule(params).then((res) => {
this.$message.success(this.$t("成功"));
this.$router.go(-1);
});
} else {
console.log("error submit!!");
return false;
}
});
},
handleOrderVRule(item, index) {
if (index == "0") {
this.queryParams.extraOrderV.orderVRule.push({
low: "",
high: "",
score: "",
});
} else {
this.queryParams.extraOrderV.orderVRule.splice(index, 1);
}
},
//获取渠道列表
handleGetChannelList() {
getChannelList().then((res) => {
this.channelList = res.data;
});
},
//获取目的仓列表
handleGetRegionTreeList() {
getRegionTreeList().then((res) => {
this.regionTreeList = res.data;
});
},
traverseTree(tree, newVal) {
for (let node of tree) {
node.labeluu = newVal ? node.labelZh : node.labelEn;
if (node.children && node.children.length > 0) {
this.traverseTree(node.children); // 递归遍历子节点
}
}
return tree;
},
//积分来源
handleSourceType(id) {
return this.getDictDatas(DICT_TYPE.SCORE_RULE_TYPE).filter(
(item) => item.value == id
)[0];
},
},
};
</script>
<style lang="scss" scoped>
.del-btn {
color: red;
padding-left: 120px;
}
.readOnlyEditor {
background-color: #f5f7fa;
cursor: not-allowed;
}
</style>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
v-show="showSearch"
:inline="true"
label-width="120px"
>
<el-form-item :label="$t('礼品名称')">
<el-input
style="width: 300px"
v-model.trim="queryParams.rewardTitle"
: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-input
style="width: 300px"
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员昵称')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换方式')">
<dict-selector
clearable
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="queryParams.redeemType"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('状态')">
<dict-selector
clearable
:type="DICT_TYPE.REWARD_REDEEM_STATUS"
v-model="queryParams.status"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('数量')">
<el-row :gutter="10" style="width: 300px">
<el-col :span="10">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.rewardCountOperate"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="14">
<el-input
v-model.trim="queryParams.rewardCount"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</el-form-item>
<el-form-item :label="$t('礼品ID')">
<el-input
style="width: 300px"
v-model.trim="queryParams.rewardCode"
:placeholder="$t('请输入礼品ID')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换入口')">
<dict-selector
clearable
:type="DICT_TYPE.PLATFORM_TYPE"
v-model="queryParams.entrance"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('兑换网点')">
<el-select
v-model="queryParams.nodeId"
:placeholder="$t('请选择兑换网点')"
clearable
size="small"
@change="handleQuery"
>
<el-option
v-for="nodeItem in nodeList"
: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-row class="mb8">
<el-button
type="success"
size="mini"
icon="el-icon-plus"
v-hasPermi="['ecw:memberManagement:newExchange']"
@click="handleNewExchange"
>{{ $t("新增兑换") }}</el-button
>
<el-button
type="success"
size="mini"
icon="el-icon-plus"
v-hasPermi="['ecw:memberManagement:batchWriteOff']"
@click="handleBatchVerify"
>{{ $t("批量核销") }}</el-button
>
<el-button
type="success"
size="mini"
icon="el-icon-plus"
@click="handleBatchExport"
v-hasPermi="['ecw:memberManagement:export']"
>{{ $t("导出") }}</el-button
>
<el-button
type="success"
size="mini"
icon="el-icon-plus"
@click="handleShowFileUploadDialog"
v-hasPermi="['ecw:memberManagement:exchangeoInfoImport']"
>{{ $t("兑换信息导入") }}</el-button
>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="handleQueryPagination"
></right-toolbar>
</el-row>
<el-table
ref="multipleTable"
v-loading="loading"
@selection-change="handleSelectionChange"
:data="memberList"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column
width="140"
:label="$t('兑换记录ID')"
align="center"
prop="id"
></el-table-column>
<el-table-column
width="140"
:label="$t('礼品ID')"
align="center"
prop="rewardCode"
></el-table-column>
<el-table-column
:label="$t('礼品名称')"
align="center"
:prop="isChinese ? 'rewardTitleZh' : 'rewardTitleEn'"
></el-table-column>
<el-table-column :label="$t('会员名称')" align="center">
<template v-slot="{ row }">
<el-button
type="text"
@click="
$router.push('/member/member/member-details/' + row.memberId)
"
>{{ isChinese ? row.memberNameZh : row.memberNameEn }}</el-button
>
</template>
</el-table-column>
<el-table-column :label="$t('兑换时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.redemptionTime) || "/" }}</template
>
</el-table-column>
<el-table-column
:label="$t('兑换积分')"
align="center"
prop="totalCount"
></el-table-column>
<el-table-column width="140" :label="$t('兑换入口')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeEntrance(row.entrance).label
: handleExchangeEntrance(row.entrance).labelEn
}}
</template>
</el-table-column>
<el-table-column
width="140"
:label="$t('兑换网点')"
align="center"
:prop="isChinese ? 'nodeTitleZh' : 'nodeTitleEn'"
>
</el-table-column>
<el-table-column width="140" :label="$t('领取方式')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeRedeemType(row.redeemType).label
: handleExchangeRedeemType(row.redeemType).labelEn
}}
</template>
</el-table-column>
<el-table-column width="140" :label="$t('状态')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeStatus(row.status).label
: handleExchangeStatus(row.status).labelEn
}}
</template>
</el-table-column>
<el-table-column
width="140"
:label="$t('备注')"
align="center"
prop="remark"
></el-table-column
>
<el-table-column
width="140"
:label="$t('数量')"
align="center"
prop="rewardCount"
></el-table-column>
<el-table-column
width="140"
:label="$t('创建人')"
align="center"
prop="creatorName"
></el-table-column>
<el-table-column
width="140"
:label="$t('更新人')"
align="center"
prop="updaterName"
></el-table-column>
<el-table-column
width="220px"
align="center"
:label="$t('操作')"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleRewardCancel(scope.row)"
:disabled="scope.row.status != '1'"
v-hasPermi="['ecw:memberManagement:cancel']"
>{{ $t("撤销") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleRewardEdit(scope.row)"
:disabled="scope.row.status != '1'"
v-hasPermi="['ecw:memberManagement:edit']"
>{{ $t("编辑") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleViewRecord(scope.row)"
v-hasPermi="['ecw:memberManagement:view']"
>{{ $t("查看") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleVerify(scope.row)"
:disabled="scope.row.status != '1'"
v-hasPermi="['ecw:memberManagement:verification']"
>{{ $t("核销") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleVerificationRollback(scope.row)"
:disabled="scope.row.status != '2'"
v-hasPermi="['ecw:memberManagement:verificationRollback']"
>{{ $t("核销回退") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="handleQueryPagination"
/>
<!-- 批量导入 -->
<!-- 用户导入对话框 -->
<el-dialog
:title="upload.title"
:visible.sync="upload.open"
width="400px"
append-to-body
>
<el-upload
ref="upload"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
{{ $t("将文件拖到此处,或") }}<em>{{ $t("点击上传") }}</em>
</div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link
type="primary"
:underline="false"
style="font-size: 12px; vertical-align: baseline"
@click="importTemplate"
>{{ $t("下载模板") }}
</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm">{{
$t("确 定")
}}</el-button>
<el-button @click="upload.open = false">{{ $t("取 消") }}</el-button>
</div>
</el-dialog>
<!-- 批量核销 -->
<el-dialog
:title="$t('批量核销')"
:visible.sync="dialogBatchVerify"
width="30%"
:before-close="handleClose"
>
<el-form
:model="batchVerifyForm"
ref="numberValidateForm"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item
label="核销人"
prop="age"
:rules="[{ required: true, message: $t('核销人不能为空') }]"
>
<el-input
v-model.number="batchVerifyForm.verifyUser"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item
:label="$t('核销时间')"
:rules="[{ required: true, message: $t('核销时间不能为空') }]"
>
<el-date-picker
type="date"
placement="bottom-start"
value-format="yyyy-MM-dd HH:mm:ss"
:placeholder="$t('选择核销时间')"
v-model="batchVerifyForm.verifyTime"
></el-date-picker>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogBatchVerify = false">取 消</el-button>
<el-button type="primary" @click="handleBatchVerifySubmit">{{
$t("确认核销")
}}</el-button>
</span>
</el-dialog>
<el-dialog
:title="$t('操作积分')"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form ref="form" :model="formQuery" label-width="80px">
<el-form-item :label="$t('会员')">
<el-select
v-model="formQuery.memberIds"
multiple
placeholder="请选择"
>
<el-option
v-for="item in selectedMember"
:key="item.id"
:label="isChinese ? item.memberNameZh : item.memberNameEn"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('操作')">
<el-radio-group v-model="formQuery.operateType">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.MEMBER_SCORE_OPERATE_TYPE)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('积分')">
<el-input
v-model.number="formQuery.scoreCount"
:placeholder="$t('请输入积分')"
clearable
/>
</el-form-item>
<el-form-item :label="$t('备注')">
<el-input type="textarea" v-model="formQuery.comment"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="handleScoreSubmit">{{
$t("操作积分")
}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import { getNodeList } from "@/api/ecw/giftManagement";
import {
queryMemberExchangeRecord,
batchVerifyAPI,
batchRecordExport,
batchRecordImport,
batchRecordImportTemplate,
rewardCancelQuery,
verifyRollback,
} from "@/api/ecw/memberManagement";
import { getNowDateTime, parseTime } from "@/utils/ruoyi";
import { getBaseHeader } from "@/utils/request";
export default {
name: "exchangeRecord",
data() {
return {
upload: {
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: this.$t("兑换信息导入"),
// 是否禁用上传
isUploading: false,
// 设置上传的请求头部
headers: getBaseHeader(),
// 上传的地址
url:
process.env.VUE_APP_BASE_API +
"/admin-api/reward/redeem/record/import",
},
//批量核销
dialogBatchVerify: false,
batchVerifyForm: {
ids: [],
verifyTime: "",
verifyUser: "",
},
// 显示搜索条件
showSearch: true,
selectedMember: [],
cityList: [],
dateRangeCreateTime: [],
total: 0,
loading: true,
dialogVisible: false,
memberList: [],
formQuery: {
comment: "",
memberIds: [],
operateType: null,
scoreCount: null,
},
queryParams: {
rewardTitle: "",
memberName: "", //会员昵称
redeemType: "", //兑换方式
status: "",
rewardCount: "",
rewardCountOperate: "",
rewardCode: "",
entrance: "", //兑换入口
startTime: "",
endTime: "",
nodeId: "",
pageNo: 1,
pageSize: 10,
},
// 网点
nodeList: [],
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.getNodeListAPI();
this.handleQuery();
},
activated() {
this.handleQuery();
},
methods: {
//核销回退
handleVerificationRollback(row) {
this.$confirm(this.$t("是否继续核销回退?"), this.$t("提示"), {
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
})
.then(() => {
let params = {
redeemIds: [row.id],
};
verifyRollback(params).then((res) => {
this.$message({
type: "success",
message: this.$t("回退成功!"),
});
this.handleQuery();
});
})
.catch(() => {
this.$message({
type: "info",
message: this.$t("已取消回退"),
});
});
},
//核销
handleVerify(row) {
this.$router.push({
path: "/memberManagement/exchangeRecordOperation",
query: { exchangeRewardID: row.id, pageStatus: "verify" },
});
},
//查看按钮操作
handleViewRecord(row) {
this.$router.push({
path: "/memberManagement/exchangeRecordOperation",
query: { exchangeRewardID: row.id, pageStatus: "view" },
});
},
//兑换记录编辑操作
handleRewardEdit(row) {
this.$router.push({
path: "/memberManagement/exchangeRecordOperation",
query: { exchangeRewardID: row.id, pageStatus: "edit" },
});
},
//撤销按钮操作
handleRewardCancel(row) {
this.$confirm(
this.$t("此操作积分可能存在到期积分, 撤销后积分将进行扣除,是否继续?"),
this.$t("提示"),
{
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
}
)
.then(() => {
let params = {
id: row.id,
};
rewardCancelQuery(params).then((res) => {
this.$message({
type: "success",
message: this.$t("撤销成功!"),
});
this.handleQuery();
});
})
.catch(() => {
this.$message({
type: "info",
message: this.$t("已取消撤销"),
});
});
},
//下载导入模板
importTemplate() {
batchRecordImportTemplate().then((res) => {
this.$download.excel(res, "用户导入模板.xls");
this.$message({
message: this.$t("下载模板成功"),
type: "success",
});
});
},
//导入
handleShowFileUploadDialog() {
this.upload.open = true;
},
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {
if (response.code == "1001011027") {
this.$message.error(response.msg);
}
if (
!response.data.redeemIdFailedMap ||
JSON.stringify(response.data.redeemIdFailedMap) == "{}"
) {
this.upload.open = false;
this.$modal.msgSuccess(this.$t("导入成功"));
this.handleQuery();
return;
}
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
// 拼接提示语
let data = response.data;
let text = `${this.$t("导入失败:")}`;
for (const username in data.redeemIdFailedMap) {
text +=
"<br />&nbsp;&nbsp;&nbsp;&nbsp;" +
username +
this.$t("") +
data.redeemIdFailedMap[username];
}
text += `<br />&nbsp;&nbsp;&nbsp;&nbsp;${this.$t("以上数据格式有问题")}`;
this.$alert(text, this.$t("导入结果"), {
dangerouslyUseHTMLString: true,
});
},
// 提交上传文件
submitFileForm() {
this.$refs.upload.submit();
},
//导出
handleBatchExport() {
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
params.pageNo = null;
params.pageSize = null;
}
batchRecordExport(params).then((res) => {
this.$message({
message: this.$t("已加入导出队列,请稍后在下载日志中下载"),
type: "success",
});
});
},
//批量核销确认按钮
handleBatchVerifySubmit() {
this.$confirm(this.$t("确认提交?"))
.then((_) => {
let params = { ...this.batchVerifyForm };
batchVerifyAPI(params).then((res) => {
this.dialogBatchVerify = false;
this.$message({
message: this.$t("核销成功"),
type: "success",
});
});
})
.catch((_) => {});
},
// 批量核销
handleBatchVerify() {
if (this.batchVerifyForm.ids.length > 0) {
this.dialogBatchVerify = true;
this.batchVerifyForm.verifyUser = this.$store.getters.name;
this.batchVerifyForm.verifyTime = getNowDateTime();
} else {
this.$message({
message: this.$t("请先选择兑换记录"),
type: "warning",
});
}
},
// 新增兑换
handleNewExchange() {
this.$router.push({
path: "/memberManagement/exchangeRecordOperation",
});
},
getNodeListAPI() {
getNodeList().then((res) => {
this.nodeList = res.data;
});
},
handleExchangeRedeemType(id) {
return this.getDictDatas(DICT_TYPE.WAY_OF_RECEIVING).filter(
(item) => item.value == id
)[0];
},
//兑换入口
handleExchangeEntrance(id) {
return this.getDictDatas(DICT_TYPE.PLATFORM_TYPE).filter(
(item) => item.value == id
)[0];
},
//兑换状态
handleExchangeStatus(id) {
return this.getDictDatas(DICT_TYPE.REWARD_REDEEM_STATUS).filter(
(item) => item.value == id
)[0];
},
handleScoreSubmit() {
this.$confirm(this.$t("确认提交?"))
.then((_) => {
let params = { ...this.formQuery };
operateMemberScore(params).then((res) => {
this.dialogVisible = true;
this.formQuery = {
comment: "",
memberIds: [],
operateType: null,
scoreCount: null,
};
this.selectedMember = [];
this.$message.success(this.$t("操作成功"));
});
})
.catch((_) => {});
},
handleClose(done) {
this.$confirm(this.$t("确认关闭?"))
.then((_) => {
done();
})
.catch((_) => {});
},
handleSelectionChange(val) {
this.selectedMember = val;
this.batchVerifyForm.ids = val.map((item) => {
return item.id;
});
},
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,
};
},
handleQuery() {
this.queryParams.pageNo = 1;
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
queryMemberExchangeRecord(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
queryMemberExchangeRecord(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
resetQuery() {
this.loading = true;
this.dateRangeCreateTime = [];
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>
<template>
<el-dialog
:title="$t('选择礼品')"
:visible.sync="dialogVisible"
width="80%"
:before-close="dialogBeforeClose"
>
<div class="container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('礼品名称')">
<el-input
v-model.trim="queryParams.title"
: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-row :gutter="10">
<el-col :span="8">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.pointsRequireSymbol"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="16">
<el-input
v-model.trim="queryParams.pointsRequire"
: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('领取方式')" prop="level">
<dict-selector
clearable
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="queryParams.pickMethod"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('兑换网点')" prop="level">
<el-select
v-model="queryParams.nodeId"
:placeholder="$t('请选择兑换网点')"
clearable
size="small"
@change="handleQuery"
>
<el-option
v-for="nodeItem in nodeList"
:key="nodeItem.id"
:label="isChinese ? nodeItem.titleZh : nodeItem.titleEn"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('状态')" prop="level">
<dict-selector
clearable
:type="DICT_TYPE.GIFT_STATUS"
v-model="queryParams.status"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('备注')" prop="level">
<el-input
v-model.trim="queryParams.remark"
: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-row :gutter="10">
<el-col :span="8">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.quantityRemainSymbol"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="16">
<el-input
v-model.trim="queryParams.quantityRemain"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</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-row class="mb8">
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 礼品列表 -->
<el-table ref="multipleTable" v-loading="loading" :data="list">
<el-table-column
width="140"
:label="$t('礼品ID')"
align="center"
prop="code"
></el-table-column>
<el-table-column :label="$t('礼品名称')" align="center">
<template slot-scope="scope">
<el-button type="text" @click="handleView(scope.row)">{{
isChinese ? scope.row.titleZh : scope.row.titleEn
}}</el-button>
</template>
</el-table-column>
<el-table-column :label="$t('图片')">
<template slot-scope="scope">
<el-image
:src="firstImg(isChinese ? scope.row.imgZh : scope.row.imgEn)"
style="width: 50px; height: 50px"
>{{ $t("") }}</el-image
>
</template>
</el-table-column>
<el-table-column width="160" :label="$t('开始日期')">
<template v-slot="{ row }">
{{ parseTime(row.createTime) || "/" }}
</template>
</el-table-column>
<el-table-column width="160" :label="$t('结束日期')">
<template v-slot="{ row }">
{{ parseTime(row.endTime) || "/" }}
</template>
</el-table-column>
<el-table-column
:label="$t('兑换积分')"
prop="pointsRequire"
></el-table-column>
<el-table-column
:label="$t('领取方式')"
align="center"
prop="pickMethod"
>
<template v-slot="{ row }">
{{ handlePickMethod(row.pickMethod) }}
</template>
</el-table-column>
<el-table-column :label="$t('兑换网点')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeNodeId(row.nodeId).titleZh
: handleExchangeNodeId(row.nodeId).titleEn
}}
</template>
</el-table-column>
<el-table-column
:label="$t('允许兑换次数')"
align="center"
prop="allowCount"
></el-table-column>
<el-table-column :label="$t('状态')">
<template slot-scope="{ row }">
{{
isChinese
? handleRewardsStatus(row.status).label
: handleRewardsStatus(row.status).labelEn
}}
</template>
</el-table-column>
<el-table-column :label="$t('备注')" align="center" width="200">
<template slot-scope="{ row }">
<el-tooltip
popper-class="rewardstToolTip"
:content="isChinese ? row.remarkZh : remarkEn"
placement="top"
>
<div
style="
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
"
>
{{ isChinese ? row.remarkZh : remarkEn }}
</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
:label="$t('已兑换次数')"
align="center"
prop="exchangeCount"
></el-table-column>
<el-table-column
:label="$t('剩余次数')"
align="center"
prop="quantityRemain"
></el-table-column>
<el-table-column
width="100px"
align="center"
:label="$t('操作')"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="transferSelectRewards(scope.row)"
:disabled="scope.row.status != '1'"
>{{ $t("选择") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.rows"
@pagination="getList"
/>
</div>
</el-dialog>
</template>
<script>
import {
getNodeList,
getGiftList,
deleteRewards,
copyRewardsAPI,
changeRewardsStatus,
delayRewards,
} from "@/api/ecw/giftManagement";
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import { parseTime } from "@/utils/ruoyi";
import { uploadFile } from "@/api/infra/file";
import ImageUpload from "@/components/ImageUpload";
export default {
name: "chooseGift",
props: {
dialogVisible: {
type: Boolean,
default: false,
},
},
watch: {
dialogVisible(val) {
if (val == true) {
this.handleQuery();
}
},
},
data() {
return {
env: process.env.NODE_ENV,
// 遮罩层
loading: true,
// 导出遮罩层
exportLoading: false,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 礼品列表
list: [],
rewardsItem: {},
dateRangeCreateTime: [],
postponeDatetime: "",
postponeRewardsID: "",
// 查询参数
queryParams: {
page: 1,
rows: 10,
title: null,
pointsRequire: null,
pointsRequireSymbol: null,
pickMethod: null,
nodeId: null,
status: null,
remark: null,
quantityRemainSymbol: null,
quantityRemain: null,
beginCreateTime: null,
endCreateTime: null,
},
// 网点
nodeList: [],
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.getList();
this.getNodeList();
},
activated() {
this.getList();
},
methods: {
transferSelectRewards(row) {
this.$emit("transferSelectRewards", row);
this.dialogBeforeClose();
},
dialogBeforeClose() {
this.loading = true;
this.queryParams = {
page: 1,
rows: 10,
title: null,
pointsRequire: null,
pointsRequireSymbol: null,
pickMethod: null,
nodeId: null,
status: null,
remark: null,
quantityRemainSymbol: null,
quantityRemain: null,
beginCreateTime: null,
endCreateTime: null,
};
// this.dialogVisible = false;
this.$emit("update:dialogVisible", false);
},
arraysEqual(arr1, arr2) {
return arr1.filter((current) => {
return arr2.find((item) => item == current.value.toString())
? true
: false;
});
},
handleRewardsStatus(status) {
return this.getDictDatas(DICT_TYPE.GIFT_STATUS).filter(
(dicItem) => dicItem.value.toString() == status
)[0];
},
firstImg(imgString) {
if (!imgString || imgString == "") return imgString;
let imgs = imgString.split(",");
return imgs.length ? imgs[0] : null;
},
handlePickMethod(pickMethod) {
let pickMethodLabel = [];
if (this.isChinese) {
this.arraysEqual(
this.getDictDatas(DICT_TYPE.WAY_OF_RECEIVING),
pickMethod.split(",")
).forEach((element) => {
pickMethodLabel.push(element.label);
});
} else {
this.arraysEqual(
this.getDictDatas(DICT_TYPE.WAY_OF_RECEIVING),
pickMethod.split(",")
).forEach((element) => {
pickMethodLabel.push(element.labelEn);
});
}
return pickMethodLabel.join();
},
handleExchangeNodeId(nodeId) {
return this.nodeList.filter((nodeItem) => nodeItem.id == nodeId)[0];
},
handleExchange(row) {
this.$router.push({
path: "/giftManagement/bulkExchange",
query: { rewardsID: row.id },
});
},
/** 关闭按钮操作 */
handleCloseStatus(row) {
this.$confirm(this.$t("是否关闭当前礼品?"), this.$t("提示"), {
confirmButtonText: this.$t("确定"),
cancelButtonText: this.$t("取消"),
type: "warning",
})
.then((_) => {
return changeRewardsStatus({ id: row.id, status: "3" });
})
.then((res) => {
this.getList();
this.$message.success(this.$t("关闭成功"));
})
.catch((_) => {
// this.queryAllData();
});
},
getNodeList() {
getNodeList().then((res) => {
this.nodeList = res.data;
});
},
getList() {
this.loading = true;
// 处理查询参数
let params = { ...this.queryParams };
this.addBeginAndEndTime(
params,
this.dateRangeCreateTime,
"createTime",
false
);
getGiftList(params).then((res) => {
this.loading = false;
this.list = res.data.list;
this.total = res.data.total;
});
},
/** 搜索按钮操作 */
handleQuery() {
this.$nextTick(() => {
this.queryParams.page = 1;
this.getList();
});
},
/** 重置按钮操作 */
resetQuery() {
this.dateRangeCreateTime = [];
this.queryParams = {
page: 1,
rows: 10,
number: null,
name: null,
level: null,
source: null,
customerService: null,
status: null,
department: null,
creditLevel: null,
country: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null,
};
this.handleQuery();
},
},
};
</script>
<style>
.rewardstToolTip {
max-width: 90%;
}
</style>
<template>
<div class="app-container">
<div class="container">
<div class="formBox">
<el-form
v-for="(item, index) in queryParamsList"
:key="item.memberId"
:model="queryParamsList[index]"
:ref="`queryForm${item.memberId}`"
size="small"
:inline="true"
:rules="rules"
:disabled="viewRecordDisable"
label-width="168px"
>
<el-card class="box-card">
<div slot="header" class="clearfix">
<el-row :gutter="10">
<span class="card-title">{{ $t("基础信息") }}</span>
</el-row>
<el-row :gutter="10">
<el-form-item :label="$t('会员名称')">
<el-autocomplete
v-model="item.memberName"
:disabled="rewardEdit || veriftyDisable"
:fetch-suggestions="querySearchAsync"
:placeholder="$t('请输入会员名称')"
@select="handleSelectMemberQuery"
></el-autocomplete>
<!-- <el-input
:placeholder=""
clearable
v-model="item.memberName"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/> -->
</el-form-item>
<el-form-item id="colorRedInput" :label="$t('当前积分')">
<el-input
:placeholder="$t('请输入当前积分')"
clearable
:disabled="true"
v-model="item.holdScore"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('礼品选择')"
prop="rewardName"
id="colorRedInput"
>
<el-input
:placeholder="$t('请选择礼品')"
clearable
:disabled="true"
v-model="item.rewardName"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-button
type="success"
size="small"
@click="handleSelectMember"
>
{{ $t("选择") }}</el-button
>
<el-form-item :label="$t('礼品积分')" id="colorRedInput">
<el-input
:placeholder="$t('请输入礼品积分')"
clearable
:disabled="true"
v-model="item.pointsRequire"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换数量')" prop="rewardCount">
<el-input
:placeholder="$t('请输入兑换数量')"
:disabled="rewardEdit || veriftyDisable"
clearable
v-model.number="item.rewardCount"
@change="
(val) => {
handleRewardCount(item, index, val);
}
"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('本次兑换积分')" id="colorRedInput">
<el-input
:placeholder="$t('请输入本次兑换积分')"
clearable
:disabled="true"
v-model="item.spendCredit"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换后剩余积分')" id="colorRedInput">
<el-input
:placeholder="$t('兑换后剩余积分')"
clearable
:disabled="true"
id="colorRedInput"
v-model="item.remainingPoints"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
</el-row>
<el-row :gutter="10">
<el-row>
<span class="card-title">{{ $t("详细信息") }}</span>
</el-row>
<el-row>
<el-form-item :label="$t('兑换方式')" prop="redeemType">
<dict-selector
clearable
:disabled="veriftyDisable"
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="item.redeemType"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('兑换入口')">
<dict-selector
clearable
:disabled="true"
v-model="item.entrance"
:type="DICT_TYPE.PLATFORM_TYPE"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('费用')" required>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item prop="expenses">
<el-input
v-model="item.expenses"
:disabled="veriftyDisable"
:placeholder="$t('请输入数字')"
clearable
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item prop="currency">
<el-select
v-model="item.currency"
:disabled="veriftyDisable"
:placeholder="$t('请选择币种')"
>
<el-option
v-for="nodeItem in currencyList"
:key="nodeItem.id"
:label="
isChinese ? nodeItem.titleZh : nodeItem.titleEn
"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item :label="$t('收件人姓名')" prop="recipientName"
><el-input
:placeholder="$t('请输入收件人姓名')"
clearable
v-model="item.recipientName"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('收件人电话')"
prop="recipientPhoneNum"
>
<el-input
:placeholder="$t('请输入收件人电话')"
clearable
v-model="item.recipientPhoneNum"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('收件人地址')"
prop="recipientAddress"
v-if="item.redeemType != '1'"
>
<el-input
:placeholder="$t('请输入收件人地址')"
clearable
v-model="item.recipientAddress"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换人')">
<el-input
:placeholder="$t('请输入兑换人')"
clearable
v-model="item.redeemer"
:disabled="veriftyDisable"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('兑换时间')">
<el-date-picker
type="date"
placement="bottom-start"
:disabled="veriftyDisable"
value-format="yyyy-MM-dd HH:mm:ss"
:placeholder="$t('选择兑换时间')"
v-model="item.redemptionTime"
></el-date-picker>
</el-form-item>
<el-form-item
:label="$t('快递公司')"
v-if="item.redeemType != '1'"
>
<el-select
v-model="item.courierCompany"
:placeholder="$t('请选择快递公司')"
>
<el-option
v-for="nodeItem in expressList"
:key="nodeItem.id"
:label="nodeItem.companyName"
:value="nodeItem.id"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('快递单号')"
v-if="item.redeemType != '1'"
>
<el-input
:placeholder="$t('请输入快递单号')"
clearable
v-model="item.expressNo"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item
:label="$t('快递日期')"
v-if="item.redeemType != '1'"
>
<el-date-picker
type="date"
:placeholder="$t('选择快递日期')"
v-model="item.expressDate"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
<el-form-item :label="$t('快递寄出人')">
<el-input
:placeholder="$t('请输入快递寄出人')"
clearable
v-model="item.expressSender"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('上传附件')">
<file-upload
v-model="item.annex"
:disabled="veriftyDisable || viewRecordDisable"
></file-upload>
</el-form-item>
<el-form-item :label="$t('备注')">
<el-input
style="width: 500px"
:disabled="veriftyDisable"
type="textarea"
v-model="item.remark"
></el-input>
</el-form-item>
<div class="view" v-if="viewRecordDisable || veriftyDisable">
<el-form-item :label="$t('核销人')">
<el-input v-model="item.verifyUser"></el-input>
</el-form-item>
<el-form-item :label="$t('核销时间')">
<el-date-picker
type="date"
:placeholder="$t('选择核销时间')"
v-model="item.verifyTime"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
<el-form-item :label="$t('创建人')" v-if="!veriftyDisable">
<el-input v-model="item.creatorName"></el-input>
</el-form-item>
<el-form-item
:label="$t('创建时间')"
v-if="!veriftyDisable"
>
<el-date-picker
type="date"
:placeholder="$t('创建时间')"
v-model="item.createTime"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
<el-form-item
:label="$t('最后更新人')"
v-if="!veriftyDisable"
>
<el-input v-model="item.updater"></el-input>
</el-form-item>
<el-form-item
:label="$t('最后更新时间')"
v-if="!veriftyDisable"
>
<el-date-picker
type="date"
:placeholder="$t('最后更新时间')"
v-model="item.updateTime"
value-format="yyyy-MM-dd HH:mm:ss"
placement="bottom-start"
></el-date-picker>
</el-form-item>
</div>
</el-row>
</el-row>
</div>
</el-card>
</el-form>
</div>
<el-row justify="end" :gutter="20" type="flex" class="handleButton">
<el-col :span="3">
<el-button
type="primary"
@click="handleBulkConversion"
v-if="!viewRecordDisable"
>{{ submitButtonText }}</el-button
>
</el-col>
<el-col :span="3">
<el-button @click="handleBack">{{ $t("返回") }}</el-button>
</el-col>
</el-row>
</div>
<choose-Gift
:dialogVisible.sync="dialogVisible"
@transferSelectRewards="onGetSelectRewardsInfo"
>
</choose-Gift>
</div>
</template>
<script>
import { bulkConversion } from "@/api/ecw/giftManagement";
import FileUpload from "@/components/FileUpload";
import chooseGift from "./components/chooseGift.vue";
import { getExpressPage } from "@/api/ecw/express";
import { getCurrencyList } from "@/api/ecw/currency";
import { getNowDateTime, parseTime } from "@/utils/ruoyi";
import { getMemberList } from "@/api/ecw/giftManagement";
import {
getRewardDetailQuery,
updatedRewardsDetails,
verifyRedeem,
} from "@/api/ecw/memberManagement";
import { memberUserGet } from "@/api/member/user";
export default {
name: "exchangeRecordOperation",
components: {
chooseGift,
FileUpload,
},
data() {
var validatePass2 = (rule, value, callback) => {
if (!this.quantityComputation) {
return callback(
new Error(this.$t("兑换积分大于当前总积分,请重新输入兑换数量"))
);
} else {
return callback();
}
};
return {
env: process.env.NODE_ENV,
// 是否显示弹出层
dialogVisible: false,
// 查询参数
queryParamsList: [
{
memberId: null,
holdScore: null,
rewardId: "",
pointsRequire: "",
rewardCount: null,
spendCredit: null, //本次兑换花费积分
remainingPoints: null, //剩余积分
redeemType: null,
entrance: 1,
expenses: null,
currency: null,
recipientName: null,
recipientPhoneNum: null,
recipientAddress: null,
redeemer: this.$store.getters.name,
redemptionTime: getNowDateTime(),
courierCompany: null,
expressNo: null,
expressSender: this.$store.getters.name,
expressDate: null,
remark: null,
annex: null,
memberName: null,
rewardName: null,
},
],
// 网点
nodeList: [],
//快递公司列表
expressList: [],
currencyList: [],
quantityComputation: null,
checkFormResult: [],
rewardEdit: false,
submitButtonText: "确认兑换",
viewRecordDisable: false,
veriftyDisable: false,
rules: {
rewardCount: [
{
required: true,
message: this.$t("请输入兑换数量"),
trigger: "blur",
},
{
validator: validatePass2,
trigger: ["blur", "change"],
},
],
rewardName: [
{
required: true,
message: this.$t("请选择礼品"),
trigger: "blur",
},
],
expenses: [
{
required: true,
message: this.$t("请输入费用"),
trigger: "blur",
},
{
pattern: /^\d+(\.\d{1,2})?$/,
message: this.$t("请输入整数或保留小数点后两位"),
trigger: "blur",
},
],
currency: [
{
required: true,
message: this.$t("请选择币种"),
trigger: "change",
},
],
redeemType: [
{
required: true,
message: this.$t("请选择兑换方式"),
trigger: "change",
},
],
recipientName: [
{
required: true,
message: this.$t("请输入收件人姓名"),
trigger: "blur",
},
],
recipientPhoneNum: [
{
required: true,
message: this.$t("请输入收件人电话"),
trigger: "blur",
},
],
recipientAddress: [
{
required: true,
message: this.$t("请输入收件人地址"),
trigger: "blur",
},
],
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.getExpressList();
this.currencyListAPI();
switch (this.$route.query.pageStatus) {
case "edit":
this.submitButtonText = this.$t("保存");
this.getExchangeDetail();
break;
case "view":
this.viewRecordDisable = true;
this.getExchangeDetail();
break;
case "verify":
this.veriftyDisable = true;
this.submitButtonText = this.$t("确认核销");
this.getExchangeDetail();
break;
case "add":
this.submitButtonText = this.$t("确认兑换");
this.getDetails();
break;
default:
this.submitButtonText = this.$t("确认兑换");
break;
}
},
activated() {},
methods: {
getDetails() {
memberUserGet({ id: this.$route.query.memberId }).then((r) => {
console.log(r, "rrrr");
// this.details = r.data;
this.isChinese
? (this.queryParamsList[0].memberName = r.data.nickname)
: (this.queryParamsList[0].memberName = r.data.englishName);
this.queryParamsList[0].holdScore = r.data.userScoreLevelInfo.holdScore;
this.queryParamsList[0].memberId = r.data.id;
});
},
getExchangeDetail() {
this.queryParamsList = [];
this.$nextTick(() => {
let params = {
id: this.$route.query.exchangeRewardID,
};
getRewardDetailQuery(params).then((res) => {
this.rewardEdit = true;
const data = res.data;
let params = this.queryParamsList[0];
this.queryParamsList = [{ ...data, params }];
if (this.isChinese) {
this.queryParamsList[0].memberName = data.memberNameZh;
this.queryParamsList[0].rewardName = data.rewardTitleZh;
} else {
this.queryParamsList[0].memberName = data.memberNameEn;
this.queryParamsList[0].rewardName = data.rewardTitleEn;
}
this.queryParamsList[0].redemptionTime = parseTime(
data.redemptionTime
); //兑换时间
this.queryParamsList[0].verifyUser = this.$store.getters.name;
this.queryParamsList[0].verifyTime = parseTime(data.verifyTime);
this.queryParamsList[0].updateTime = parseTime(data.updateTime);
this.queryParamsList[0].createTime = parseTime(data.createTime);
this.queryParamsList[0].expressDate = parseTime(data.expressDate); //快递时间
this.handleRewardCount(data, 0, data.rewardCount);
if (this.$route.query.pageStatus == "verify") {
this.queryParamsList[0].verifyTime = getNowDateTime();
}
this.$forceUpdate();
});
});
},
handleSelectMemberQuery(item) {
this.isChinese
? (this.queryParamsList[0].memberName = item.memberNameZh)
: (this.queryParamsList[0].memberName = item.englishName);
this.queryParamsList[0].holdScore = item.holdScore;
this.queryParamsList[0].memberId = item.id;
this.queryParamsList[0].spendCredit =
this.queryParamsList[0].pointsRequire *
this.queryParamsList[0].rewardCount;
this.queryParamsList[0].remainingPoints =
this.queryParamsList[0].holdScore - this.queryParamsList[0].spendCredit;
this.quantityComputation =
this.queryParamsList[0].remainingPoints >= 0 ? true : false;
},
querySearchAsync(queryString, cb) {
let result = [];
if (queryString == "") {
cb(result);
} else {
try {
let params = {
country: null,
city: null,
endTime: "",
holdScore: null,
holdScoreOperate: null,
key: this.queryParamsList[0].memberName,
pageNo: 1,
pageSize: 20,
startTime: "",
usedScore: null,
usedScoreOperate: null,
};
getMemberList(params).then((res) => {
result = res.data.list.map((item) => {
if (this.isChinese) {
return {
...item,
value: `${item.memberNameZh}(${item.mobile})`,
};
} else {
return {
...item,
value: `${item.memberNameEn}(${item.mobile})`,
};
}
});
cb(result);
});
} catch {
this.$message.success(this.$t("获取数据失败"));
}
}
},
handleRewardCount(item, index, value) {
this.queryParamsList[index].spendCredit =
this.queryParamsList[index].pointsRequire * value;
this.queryParamsList[index].remainingPoints =
this.queryParamsList[index].holdScore -
this.queryParamsList[index].spendCredit;
this.quantityComputation =
this.queryParamsList[index].remainingPoints >= 0 ? true : false;
},
currencyListAPI() {
getCurrencyList().then((res) => {
this.currencyList = res.data;
});
},
onGetSelectRewardsInfo(item) {
this.queryParamsList[0].rewardId = item.id;
this.queryParamsList[0];
if (this.isChinese) {
this.queryParamsList[0].rewardName = item.titleZh;
} else {
this.queryParamsList[0].rewardName = item.titleEn;
}
this.queryParamsList[0].pointsRequire = item.pointsRequire;
this.queryParamsList[0].rewardCount = "";
this.queryParamsList[0].spendCredit = "";
this.queryParamsList[0].remainingPoints =
this.queryParamsList[0].holdScore;
this.quantityComputation =
this.queryParamsList[0].remainingPoints >= 0 ? true : false;
},
handleSelectMember() {
this.dialogVisible = true;
},
getExpressList() {
let params = {
pageNo: 1,
pageSize: 1000,
};
getExpressPage(params).then((res) => {
this.expressList = res.data.list;
});
},
handleBack() {
this.$store.dispatch("tagsView/delCurrentView");
},
checkForm(formName) {
const result = new Promise((resolve, reject) => {
this.$refs[formName][0].validate((valid) => {
if (valid) {
resolve();
} else {
reject();
}
});
});
this.checkFormResult.push(result);
},
resetForm() {
this.queryParamsList = [
{
memberId: null,
holdScore: null,
rewardId: "",
pointsRequire: "",
rewardCount: null,
spendCredit: null, //本次兑换花费积分
remainingPoints: null, //剩余积分
redeemType: null,
entrance: 1,
expenses: null,
currency: null,
recipientName: null,
recipientPhoneNum: null,
recipientAddress: null,
redeemer: this.$store.getters.name,
redemptionTime: getNowDateTime(),
courierCompany: null,
expressNo: null,
expressSender: this.$store.getters.name,
expressDate: null,
remark: null,
annex: null,
memberName: null,
rewardName: null,
},
];
},
handleBulkConversion() {
this.queryParamsList.forEach((element) => {
this.checkForm(`queryForm${element.memberId}`);
});
Promise.all(this.checkFormResult)
.then((res) => {
this.checkFormResult = [];
let params = this.queryParamsList.map((item) => {
if (item.redeemType == "1") {
let {
recipientAddress,
expressNo,
expressDate,
courierCompany,
...itemNew
} = item;
return itemNew;
} else {
return item;
}
});
if (this.$route.query.pageStatus == "edit") {
updatedRewardsDetails(params[0]).then((res) => {
this.$message.success(this.$t("更新成功"));
this.$router.go(-1);
});
//编辑
} else if (this.$route.query.pageStatus == "verify") {
verifyRedeem(params[0]).then((res) => {
this.$message.success(this.$t("核销成功"));
this.$router.go(-1);
});
} else {
//兑换
bulkConversion(params).then((res) => {
if (res.code == "0") {
this.queryParamsList = this.resetForm();
this.$message.success(this.$t("兑换成功"));
this.$router.go(-1);
}
});
}
})
.catch(() => {
this.checkFormResult = [];
this.$message.error(this.$t("请填写必要的信息"));
});
},
},
};
</script>
<style>
#colorRedInput .el-input__inner {
color: red;
font-size: 14px;
}
</style>
<style scoped lang="scss">
.card-title {
padding-right: 10px;
border-right: 4px solid rgb(64, 158, 255);
font-size: 16px;
font-weight: 600;
}
.del-btn {
color: red;
}
.app-container .el-date-editor.el-input,
.el-date-editor.el-input__inner {
width: 194px;
}
.container {
padding: 20px 0;
}
.emptyText {
font-size: 20px;
padding: 20px;
line-height: 200px;
text-align: center;
color: #97a8be;
}
.handleButton {
padding-right: 160px;
margin-top: 50px;
button {
width: 100%;
}
}
</style>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
v-show="showSearch"
:inline="true"
label-width="120px"
>
<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('积分来源')">
<dict-selector
clearable
:type="DICT_TYPE.MEMBER_SCORE_SOURCE"
v-model="queryParams.sourceType"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('标题')">
<el-input
style="width: 300px"
v-model.trim="queryParams.ruleTitle"
: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-input
style="width: 300px"
v-model.trim="queryParams.ruleDesc"
: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-row :gutter="10" style="width: 300px">
<el-col :span="10">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.scoreCountOperate"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="14">
<el-input
v-model.trim="queryParams.scoreCount"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</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-row class="mb8">
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="handleQueryPagination"
></right-toolbar>
</el-row>
<el-table ref="multipleTable" v-loading="loading" :data="memberList">
<el-table-column
width="140"
:label="$t('积分记录ID')"
align="center"
prop="id"
></el-table-column>
<el-table-column :label="$t('会员名称')" align="center">
<template v-slot="{ row }">
<el-button
type="text"
@click="
$router.push('/member/member/member-details/' + row.memberId)
"
>{{ isChinese ? row.memberNameZh : row.memberNameEn }}</el-button
>
</template>
</el-table-column>
<el-table-column
width="140"
:label="$t('封面图片')"
align="center"
prop="mobile"
>
<template slot-scope="scope">
<el-image
:src="isChinese ? scope.row.coverImageZh : scope.row.coverImageEn"
style="width: 50px; height: 50px"
>{{ $t("") }}</el-image
>
</template>
</el-table-column>
<el-table-column
width="140"
align="center"
:label="$t('分值')"
prop="scoreCount"
></el-table-column>
<el-table-column :label="$t('类别')" align="center">
<template slot-scope="scope">
{{
isChinese
? handleholdScoreStatus(scope.row.operateType).label
: handleholdScoreStatus(scope.row.operateType).labelEn
}}
</template>
</el-table-column>
<el-table-column :label="$t('积分来源')" align="center">
<template slot-scope="scope">
{{
isChinese
? handleSourceType(scope.row.sourceType).label
: handleSourceType(scope.row.sourceType).labelEn
}}
</template>
</el-table-column>
<el-table-column
:label="$t('规则标题')"
align="center"
:prop="isChinese ? 'ruleTitleZh' : 'ruleTitleEn'"
>
</el-table-column>
<el-table-column
:label="$t('规则说明')"
align="center"
:prop="isChinese ? 'ruleDescZh' : 'ruleDescEn'"
>
</el-table-column>
<el-table-column :label="$t('操作积分时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.createTime) || "/" }}</template
>
</el-table-column>
<el-table-column width="300" :label="$t('详细信息')" align="center">
<template v-slot="{ row }">
<!-- 人工操作-->
<span v-if="row.sourceType == '1'">{{
row.extParamJson.comment || "-"
}}</span>
<!-- 兑换礼品2 兑换礼品撤销4 跳转兑换记录详情-->
<el-button
v-if="row.sourceType == '2' || row.sourceType == '4'"
type="text"
@click="
$router.push({
path: '/memberManagement/exchangeRecordOperation',
query: {
pageStatus: 'view',
exchangeRewardID: row.extParamJson.redeemId,
},
})
"
>{{ `${$t("兑换记录ID")}:${row.extParamJson.redeemId}` }}</el-button
>
<!-- 系统过期 sourceType = 3 不展示 -->
<span v-if="row.sourceType == '3'"> -</span>
<!-- 订单V: sourceType = 5 , extParamJson中取 orderId 跳转订单详情 -->
<el-button
v-if="row.sourceType == '5'"
type="text"
@click="
$router.push({
path: '/order/detail',
query: {
orderId: row.extParamJson.orderId,
},
})
"
>{{ `${$t("订单ID")}:${row.extParamJson.orderId}` }}</el-button
>
<!-- 注册sourceType = 6 , extParamJson中取 userIduserNameZh,userNameZh,phone 展示会员名+手机号(手机号脱敏处理)
推荐 : sourceType = 7 , extParamJson中取 userIduserNameZh,userNameZh,phone 展示会员名+手机号(手机号脱敏处理) -->
<span v-if="row.sourceType == '6' || row.sourceType == '7'">
{{
`${
isChinese
? row.extParamJson.userNameZh
: row.extParamJson.userNameEn
}(${row.extParamJson.phone})`
}}</span
>
<!-- sourceType = 8 , extParamJson中取 scoreRuleId 跳转活动详情 -->
<el-button
v-if="row.sourceType == '8'"
type="text"
@click="
$router.push({
path: '/memberManagement/addIntegrationRuleOperation',
query: {
id: row.extParamJson.scoreRuleId,
pageStatus: 'view',
},
})
"
>{{ `${$t("活动ID")}:${row.extParamJson.scoreRuleId}` }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="handleQueryPagination"
/>
</div>
</template>
<script>
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import { queryMemberScoreRecord } from "@/api/ecw/memberManagement";
export default {
name: "integralRecord",
data() {
return {
dateRangeCreateTime: [],
total: 0,
loading: true,
// 显示搜索条件
showSearch: true,
memberList: [],
queryParams: {
ruleTitle: "",
ruleDesc: "",
key: "",
sourceType: "",
scoreCount: "",
scoreCountOperate: "",
endTime: "",
pageNo: 1,
pageSize: 10,
startTime: "",
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.handleQuery();
},
activated() {
this.handleQuery();
},
methods: {
//积分来源
handleSourceType(id) {
return this.getDictDatas(DICT_TYPE.MEMBER_SCORE_SOURCE).filter(
(item) => item.value == id
)[0];
},
handleholdScoreStatus(id) {
return this.getDictDatas(DICT_TYPE.MEMBER_SCORE_OPERATE_TYPE).filter(
(item) => item.value == id
)[0];
},
handleQuery() {
this.queryParams.pageNo = 1;
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
queryMemberScoreRecord(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
queryMemberScoreRecord(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
resetQuery() {
this.loading = true;
this.dateRangeCreateTime = [];
this.queryParams = {
ruleTitle: "",
ruleDesc: "",
key: "",
sourceType: "",
scoreCount: "",
scoreCountOperate: "",
endTime: "",
pageNo: 1,
pageSize: 10,
startTime: "",
};
this.handleQuery();
},
},
};
</script>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('指标类型')">
<dict-selector
clearable
:type="DICT_TYPE.SCORE_RULE_TYPE"
v-model="queryParams.type"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('标题:')">
<el-input
style="width: 300px"
v-model.trim="queryParams.title"
: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-input
style="width: 300px"
v-model.trim="queryParams.desc"
:placeholder="$t('请输入关键词查找')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('状态')">
<dict-selector
clearable
:type="DICT_TYPE.GIFT_STATUS"
v-model="queryParams.status"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('单次积分')">
<el-row :gutter="10" style="width: 300px">
<el-col :span="10">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.getScoreOnceSymbol"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="14">
<el-input
v-model.trim="queryParams.getScoreOnce"
: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-row :gutter="10" style="width: 300px">
<el-col :span="10">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.maxScoreTotalSymbol"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="14">
<el-input
v-model.trim="queryParams.maxScoreTotal"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</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-row class="mb8">
<el-button
type="success"
size="mini"
icon="el-icon-plus"
@click="handleNewScoreRule"
>{{ $t("添加规则") }}</el-button
>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="handleQueryPagination"
></right-toolbar>
</el-row>
<el-table
ref="multipleTable"
v-loading="loading"
:data="integrationRuleList"
>
<el-table-column width="140" :label="$t('指标类型')" align="center">
<template slot-scope="scope">
{{
isChinese
? handleSourceType(scope.row.type).label
: handleSourceType(scope.row.type).labelEn
}}
</template>
</el-table-column>
<el-table-column
:label="$t('标题')"
align="center"
:prop="isChinese ? 'titleZh' : 'titleEn'"
></el-table-column>
<el-table-column :label="$t('开始时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.startTime) || "/" }}</template
>
</el-table-column>
<el-table-column :label="$t('结束时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.endTime) || "/" }}</template
>
</el-table-column>
<el-table-column
:label="$t('单次积分')"
align="center"
prop="getScoreOnce"
>
</el-table-column>
<el-table-column
:label="$t('累计最高积分')"
align="center"
prop="maxScoreTotal"
>
</el-table-column>
<el-table-column
:label="$t('规则说明')"
align="center"
:prop="isChinese ? 'descZh' : 'descEn'"
>
</el-table-column>
<el-table-column :label="$t('展示平台')" align="center">
<template v-slot="{ row }">
{{ handlePlatform(row.showPlatform) || "/" }}</template
>
</el-table-column>
<el-table-column :label="$t('状态')" align="center">
<template v-slot="{ row }">
{{ $l(handleStatus(row.status), "label") || "/" }}</template
>
</el-table-column>
<el-table-column :label="$t('创建人')" align="center" prop="creator">
</el-table-column>
<el-table-column :label="$t('创建时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.createTime) || "/" }}</template
>
</el-table-column>
<el-table-column :label="$t('最后更新人')" align="center" prop="updater">
</el-table-column>
<el-table-column :label="$t('最后更新时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.updateTime) || "/" }}</template
>
</el-table-column>
<el-table-column width="220px" :label="$t('操作')" align="center">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="handleViewDetails(scope.row)"
>{{ $t("查看") }}</el-button
>
<el-button
size="mini"
type="text"
:disabled="scope.row.status != '1'"
@click="handleCloseButton(scope.row)"
>{{ $t("关闭") }}</el-button
>
<el-button
size="mini"
type="text"
@click="handleCopyButton(scope.row)"
>{{ $t("复制") }}</el-button
>
<el-button
size="mini"
type="text"
:disabled="scope.row.status != '1'"
@click="handleDelayButton(scope.row)"
>{{ $t("延期") }}</el-button
>
<el-button
size="mini"
:disabled="scope.row.status != '2'"
type="text"
@click="handleDelete(scope.row)"
>{{ $t("删除") }}</el-button
>
<el-button
size="mini"
type="text"
:disabled="scope.row.status != '2'"
@click="handleUpdate(scope.row)"
>{{ $t("编辑") }}</el-button
>
<el-button
size="mini"
type="text"
:disabled="scope.row.status != '2'"
@click="handleEnabledStatus(scope.row)"
>{{ $t("启用") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.rows"
@pagination="handleQueryPagination"
/>
<el-dialog
:title="$t('提示')"
:visible.sync="dialogPostponeVisible"
width="30%"
>
<el-row class="mb8">{{ $t("请选择延期时间") }}</el-row>
<el-date-picker
type="datetime"
clearable
v-model="postponeDatetime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
:picker-options="pickerOptions"
:placeholder="$t('请选择时间')"
></el-date-picker>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogPostponeVisible = false">{{
$t("取 消")
}}</el-button>
<el-button type="primary" @click="confirmPostponeIntegral">{{
$t("确 定")
}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import {
getScoreRecordList,
integralRuleStatus,
integralRuleCopy,
integralRuleDelay,
integralRuleDelete,
} from "@/api/ecw/memberManagement";
export default {
name: "integralRecord",
data() {
return {
dateRangeCreateTime: [],
total: 0,
showSearch: true,
loading: true,
dialogPostponeVisible: false,
integrationRuleList: [],
postponeIntegralID: "",
postponeDatetime: "",
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now() - 8.64e7;
},
},
queryParams: {
type: "",
title: "",
desc: "",
status: "",
getScoreOnceSymbol: "",
getScoreOnce: "",
maxScoreTotalSymbol: "",
maxScoreTotal: "",
page: 1,
rows: 10,
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.handleQuery();
},
activated() {
this.handleQuery();
},
methods: {
//编辑操作按钮
handleUpdate(row) {
this.$router.push({
path: "/memberManagement/addIntegrationRuleOperation",
query: { id: row.id, pageStatus: "edit" },
});
},
//查看按钮操作
handleViewDetails(row) {
this.$router.push({
path: "/memberManagement/addIntegrationRuleOperation",
query: { id: row.id, pageStatus: "view" },
});
},
//延期按钮操作
handleDelayButton(row) {
this.postponeIntegralID = row.id;
this.dialogPostponeVisible = true;
},
confirmPostponeIntegral() {
integralRuleDelay({
id: this.postponeIntegralID,
endTime: this.postponeDatetime,
}).then((res) => {
this.postponeDatetime = "";
this.$modal.msgSuccess(this.$t("延期成功"));
});
},
//删除按钮操作
handleDelete(row) {
this.$modal
.confirm(this.$t("是否确认删除此礼品规则"))
.then(function () {
return integralRuleDelete({ id: row.id });
})
.then(() => {
this.handleQuery();
this.$modal.msgSuccess(this.$t("删除成功"));
})
.catch(() => {});
},
//启用按钮操作
handleEnabledStatus(row) {
this.$modal
.confirm(this.$t("是否确认启用此礼品规则"))
.then(function () {
return integralRuleStatus({ id: row.id, status: "1" });
})
.then(() => {
this.handleQuery();
this.$modal.msgSuccess(this.$t("启用成功"));
})
.catch(() => {});
},
//复制按钮操作
handleCopyButton(row) {
this.$modal
.confirm(this.$t("是否确认复制礼品规则"))
.then(function () {
return integralRuleCopy({ id: row.id });
})
.then(() => {
this.handleQuery();
this.$modal.msgSuccess(this.$t("复制成功"));
})
.catch(() => {});
},
//关闭按钮操作
handleCloseButton(row) {
this.$modal
.confirm(this.$t("是否确认关闭此礼品规则"))
.then(function () {
return integralRuleStatus({ id: row.id, status: "3" });
})
.then(() => {
this.handleQuery();
this.$modal.msgSuccess(this.$t("关闭成功"));
})
.catch(() => {});
},
// new score rule func
handleNewScoreRule() {
this.$router.push({
path: "/memberManagement/addIntegrationRuleOperation",
query: { pageStatus: "new" },
});
},
//积分来源
handleSourceType(id) {
return this.getDictDatas(DICT_TYPE.SCORE_RULE_TYPE).filter(
(item) => item.value == id
)[0];
},
// 活动状态
handleStatus(id) {
return this.getDictDatas(DICT_TYPE.GIFT_STATUS).filter(
(item) => item.value == id
)[0];
},
arraysEqual(arr1, arr2) {
return arr1.filter((current) => {
return arr2.find((item) => item == current.value.toString())
? true
: false;
});
},
//展示平台
handlePlatform(platformId) {
let platformIdLabel = [];
if (this.isChinese) {
this.arraysEqual(
this.getDictDatas(DICT_TYPE.PLATFORM_TYPE),
platformId.split(",")
).forEach((element) => {
platformIdLabel.push(element.label);
});
} else {
this.arraysEqual(
this.getDictDatas(DICT_TYPE.PLATFORM_TYPE),
platformId.split(",")
).forEach((element) => {
platformIdLabel.push(element.labelEn);
});
}
return platformIdLabel.join();
},
handleQuery() {
this.queryParams.page = 1;
let params = { ...this.queryParams };
this.addBeginAndEndTime(
params,
this.dateRangeCreateTime,
"createTime",
false
);
getScoreRecordList(params).then((res) => {
this.loading = false;
this.integrationRuleList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
this.addBeginAndEndTime(
params,
this.dateRangeCreateTime,
"createTime",
false
);
getScoreRecordList(params).then((res) => {
this.loading = false;
this.integrationRuleList = res.data.list;
this.total = res.data.total;
});
},
resetQuery() {
this.loading = true;
this.dateRangeCreateTime = [];
this.queryParams = {
ruleTitle: "",
ruleDesc: "",
key: "",
sourceType: "",
scoreCount: "",
scoreCountOperate: "",
endTime: "",
pageNo: 1,
pageSize: 10,
startTime: "",
};
this.handleQuery();
},
},
};
</script>
<template>
<div class="app-container">
<el-row class="mb8">
<el-button
type="success"
size="mini"
icon="el-icon-plus"
@click="handleNewScoreRule"
>{{ $t("添加规则") }}</el-button
>
<el-button
type="success"
size="mini"
icon="el-icon-delete"
@click="handleDelScoreRule"
>{{ $t("删除规则") }}</el-button
>
</el-row>
<el-table
ref="multipleTable"
v-loading="loading"
@selection-change="handleSelectionChange"
:data="memberLevelList"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column
width="140"
:label="$t('序号')"
align="center"
prop="id"
></el-table-column>
<el-table-column
:label="$t('等级名称')"
align="center"
prop="name"
></el-table-column>
<el-table-column
width="140"
:label="$t('图标')"
align="center"
prop="mobile"
>
<template slot-scope="scope">
<el-image :src="scope.row.icon" style="width: 50px; height: 50px">{{
$t("")
}}</el-image>
</template>
</el-table-column>
<el-table-column :label="$t('积分范围')" align="center">
<template slot-scope="scope">
{{ scope.row.lowerCount }}-{{ scope.row.upperCount }}
</template>
</el-table-column>
<el-table-column :label="$t('操作')" align="center">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>{{ $t("修改") }}</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>{{ $t("删除") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="handleQueryPagination"
/>
<el-dialog
:title="$t('添加规则')"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form
:model="ruleForm"
ref="ruleForm"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item :label="$t('等级名称')">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item :label="$t('积分范围')">
<el-col :span="11">
<el-form-item>
<el-input v-model="ruleForm.lowerCount"></el-input>
</el-form-item>
</el-col>
<el-col class="line" :span="2">{{ $t("至") }}</el-col>
<el-col :span="11">
<el-form-item>
<el-input v-model="ruleForm.upperCount"></el-input>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item :label="$t('上传图标')">
<image-upload v-model="ruleForm.icon" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">{{ $t("取 消") }}</el-button>
<el-button type="primary" @click="handelAddNewMemberLevel">{{
$t("确定")
}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import {
getMemberLevelList,
addNewMemberLevel,
delMemberLevel,
editMemberLevel,
} from "@/api/ecw/memberManagement";
import ImageUpload from "@/components/ImageUpload";
export default {
name: "integralRecord",
components: {
ImageUpload,
},
data() {
return {
dialogVisible: false,
selectList: [],
ruleForm: {
icon: "",
lowerCount: "",
name: "",
upperCount: "",
},
total: 0,
loading: true,
memberLevelList: [],
queryParams: {
pageNo: 1,
pageSize: 10,
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.handleQuery();
},
activated() {
this.handleQuery();
},
methods: {
handleUpdate(row) {
this.ruleForm = { ...row };
this.dialogVisible = true;
},
handleDelete(row) {
let ids = [row.id];
delMemberLevel(ids).then((res) => {
this.$message.success(this.$t("删除成功"));
this.handleClose();
this.handleQuery();
});
},
handelAddNewMemberLevel() {
if (this.ruleForm.id) {
editMemberLevel(this.ruleForm).then((res) => {
this.$message.success(this.$t("更新成功"));
this.handleClose();
this.handleQuery();
});
} else {
let params = { ...this.ruleForm };
addNewMemberLevel(params).then((res) => {
this.$message.success(this.$t("保存成功"));
this.handleClose();
this.handleQuery();
});
}
},
handleSelectionChange(ids) {
this.selectList = ids;
},
handleClose() {
this.dialogVisible = false;
this.selectList = [];
this.ruleForm = {
icon: "",
lowerCount: "",
name: "",
upperCount: "",
};
},
handleDelScoreRule() {
if (this.selectList.length > 0) {
let ids = this.selectList.map((item) => {
return item.id;
});
delMemberLevel(ids).then((res) => {
this.$message.success(this.$t("删除成功"));
this.handleClose();
this.handleQuery();
});
} else {
this.$message.warning(this.$t("请先选择要删除的会员等级"));
}
},
handleNewScoreRule() {
this.dialogVisible = true;
},
handleQuery() {
this.queryParams.pageNo = 1;
let params = { ...this.queryParams };
getMemberLevelList(params).then((res) => {
this.loading = false;
this.memberLevelList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
getMemberLevelList(params).then((res) => {
this.loading = false;
this.memberLevelList = res.data.list;
this.total = res.data.total;
});
},
},
};
</script>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="120px"
>
<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
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-row :gutter="10" style="width: 300px">
<el-col :span="10">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.holdScoreOperate"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="14">
<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-row :gutter="10" style="width: 300px">
<el-col :span="10">
<dict-selector
clearable
:type="DICT_TYPE.QUANTITATIVE_RELATION_SYMBOL"
v-model="queryParams.usedScoreOperate"
@change="handleQuery"
>
</dict-selector>
</el-col>
<el-col :span="14">
<el-input
v-model.trim="queryParams.usedScore"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</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-row class="mb8">
<el-button
type="success"
size="mini"
icon="el-icon-plus"
@click="handleScore"
>{{ $t("操作积分") }}</el-button
>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="handleQueryPagination"
></right-toolbar>
</el-row>
<el-table
ref="multipleTable"
v-loading="loading"
@selection-change="handleSelectionChange"
:data="memberList"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column
width="140"
:label="$t('会员编号')"
align="center"
prop="id"
></el-table-column>
<el-table-column :label="$t('会员名称')" align="center">
<template v-slot="{ row }">
<el-button
type="text"
@click="$router.push('/member/member/member-details/' + row.id)"
>{{ isChinese ? row.memberNameZh : row.memberNameEn }}</el-button
>
</template></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">
<template v-slot="{ row }">
<el-button
type="text"
@click="$router.push('/memberManagement/integralRecord')"
>{{ row.holdScore }}</el-button
>
</template>
</el-table-column>
<el-table-column :label="$t('已兑换积分')" align="center">
<template v-slot="{ row }">
<el-button
type="text"
@click="$router.push('/memberManagement/exchangeRecord')"
>{{ row.usedScore }}</el-button
>
</template>
</el-table-column>
<el-table-column
:label="$t('已失效积分')"
align="center"
prop="expiredScore"
></el-table-column>
<el-table-column :label="$t('会员注册时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.createTime) || "/" }}</template
>
</el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="handleQueryPagination"
/>
<el-dialog
:title="$t('操作积分')"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form ref="form" :model="formQuery" label-width="80px">
<el-form-item :label="$t('会员')">
<el-select
v-model="formQuery.memberIds"
multiple
placeholder="请选择"
>
<el-option
v-for="item in selectedMember"
:key="item.id"
:label="isChinese ? item.memberNameZh : item.memberNameEn"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('操作')">
<el-radio-group v-model="formQuery.operateType">
<el-radio
v-for="dict in getDictDatas(DICT_TYPE.MEMBER_SCORE_OPERATE_TYPE)"
:key="dict.value"
:label="dict.value"
>{{ $l(dict, "label") }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('积分')">
<el-input
v-model.number="formQuery.scoreCount"
:placeholder="$t('请输入积分')"
clearable
/>
</el-form-item>
<el-form-item :label="$t('备注')">
<el-input type="textarea" v-model="formQuery.comment"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="handleScoreSubmit">{{
$t("操作积分")
}}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
import { getTradeCountryList, getMemberList } from "@/api/ecw/giftManagement";
import { operateMemberScore } from "@/api/ecw/memberManagement";
export default {
name: "memberPointsSummary",
data() {
return {
selectedMember: [],
countryList: [],
cityList: [],
dateRangeCreateTime: [],
total: 0,
// 显示搜索条件
showSearch: true,
loading: true,
dialogVisible: false,
memberList: [],
formQuery: {
comment: "",
memberIds: [],
operateType: null,
scoreCount: null,
},
queryParams: {
country: null,
city: null,
endTime: "",
holdScore: null,
holdScoreOperate: null,
key: "",
pageNo: 1,
pageSize: 10,
startTime: "",
usedScore: null,
usedScoreOperate: null,
},
};
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
created() {
this.handleQuery();
this.getCountryList();
},
activated() {
this.handleQuery();
},
methods: {
handleScore() {
if (this.selectedMember.length > 0) {
this.dialogVisible = true;
} else {
this.$message({
message: this.$t("请先选择会员再进行操作"),
type: "warning",
});
}
},
handleScoreSubmit() {
this.$confirm(this.$t("确认提交?"))
.then((_) => {
let params = { ...this.formQuery };
operateMemberScore(params).then((res) => {
this.dialogVisible = false;
this.formQuery = {
comment: "",
memberIds: [],
operateType: null,
scoreCount: null,
};
this.selectedMember = [];
this.$message.success(this.$t("操作成功"));
});
})
.catch((_) => {});
},
handleClose(done) {
this.$confirm(this.$t("确认关闭?"))
.then((_) => {
done();
})
.catch((_) => {});
},
handleSelectionChange(val) {
this.selectedMember = val;
},
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,
};
},
getCountryList() {
getTradeCountryList().then((res) => {
this.countryList = res.data;
});
},
handleQuery() {
this.queryParams.pageNo = 1;
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
getMemberList(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
getMemberList(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
resetQuery() {
this.dateRangeCreateTime = [];
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>
...@@ -67,6 +67,36 @@ ...@@ -67,6 +67,36 @@
<el-form-item :label="$t('市场获客')" prop="department"> <el-form-item :label="$t('市场获客')" prop="department">
<dict-selector clearable multiple :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number" @change="handleQuery"></dict-selector> <dict-selector clearable multiple :type="DICT_TYPE.ECW_CUSTOMER_RESOURCE_TYPE" v-model="queryParams.marketType" formatter="number" @change="handleQuery"></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('会员电话')" prop="department">
<el-col :span="11">
<area-code-selector style="width: 100%;" v-model="queryParams.memberAreaCode" />
</el-col>
<el-col class="line" :span="2"></el-col>
<el-col :span="11">
<el-input maxlength="11"
width="100%"
class="ml-10 w-200"
clearable
v-model.number="queryParams.memberMobile"
:placeholder="$t('请输入会员电话')"/>
</el-col>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="number">
<el-input
v-model.trim="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员名称')" prop="name">
<el-input
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
$t("搜索") $t("搜索")
...@@ -304,6 +334,7 @@ import Template from "@/views/cms/template/index.vue"; ...@@ -304,6 +334,7 @@ import Template from "@/views/cms/template/index.vue";
import Contacts from "@/views/ecw/customer/components/contacts.vue"; import Contacts from "@/views/ecw/customer/components/contacts.vue";
//lanbm 2024-05-26 add //lanbm 2024-05-26 add
import { getUserProfile } from "@/api/system/user"; import { getUserProfile } from "@/api/system/user";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
export default { export default {
name: "EcwMycustomerserviceIndex", name: "EcwMycustomerserviceIndex",
...@@ -314,6 +345,7 @@ export default { ...@@ -314,6 +345,7 @@ export default {
customerFollowList, customerFollowList,
customerComplaints, customerComplaints,
transferCustomer, transferCustomer,
AreaCodeSelector
}, },
computed: { computed: {
isChinese() { isChinese() {
...@@ -333,7 +365,7 @@ export default { ...@@ -333,7 +365,7 @@ export default {
// 导出遮罩层 // 导出遮罩层
exportLoading: false, exportLoading: false,
// 显示搜索条件 // 显示搜索条件
showSearch: true, showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// 客户列表 // 客户列表
...@@ -357,6 +389,10 @@ export default { ...@@ -357,6 +389,10 @@ export default {
creditLevel: null, creditLevel: null,
country: null, country: null,
marketType: null, marketType: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}, },
// 表单参数 // 表单参数
form: {}, form: {},
...@@ -537,6 +573,10 @@ export default { ...@@ -537,6 +573,10 @@ export default {
department: null, department: null,
creditLevel: null, creditLevel: null,
country: null, country: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}; };
this.handleQuery(); this.handleQuery();
}, },
......
...@@ -163,6 +163,36 @@ ...@@ -163,6 +163,36 @@
@change="handleQuery" @change="handleQuery"
></dict-selector> ></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('会员电话')" prop="department">
<el-col :span="11">
<area-code-selector style="width: 100%;" v-model="queryParams.memberAreaCode" />
</el-col>
<el-col class="line" :span="2"></el-col>
<el-col :span="11">
<el-input maxlength="11"
width="100%"
class="ml-10 w-200"
clearable
v-model.number="queryParams.memberMobile"
:placeholder="$t('请输入会员电话')"/>
</el-col>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="number">
<el-input
v-model.trim="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员名称')" prop="name">
<el-input
v-model.trim="queryParams.memberName"
:placeholder="$t('请输入会员名称')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
$t("搜索") $t("搜索")
...@@ -378,6 +408,7 @@ import { getCountryListAll } from "@/api/ecw/country"; ...@@ -378,6 +408,7 @@ import { getCountryListAll } from "@/api/ecw/country";
import { getCreditPage } from "@/api/customer/credit"; import { getCreditPage } from "@/api/customer/credit";
import Template from "@/views/cms/template/index.vue"; import Template from "@/views/cms/template/index.vue";
import Contacts from "@/views/ecw/customer/components/contacts.vue"; import Contacts from "@/views/ecw/customer/components/contacts.vue";
import AreaCodeSelector from "@/components/AreaCodeSelector/index.vue";
export default { export default {
name: "EcwOceancustomerIndex", name: "EcwOceancustomerIndex",
activated() { activated() {
...@@ -387,6 +418,7 @@ export default { ...@@ -387,6 +418,7 @@ export default {
Contacts, Contacts,
Template, Template,
upload, upload,
AreaCodeSelector
}, },
data() { data() {
return { return {
...@@ -397,7 +429,7 @@ export default { ...@@ -397,7 +429,7 @@ export default {
// 导出遮罩层 // 导出遮罩层
exportLoading: false, exportLoading: false,
// 显示搜索条件 // 显示搜索条件
showSearch: true, showSearch: false,
// 总条数 // 总条数
total: 0, total: 0,
// 客户列表 // 客户列表
...@@ -420,6 +452,10 @@ export default { ...@@ -420,6 +452,10 @@ export default {
status: null, status: null,
department: null, department: null,
marketType: null, marketType: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}, },
// 表单参数 // 表单参数
form: {}, form: {},
...@@ -597,6 +633,10 @@ export default { ...@@ -597,6 +633,10 @@ export default {
department: null, department: null,
creditLevel: null, creditLevel: null,
country: null, country: null,
memberCode: null,
memberName: null,
memberMobile: null,
memberAreaCode: null
}; };
this.handleQuery(); this.handleQuery();
}, },
......
...@@ -10,79 +10,96 @@ ...@@ -10,79 +10,96 @@
<el-table-column label="新内容" prop="newValue"></el-table-column> <el-table-column label="新内容" prop="newValue"></el-table-column>
</el-table> </el-table>
</el-card> </el-card>
<el-card>
<div slot="header" class="card-title">{{ editMode ? $t('编辑订单') + '-' + form.orderNo : $t('新建订单')}}</div>
<!--默认显示类型(selectedRouter==null),如果选择路线后没开通则隐藏--> <div class="page-title">{{ editMode ? $t('编辑订单') + '-' + form.orderNo : $t('新建订单')}}</div>
<el-form-item :label="$t('订单类型')" v-if="routeOtherServices.indexOf('1') > -1 || routeOtherServices.indexOf('4') > -1">
<el-checkbox-group v-model="form.type" :disabled2="inWarehouse">
<el-checkbox label="1" v-if="routeOtherServices.indexOf('1') > -1">{{$t('集运服务')}}</el-checkbox>
<el-checkbox label="2" v-if="routeOtherServices.indexOf('4') > -1">{{$t('海外仓')}}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<div class="form-section"> <el-card class="form-section mt-10">
<el-form-item :label="$t('发货人中文名称')" prop="consignorContactsId" > <template #header>
<!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> --> <div slot="header" class="card-title">发货人</div>
<div class="contact"> </template>
<el-input v-model="form.consignorName" placeholder="" :disabled2="inWarehouse"/> <el-form-item :label="$t('名称')" prop="consignorContactsId" >
<img v-if="!updateChannel" src="@/assets/svg/contacts.svg" class="phonebook" @click="contactChooseType='consignor'" /> <!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> -->
<img v-if="!updateChannel" src="@/assets/svg/contact_create.svg" class="phonebook" @click="quickCreateType='0'" /> <div class="contact">
</div> <el-input v-model="form.consignorName" placeholder="" :disabled2="inWarehouse"/>
</el-form-item> <img v-if="!updateChannel" src="@/assets/svg/contacts.svg" class="phonebook" @click="contactChooseType='consignor'" />
<!-- v1.7新增 --> <img v-if="!updateChannel" src="@/assets/svg/contact_create.svg" class="phonebook" @click="quickCreateType='0'" />
<el-form-item :label="$t('发货人英文名称')" prop="consignorNameEn" >
<!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> -->
<div class="contact">
<el-input v-model="form.consignorNameEn" placeholder="" :disabled2="inWarehouse"/>
</div>
</el-form-item>
<el-form-item :label="$t('发货人电话')" prop="consignorPhone">
<area-code-selector v-model="form.consignorCountryCode" class="w-200 mr-10" disabled />
<el-input v-model="form.consignorPhone" class="w-200" disabled />
</el-form-item>
<el-form-item :label="$t('发货人公司中文名称')" prop="consignorPhone">
<el-input v-model="form.consignorCompany" :disabled2="inWarehouse" />
</el-form-item>
<!-- v1.7新增 -->
<el-form-item :label="$t('发货人公司英文名称')" prop="consignorPhone">
<el-input v-model="form.consignorCompanyEn" :disabled2="inWarehouse" />
</el-form-item>
<el-form-item label="Email" prop="consignorPhone">
<el-input v-model="form.consignorEmail" :disabled2="inWarehouse" />
</el-form-item>
</div> </div>
<div class="form-section"> </el-form-item>
<el-form-item :label="$t('收货人中文名称')" prop="consigneeContactsId"> <el-form-item :label="$t('电话')" prop="consignorPhone">
<!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> --> <area-code-selector v-model="form.consignorCountryCode" class="w-200 mr-10" disabled />
<div class="contact"> <el-input v-model="form.consignorPhone" class="w-200" disabled />
<el-input v-model="form.consigneeName" placeholder="" :disabled2="inWarehouse"/> </el-form-item>
<img v-if="!updateChannel" src="@/assets/svg/contacts.svg" class="phonebook" @click="contactChooseType='consignee'" />
<img v-if="!updateChannel" src="@/assets/svg/contact_create.svg" class="phonebook" @click="quickCreateType='1'" /> <el-button circle icon="el-icon-circle-plus" v-if="!showFullConsignor" @click="showFullConsignor=true"></el-button>
</div> <el-button circle icon="el-icon-remove" v-else @click="showFullConsignor=false"></el-button>
</el-form-item>
<!-- v1.7新增 --> <div v-if="showFullConsignor">
<el-form-item :label="$t('收货人英文名称')" prop="consigneeNameEn"> <el-form-item :label="$t('英文名称')" prop="consignorNameEn" >
<!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> --> <!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> -->
<div class="contact"> <div class="contact">
<el-input v-model="form.consigneeNameEn" placeholder="" :disabled2="inWarehouse"/> <el-input v-model="form.consignorNameEn" placeholder="" :disabled2="inWarehouse"/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item :label="$t('收货人电话')" prop="consigneePhone"> <el-form-item :label="$t('公司中文名称')" prop="consignorPhone">
<area-code-selector v-model="form.consigneeCountryCode" class="w-200 mr-10" disabled/> <el-input v-model="form.consignorCompany" :disabled2="inWarehouse" />
<el-input v-model="form.consigneePhone" class="w-200" disabled/> </el-form-item>
</el-form-item> <!-- v1.7新增 -->
<el-form-item :label="$t('收货人公司中文名称')" prop="consigneePhone"> <el-form-item :label="$t('公司英文名称')" prop="consignorPhone">
<el-input v-model="form.consigneeCompany" :disabled2="inWarehouse" /> <el-input v-model="form.consignorCompanyEn" :disabled2="inWarehouse" />
</el-form-item> </el-form-item>
<!-- v1.7新增 --> <el-form-item label="Email" prop="consignorPhone">
<el-form-item :label="$t('收货人公司英文名称')" prop="consigneePhone"> <el-input v-model="form.consignorEmail" :disabled2="inWarehouse" />
<el-input v-model="form.consigneeCompanyEn" :disabled2="inWarehouse" /> </el-form-item>
</el-form-item> </div>
<el-form-item label="Email" prop="consigneePhone"> </el-card>
<el-input v-model="form.consigneeEmail" :disabled2="inWarehouse"/> <el-card class="form-section mt-10">
</el-form-item> <template #header>
<div class="flex items-center">
<div slot="header" class="card-title mr-20">收货人</div>
<el-radio-group v-if="noConsignee" v-model="hasConsignee">
<el-radio :label="true">{{$t('')}}</el-radio>
<el-radio :label="false">{{$t('')}}</el-radio>
</el-radio-group>
</div>
</template>
<el-form-item :label="$t('名称')" prop="consigneeContactsId">
<!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> -->
<div class="contact">
<el-input v-model="form.consigneeName" placeholder="" :disabled="!hasConsignee"/>
<img v-if="!updateChannel && hasConsignee" src="@/assets/svg/contacts.svg" class="phonebook" @click="contactChooseType='consignee'" />
<img v-if="!updateChannel && hasConsignee" src="@/assets/svg/contact_create.svg" class="phonebook" @click="quickCreateType='1'" />
</div> </div>
</el-form-item>
<!-- v1.7新增 -->
<el-form-item :label="$t('电话')" prop="consigneePhone">
<area-code-selector v-model="form.consigneeCountryCode" class="w-200 mr-10" disabled/>
<el-input v-model="form.consigneePhone" class="w-200" disabled/>
</el-form-item>
<el-button circle icon="el-icon-circle-plus" v-if="!showFullConsignee" @click="showFullConsignee=true"></el-button>
<el-button circle icon="el-icon-remove" v-else @click="showFullConsignee=false"></el-button>
<div v-if="showFullConsignee">
<el-form-item :label="$t('英文名称')" prop="consigneeNameEn">
<!-- <customer-contact-selector v-model="form.consignorContactsId" @change="consignorContact = $event" type="1" /> -->
<div class="contact">
<el-input v-model="form.consigneeNameEn" placeholder="" :disabled="!hasConsignee"/>
</div>
</el-form-item>
<el-form-item :label="$t('公司中文名称')" prop="consigneePhone">
<el-input v-model="form.consigneeCompany" :disabled="!hasConsignee" />
</el-form-item>
<!-- v1.7新增 -->
<el-form-item :label="$t('公司英文名称')" prop="consigneePhone">
<el-input v-model="form.consigneeCompanyEn" :disabled="!hasConsignee" />
</el-form-item>
<el-form-item label="Email" prop="consigneePhone">
<el-input v-model="form.consigneeEmail" :disabled="!hasConsignee"/>
</el-form-item>
</div>
</el-card>
<el-card class="mt-10">
<div class="form-section"> <div class="form-section">
<el-form-item :label="$t('运输方式')" prop="transportId"> <el-form-item :label="$t('运输方式')" prop="transportId">
<dict-selector :type="DICT_TYPE.ECW_TRANSPORT_TYPE" v-model="form.transportId" formatter="number" <dict-selector :type="DICT_TYPE.ECW_TRANSPORT_TYPE" v-model="form.transportId" formatter="number"
...@@ -127,33 +144,13 @@ ...@@ -127,33 +144,13 @@
</el-form> </el-form>
</el-form-item> </el-form-item>
</div> </div>
<!--目的港清关:选择专线空运才显示,默认选中我司 <div>
我司选中后,按钮下方显示“多票”和“单票”的操作,默认选中多票。 <!--默认显示类型(selectedRouter==null),如果选择路线后没开通则隐藏-->
客户选中后,按钮下方显示“单票”的操作,默认选中,无需点击--> <el-form-item :label="$t('增值服务')" v-if="routeOtherServices.indexOf('1') > -1 || routeOtherServices.indexOf('4') > -1">
<div class="form-section" v-if="form.transportId == 3"> <el-checkbox-group v-model="form.type" :disabled2="inWarehouse">
<el-form-item :label="$t('目的港清关')"> <el-checkbox label="1" v-if="routeOtherServices.indexOf('1') > -1">{{$t('集运')}}</el-checkbox>
<el-radio-group v-model="form.portDestCustomsClear"> <el-checkbox label="2" v-if="routeOtherServices.indexOf('4') > -1">{{$t('海外仓')}}</el-checkbox>
<el-radio :label="1"> </el-checkbox-group>
{{$t('我司')}}
<el-tooltip effect="dark" :content="$t('我司承接')" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</el-radio>
<el-radio :label="2">
{{$t('客户')}}
<el-tooltip effect="dark" :content="$t('客户自清')" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="form-section" v-if="form.transportId == 3">
<el-form-item :label="$t('发货方式')">
<el-radio-group v-model="form.deliveryWay">
<el-radio :label="1" v-if="form.portDestCustomsClear == 1">{{$t('多票')}}</el-radio>
<el-radio :label="2">{{$t('单票')}}</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
</el-card> </el-card>
...@@ -161,8 +158,8 @@ ...@@ -161,8 +158,8 @@
<div slot="header" class="card-title"> <div slot="header" class="card-title">
<!--lanbm 根据需求文档改 商品信息 为 商品 --> <!--lanbm 根据需求文档改 商品信息 为 商品 -->
<div class="card-name">{{$t('商品')}}</div> <div class="card-name">{{$t('商品')}}</div>
<el-button type="primary" size="mini" @click="addProduct(null)" :disabled="!canAddProduct || !productEditable || updateChannel">{{$t('添加货物')}}</el-button> <el-button type="primary" size="mini" @click="addProduct(null)" :disabled="!canAddProduct || !productEditable || updateChannel">{{$t('添加')}}</el-button>
<el-button type="primary" size="mini" @click="showBatchImportDialog=true" :disabled="!canAddProduct || !productEditable || updateChannel">{{$t('批量添加货物')}}</el-button> <el-button type="primary" size="mini" @click="showBatchImportDialog=true" :disabled="!canAddProduct || !productEditable || updateChannel">{{$t('批量添加')}}</el-button>
</div> </div>
<el-table :data="form.orderItemVOList" border class="product-list" v-if="!initing"> <el-table :data="form.orderItemVOList" border class="product-list" v-if="!initing">
<el-table-column :label="$t('序号')" width="60px" fixed> <el-table-column :label="$t('序号')" width="60px" fixed>
...@@ -353,145 +350,151 @@ ...@@ -353,145 +350,151 @@
<el-form-item :label="$t('唛头')" prop="marks" > <el-form-item :label="$t('唛头')" prop="marks" >
<el-input v-model="form.marks" ></el-input> <el-input v-model="form.marks" ></el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('是否控货')" prop="isCargoControl" class="ml-20"> <el-form-item :label="$t('单证报关')" :span="2" prop="customsType">
<template #label> <template #label>
{{$t('是否控货')}} {{$t('单证报关')}}
<el-tooltip effect="dark" :content="$t('是指由发货人与收货人约定在货物的国际运输过程中,我司作为第三方对该货物货权的控制;需由发货人授权我司放货的情况下收货人才能提取该票货物的一种交易方式')" placement="top"> <el-tooltip effect="dark" :content="$t('我司全代 : 该货物的出口手续由我司代为办理 ; 自单代报: 该货物由发货人提供相关出口单证并委托我司代为办理 ;混单代报该货物有以上两种情况出现')" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<dict-selector :type="DICT_TYPE.ECW_CUSTOMS_TYPE" v-model="form.customsType" form-type="radio" defaultable :disabled="false" />
<!--自单代报显示提示-->
<div v-if="+form.customsType === 2" style="color:red;font-size:14px">{{$t('报关退税,请备齐资料。')}}</div>
</el-form-item>
</div>
<div class="form-section" v-if="form.transportId == 3">
<!--目的港清关:选择专线空运才显示,默认选中我司
我司选中后,按钮下方显示“多票”和“单票”的操作,默认选中多票。
客户选中后,按钮下方显示“单票”的操作,默认选中,无需点击-->
<div class="form-section">
<el-form-item :label="$t('目的港清关')">
<el-radio-group v-model="form.portDestCustomsClear">
<el-radio :label="1">
{{$t('我司')}}
<el-tooltip effect="dark" :content="$t('我司承接')" placement="top">
<i class="el-icon-question"></i> <i class="el-icon-question"></i>
</el-tooltip> </el-tooltip>
</template> </el-radio>
<dict-selector :type="DICT_TYPE.INFRA_BOOLEAN_STRING" <el-radio :label="2">
v-model="form.isCargoControl" {{$t('客户')}}
formatter="bool" <el-tooltip effect="dark" :content="$t('客户自清')" placement="top">
form-type="radio"
:filter="(item) => {
return selectedRouter && selectedRouter.controlStatus === 1 && item.value === 'true' ? false : true
}"
/>
</el-form-item>
</div>
<div class="form-section" v-if="collectionProxy">
<el-form-item :label="$t('是否代收货款')" prop="isCollection">
<dict-selector :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" v-model="form.isCollection" form-type="radio" :disabled="false" />
</el-form-item>
<!--代收货款,只有非控货订单、并且线路开通了代收货款后,才显示是否代收货款选项-->
<el-form-item :label="$t('代收货款金额')" v-if="collectionProxy && form.isCollection" prop="collectionProxy" class="ml-20">
<el-input type="number" v-model="form.collectionProxy" class="w-200 mr-10" :disabled="false"></el-input>
<selector v-model="form.collectionProxyCurrency" :options="currencyList" label-field="titleZh" value-field="id" defaultable class="w-100" :disabled="false"/>
</el-form-item>
</div>
<div class="form-section">
<el-form-item :label="$t('单证报关')" :span="2" prop="customsType">
<template #label>
{{$t('单证报关')}}
<el-tooltip effect="dark" :content="$t('我司全代 : 该货物的出口手续由我司代为办理 ; 自单代报: 该货物由发货人提供相关出口单证并委托我司代为办理 ;混单代报该货物有以上两种情况出现')" placement="top">
<i class="el-icon-question"></i> <i class="el-icon-question"></i>
</el-tooltip> </el-tooltip>
</template> </el-radio>
<dict-selector :type="DICT_TYPE.ECW_CUSTOMS_TYPE" v-model="form.customsType" form-type="radio" defaultable :disabled="false" /> </el-radio-group>
<!--自单代报显示提示-->
<div v-if="+form.customsType === 2" style="color:red;font-size:14px">{{$t('报关退税,请备齐资料。')}}</div>
</el-form-item> </el-form-item>
</div> </div>
<div> <div class="form-section">
<el-form-item :label="$t('出单方式')" prop="issuingMethod"> <el-form-item :label="$t('发货方式')">
<dict-selector :type="DICT_TYPE.ECW_SUING_METHOD" v-model="form.issuingMethod" form-type="radio" defaultable :disabled="false"/> <el-radio-group v-model="form.deliveryWay">
<el-radio :label="1" v-if="form.portDestCustomsClear == 1">{{$t('多票')}}</el-radio>
<el-radio :label="2">{{$t('单票')}}</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</div>
</div> </div>
<div> <div class="form-section">
<el-form-item :label="$t('入仓类型')" prop="warehouseType"> <el-form-item :label="$t('是否控货')" prop="isCargoControl" class="ml-20">
<dict-selector :type="DICT_TYPE.ECW_WAREHOUSING_TYPE" v-model="form.warehouseType" defaultable :disabled="false" /> <template #label>
</el-form-item> {{$t('是否控货')}}
<el-tooltip effect="dark" :content="$t('是指由发货人与收货人约定在货物的国际运输过程中,我司作为第三方对该货物货权的控制;需由发货人授权我司放货的情况下收货人才能提取该票货物的一种交易方式')" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<!--无收货人的情况下必须控货且不能更改-->
<dict-selector :type="DICT_TYPE.INFRA_BOOLEAN_STRING"
v-model="form.isCargoControl"
formatter="bool"
form-type="radio"
:disabled="!hasConsignee"
:filter="(item) => {
return selectedRouter && selectedRouter.controlStatus === 1 && item.value === 'true' ? false : true
}"
/>
</el-form-item>
<el-form-item :label="$t('付款人')" prop="drawee">
<dict-selector :formatter="Number" :type="DICT_TYPE.DRAWEE" v-model="form.drawee" defaultable form-type="radio" :disabled="false"/>
<el-table :data="customDraweeList" v-if="form.drawee==3" >
<el-table-column :label="$t('费用类型')" prop="label" width="200px"></el-table-column>
<el-table-column :label="$t('付款人')" width="300px">
<template slot-scope="{row}">
<dict-selector :formatter="Number" :type="DICT_TYPE.DRAWEE" :filter="(e) => e.value == 1 || e.value == 2" v-model="row.value" form-type="radio" :disabled="false"/>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item :label="$t('提单是否显示价格')" prop="displayBillLadingPrice">
<el-radio-group v-model="form.displayBillLadingPrice">
<el-radio :label="true">{{$t('显示')}}</el-radio>
<el-radio :label="false">{{$t('不显示')}}</el-radio>
</el-radio-group>
</el-form-item>
</div> </div>
<div> <div class="form-section flex">
<el-form-item :label="$t('入仓类型')" prop="warehouseType">
<dict-selector :type="DICT_TYPE.ECW_WAREHOUSING_TYPE" v-model="form.warehouseType" defaultable :disabled="false" />
</el-form-item>
<div>
<el-form-item :label="$t('外部仓库')" prop="isExternalWarehouse"> <el-form-item :label="$t('外部仓库')" prop="isExternalWarehouse">
<el-checkbox label="" v-model="form.isExternalWarehouse" @change="form.isExternalWarehouse=$event" :disabled="false"></el-checkbox> <el-checkbox label="" v-model="form.isExternalWarehouse" @change="form.isExternalWarehouse=$event" :disabled="false"></el-checkbox>
</el-form-item> </el-form-item>
<div v-if="form.isExternalWarehouse" class="pl-50"> <div v-if="form.isExternalWarehouse">
<div v-for="(item, index) in form.externalWarehouseDtoList" class="flex" :key="index"> <div v-for="(item, index) in form.externalWarehouseDtoList" class="flex" :key="index">
<div class="w-300"> <div class="w-300">
<el-form-item :label="$t('装货时间')" <el-form-item :label="$t('装货时间')"
:prop="'externalWarehouseDtoList.' + index + '.estLoadingTime'" :prop="'externalWarehouseDtoList.' + index + '.estLoadingTime'"
:rules="{ :rules="{
required: true, message: '装货时间不能为空', trigger: 'blur' required: true, message: '装货时间不能为空', trigger: 'blur'
}" }"
> >
<el-date-picker v-model="item.estLoadingTime" value-format="yyyy-MM-dd HH:mm:ss" class="w-200"></el-date-picker> <el-date-picker v-model="item.estLoadingTime" value-format="yyyy-MM-dd HH:mm:ss" class="w-200"></el-date-picker>
</el-form-item> </el-form-item>
</div> </div>
<div class="w-500"> <div class="w-500">
<el-form-item :label="$t('装货地址')" <el-form-item :label="$t('装货地址')"
:prop="'externalWarehouseDtoList.' + index + '.loadingAddress'" :prop="'externalWarehouseDtoList.' + index + '.loadingAddress'"
:rules="{ :rules="{
required: true, message: '装货地址不能为空', trigger: 'blur' required: true, message: '装货地址不能为空', trigger: 'blur'
}" }"
> >
<el-input v-model="item.loadingAddress" placeholder="" class="w-200"></el-input> <el-input v-model="item.loadingAddress" placeholder="" class="w-200"></el-input>
</el-form-item> </el-form-item>
<el-button type="primary" icon="el-icon-plus" v-if="index==0" @click="form.externalWarehouseDtoList.push({})"></el-button> <el-button type="primary" icon="el-icon-plus" v-if="index==0" @click="form.externalWarehouseDtoList.push({})"></el-button>
<el-button type="danger" icon="el-icon-delete" v-else-if="index == form.externalWarehouseDtoList.length-1" @click="form.externalWarehouseDtoList.splice(index, 1)"></el-button> <el-button type="danger" icon="el-icon-delete" v-else-if="index == form.externalWarehouseDtoList.length-1" @click="form.externalWarehouseDtoList.splice(index, 1)"></el-button>
</div>
</div> </div>
</div>
</div> </div>
</div>
</div> </div>
<div v-if="!form.isExternalWarehouse"> <div class="form-section">
<el-form-item :label="$t('预计送货日期')" prop="deliveryDate"> <el-form-item :label="$t('预计送货日期')" prop="deliveryDate" v-if="!form.isExternalWarehouse">
<el-date-picker v-model="form.deliveryDate" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker> <el-date-picker v-model="form.deliveryDate" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="$t('是否代收货款')" prop="isCollection" v-if="collectionProxy">
<dict-selector :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" v-model="form.isCollection" form-type="radio" :disabled="false" />
</el-form-item>
<!--代收货款,只有非控货订单、并且线路开通了代收货款后,才显示是否代收货款选项-->
<el-form-item :label="$t('代收货款金额')" v-if="collectionProxy && form.isCollection" prop="collectionProxy" class="ml-20">
<el-input type="number" v-model="form.collectionProxy" class="w-200 mr-10" :disabled="false"></el-input>
<selector v-model="form.collectionProxyCurrency" :options="currencyList" label-field="titleZh" value-field="id" defaultable class="w-100" :disabled="false"/>
</el-form-item>
</div> </div>
<div> <div class="form-section flex">
<el-form-item :label="$t('收货方式')" prop="harvestMethod" class="ml-20"> <el-form-item :label="$t('收货方式')" prop="harvestMethod" class="ml-20">
<!-- <el-select v-model="harvestMethod2" @change="handleChange">
<dict-selector :type="DICT_TYPE.ECW_HARVEST_METHOD" <el-option
v-model="form.harvestMethod" :filter="item => item.value == 1 v-for="dict in lunchList"
|| homeDeliveryService" defaultable :disabled="false" />--> :key="dict.value"
:label="dict.label"
<el-select v-model="harvestMethod2" @change="handleChange"> :value="dict.value"
<el-option ></el-option>
v-for="dict in lunchList" </el-select>
:key="dict.value" </el-form-item>
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item> <el-form-item :label="$t('关联报价单')" prop="offerId">
</div> <span v-if="offerIdNochange&&offerNumber">{{offerNumber}}</span>
<div v-if="showAdress">
<el-form-item :label="$t('收货地区')" prop="country">
<area-selector
:country="form.consigneeVO ? form.consigneeVO.country : undefined"
:province="form.consigneeVO ? form.consigneeVO.province : undefined"
:city="form.consigneeVO ? form.consigneeVO.city : undefined"
@countryChange="onAreaChange('country', $event)"
@provinceChange="onAreaChange('province', $event)"
@cityChange="onAreaChange('city', $event)"
:disabled="false"
></area-selector>
</el-form-item>
<br/>
<el-form-item :label="$t('收货详细地址')" prop="consigneeAddress">
<el-input v-model="form.consigneeAddress" :disabled="false" class="w-300"></el-input>
</el-form-item>
</div>
<div>
<el-form-item :label="$t('付款人')" prop="drawee">
<dict-selector :formatter="Number" :type="DICT_TYPE.DRAWEE" v-model="form.drawee" defaultable form-type="radio" :disabled="false"/>
<el-table :data="customDraweeList" v-if="form.drawee==3" >
<el-table-column :label="$t('费用类型')" prop="label" width="200px"></el-table-column>
<el-table-column :label="$t('付款人')" width="300px">
<template slot-scope="{row}">
<dict-selector :formatter="Number" :type="DICT_TYPE.DRAWEE" :filter="(e) => e.value == 1 || e.value == 2" v-model="row.value" form-type="radio" :disabled="false"/>
</template>
</el-table-column>
</el-table>
</el-form-item>
</div>
<el-form-item :label="$t('关联报价单')" prop="offerId">
<span v-if="offerIdNochange&&offerNumber">{{offerNumber}}</span>
<el-select <el-select
v-else v-else
v-model="form.offerId" v-model="form.offerId"
filterable filterable
clearable clearable
...@@ -506,74 +509,85 @@ ...@@ -506,74 +509,85 @@
:value="item.offerId" :value="item.offerId"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<div> </div>
<el-form-item :label="$t('提单是否显示价格')" prop="displayBillLadingPrice"> <div class="form-section" v-if="showAdress">
<el-radio-group v-model="form.displayBillLadingPrice"> <el-form-item :label="$t('收货地区')" prop="country">
<el-radio :label="true">{{$t('显示')}}</el-radio> <area-selector
<el-radio :label="false">{{$t('不显示')}}</el-radio> :country="form.consigneeVO ? form.consigneeVO.country : undefined"
</el-radio-group> :province="form.consigneeVO ? form.consigneeVO.province : undefined"
:city="form.consigneeVO ? form.consigneeVO.city : undefined"
@countryChange="onAreaChange('country', $event)"
@provinceChange="onAreaChange('province', $event)"
@cityChange="onAreaChange('city', $event)"
:disabled="false"
></area-selector>
</el-form-item>
<br/>
<el-form-item :label="$t('收货详细地址')" prop="consigneeAddress">
<el-input v-model="form.consigneeAddress" :disabled="false" class="w-300"></el-input>
</el-form-item> </el-form-item>
</div> </div>
</el-card> </el-card>
<el-card class="mt-10">
<el-card class="mt-10" v-if="transport"> <template #header>
<div class="card-title" slot="header">{{$l(transport, 'label')}}</div> <div class="card-title">其他</div>
<el-form-item :label="$t('快递单号')"> </template>
<div class="form-section">
<el-form-item :label="$t('特殊要求')" >
<template #label>
{{$t('特殊要求')}}
<el-tooltip effect="dark" :content="$t('如需我司打包,请勾选相应选项,费用付款人及打包要求可备注补充')" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<dict-selector v-model="form.packageTypeArr" form-type="checkbox" :type="DICT_TYPE.ORDER_SPECIAL_NEEDS" multiple :disabled="false"/>
</el-form-item>
<el-form-item :label="$t('特殊要求备注')">
<el-input v-model="form.packageRemarks" :disabled="false" ></el-input>
</el-form-item>
</div>
<div class="form-section">
<el-form-item :label="$t('快递单号')">
<el-input v-model="form.number" :placeholder="$t('请输入购买商品的快递单号')" :disabled="false"> <el-input v-model="form.number" :placeholder="$t('请输入购买商品的快递单号')" :disabled="false">
<el-button type="primary" slot="append" @click="getOrderCourierNumber" :disabled="false">{{$t('生成单号')}}</el-button> <el-button type="primary" slot="append" @click="getOrderCourierNumber" :disabled="false">{{$t('生成单号')}}</el-button>
</el-input> </el-input>
</el-form-item> </el-form-item>
<div v-if="[2,3,4].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('是否双清')">
<dict-selector v-model="form.doubleClear" form-type="radio" :type="DICT_TYPE.ECW_DOUBLE_CLEAR" defaultable :disabled="false" />
</el-form-item>
</div>
<!--<div v-if="[3,4].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('航空公司')">
<supplier-selector v-model="form.airlineCompany" company-type="10" :disabled="false"/>
</el-form-item>
</div>-->
<div v-if="[2].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('船公司')">
<supplier-selector v-model="form.shippingCompany" company-type="9" :disabled="false" />
</el-form-item>
</div>
<div v-if="[2,3,4].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('清关证书')">
<dict-selector v-model="form.customsClearCert" form-type="radio" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" :defaultable="!editMode" :disabled="false" />
</el-form-item>
<el-form-item :label="$t('清关证书备注')" >
<el-input v-model="form.customsClearCertRemarks" :disabled="false"></el-input>
</el-form-item>
</div> </div>
<div v-if="[3,4].indexOf(+form.transportId) > -1"> <div class="form-section" v-if="[2,3,4].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('是否拆包')"> <el-form-item :label="$t('清关证书')">
<dict-selector v-model="form.isUnpack" form-type="radio" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" :defaultable="!editMode" :disabled="false" /> <dict-selector v-model="form.customsClearCert" form-type="radio" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" :defaultable="!editMode" :disabled="false" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('清关证书备注')" >
<el-input v-model="form.customsClearCertRemarks" :disabled="false"></el-input>
</el-form-item>
</div> </div>
<div class="form-section"> <div class="form-section"v-if="[3,4].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('单票立刻转运')" v-if="[3,4].indexOf(+form.transportId) > -1"> <el-form-item :label="$t('是否拆包')">
<dict-selector v-model="form.isSingleTicketTransport" form-type="radio" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" :defaultable="!editMode" :disabled="false" /> <dict-selector v-model="form.isUnpack" form-type="radio" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" :defaultable="!editMode" :disabled="false" />
<span style="margin-left:10px">{{$t('注:若只有一件,货到仓库立即发,选“是”,多件需仓库集运待发,选“否”')}}</span> </el-form-item>
</el-form-item> <el-form-item :label="$t('单票立刻转运')" v-if="[3,4].indexOf(+form.transportId) > -1">
<dict-selector v-model="form.isSingleTicketTransport" form-type="radio" :type="DICT_TYPE.INFRA_BOOLEAN_STRING" formatter="bool" :defaultable="!editMode" :disabled="false" />
<span style="margin-left:10px">{{$t('注:若只有一件,货到仓库立即发,选“是”,多件需仓库集运待发,选“否”')}}</span>
</el-form-item>
</div> </div>
<div class="form-section"> <!-- 20240823 新需求改动:屏蔽出单方式 和 是否双清字段
<el-form-item :label="$t('特殊要求')" > https://471hsh.axshare.com/?id=uc7auj&p=%E5%90%8E%E5%8F%B0%E5%88%9B%E5%BB%BA%E8%AE%A2%E5%8D%95%E9%A1%B5%E9%9D%A2&g=1
<template #label> <el-form-item :label="$t('出单方式')" prop="issuingMethod">
{{$t('特殊要求')}} <dict-selector :type="DICT_TYPE.ECW_SUING_METHOD" v-model="form.issuingMethod" form-type="radio" defaultable :disabled="false"/>
<el-tooltip effect="dark" :content="$t('如需我司打包,请勾选相应选项,费用付款人及打包要求可备注补充')" placement="top"> </el-form-item>
<i class="el-icon-question"></i> <div v-if="[2,3,4].indexOf(+form.transportId) > -1">
</el-tooltip> <el-form-item :label="$t('是否双清')">
</template> <dict-selector v-model="form.doubleClear" form-type="radio" :type="DICT_TYPE.ECW_DOUBLE_CLEAR" defaultable :disabled="false" />
<dict-selector v-model="form.packageTypeArr" form-type="checkbox" :type="DICT_TYPE.ORDER_SPECIAL_NEEDS" multiple :disabled="false"/>
</el-form-item> </el-form-item>
</div> </div>
<el-form-item :label="$t('特殊要求备注')"> </div>-->
<el-input v-model="form.packageRemarks" :disabled="false" ></el-input> <!--20240823 新需求原型没有船公司字段,暂时屏蔽
<div v-if="[2].indexOf(+form.transportId) > -1">
<el-form-item :label="$t('船公司')">
<supplier-selector v-model="form.shippingCompany" company-type="9" :disabled="false" />
</el-form-item> </el-form-item>
</div>-->
</el-card> </el-card>
<el-card class="mt-10" v-if="showWorkFlow"> <el-card class="mt-10" v-if="showWorkFlow">
...@@ -669,6 +683,7 @@ import WorkFlow from '@/components/WorkFlow' ...@@ -669,6 +683,7 @@ import WorkFlow from '@/components/WorkFlow'
import { getCustomer } from "@/api/ecw/customer"; import { getCustomer } from "@/api/ecw/customer";
import {debounce} from "@/utils"; import {debounce} from "@/utils";
import { getOfferSelect, getOfferCheck } from "@/api/ecw/offer" import { getOfferSelect, getOfferCheck } from "@/api/ecw/offer"
import Template from '@/views/cms/template/index.vue'
// 缓存默认的表单数据 // 缓存默认的表单数据
let makeDefaultFormData = () => { let makeDefaultFormData = () => {
...@@ -691,6 +706,7 @@ window.Decimal = Decimal ...@@ -691,6 +706,7 @@ window.Decimal = Decimal
export default { export default {
name: "EcwOrderEdit", name: "EcwOrderEdit",
components: { components: {
Template,
ProductSelector, Selector, CustomerContactSelector, AreaSelector, FileUpload, AreaCodeSelector, ChooseContactDialog, QuickCreateCustomer, SupplierSelector, WorkFlow ProductSelector, Selector, CustomerContactSelector, AreaSelector, FileUpload, AreaCodeSelector, ChooseContactDialog, QuickCreateCustomer, SupplierSelector, WorkFlow
}, },
data() { data() {
...@@ -703,7 +719,7 @@ export default { ...@@ -703,7 +719,7 @@ export default {
callback(); callback();
} }
return { return {
validatorPositiveNumber, validatorPositiveNumber,
customDraweeList: [], customDraweeList: [],
// draweeList: [], // draweeList: [],
// 遮罩层 // 遮罩层
...@@ -747,6 +763,14 @@ export default { ...@@ -747,6 +763,14 @@ export default {
{ label: "自提", value: 1 }, { label: "自提", value: 1 },
{ label: "送货上门", value: 2 }, { label: "送货上门", value: 2 },
], ],
// 发货人是否允许控货无收货人
noConsignee: false,
// 是否有收货人
hasConsignee: true,
// 是否展示全部发货人信息
showFullConsignor: false,
// 是否展示全部收货人信息
showFullConsignee: false,
}; };
}, },
computed:{ computed:{
...@@ -756,10 +780,11 @@ export default { ...@@ -756,10 +780,11 @@ export default {
{required: true, message: this.$t('请填写唛头')}, {required: true, message: this.$t('请填写唛头')},
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if(!/[a-zA-Z]/.test(value.charAt(0))){ /* 20240823 新需求:唛头数据校验修改成字母+数字组合,去掉原必须字母开头的限制
return callback(new Error(this.$t('唛头必须以字母开头'))) if(!/[a-zA-Z]/.test(value.charAt(0))){
} return callback(new Error(this.$t('唛头必须以字母开头')))
callback() } */
callback()
}, },
trigger: 'blur' trigger: 'blur'
} }
...@@ -905,6 +930,12 @@ export default { ...@@ -905,6 +930,12 @@ export default {
} }
}, },
watch:{ watch:{
// 如果无收货人则必须控货
hasConsignee(val){
if(!val){
this.$set(this.form, 'isCargoControl', true)
}
},
ccIdArr(arr){ ccIdArr(arr){
this.$set(this.form, 'ccIds', arr.join(",")) this.$set(this.form, 'ccIds', arr.join(","))
}, },
...@@ -1311,6 +1342,13 @@ export default { ...@@ -1311,6 +1342,13 @@ export default {
this.$set(this.form, this.contactChooseType + 'Name', contact.contactsName) this.$set(this.form, this.contactChooseType + 'Name', contact.contactsName)
this.$set(this.form, this.contactChooseType + 'NameEn', contact.contactsNameEn||'') this.$set(this.form, this.contactChooseType + 'NameEn', contact.contactsNameEn||'')
this.$set(this.form, this.contactChooseType + 'Phone', contact.phoneNew) this.$set(this.form, this.contactChooseType + 'Phone', contact.phoneNew)
this.noConsignee = contact.noConsignee
// 如果发货人不允许无收货人,则重置为有收货人
if(!this.noConsignee && !this.hasConsignee){
this.$set(this, 'hasConsignee', true)
}
this.contactChooseType = null this.contactChooseType = null
this.quickCreateType = null this.quickCreateType = null
if(this.form.lineId) this.getOfferData() if(this.form.lineId) this.getOfferData()
......
...@@ -1047,12 +1047,13 @@ ...@@ -1047,12 +1047,13 @@
:placeholder="$t('整数或者两位小数')" :placeholder="$t('整数或者两位小数')"
class="w100" class="w100"
/> />
<span {{ currencyMap[scope.row.seaFreightCurrency] }} /
>{{ currencyMap[scope.row.seaFreightCurrency] }} / {{ unitMap[scope.row.seaFreightVolume] }}
{{ unitMap[scope.row.seaFreightVolume] }}</span <!--template v-else>
> <selector v-model="scope.row.seaFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" class="w100" />
<!-- <selector v-model="scope.row.seaFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> /
/ <selector v-model="scope.row.seaFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> --> <selector v-model="scope.row.seaFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" class="w100" />
</template-->
</div> </div>
</div> </div>
<div v-else class="channel"> <div v-else class="channel">
...@@ -1100,12 +1101,12 @@ ...@@ -1100,12 +1101,12 @@
:placeholder="$t('整数或者两位小数')" :placeholder="$t('整数或者两位小数')"
class="w100" class="w100"
/> />
<span {{ currencyMap[scope.row.clearanceFreightCurrency] }} /
>{{ currencyMap[scope.row.clearanceFreightCurrency] }} / {{ unitMap[scope.row.clearanceFreightVolume] }}
{{ unitMap[scope.row.clearanceFreightVolume] }}</span <!--
> <selector v-model="scope.row.clearanceFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" class="w100" />
<!-- <selector v-model="scope.row.clearanceFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> / <selector v-model="scope.row.clearanceFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" class="w100" />
/ <selector v-model="scope.row.clearanceFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 class="w100" /> --> -->
</div> </div>
</div> </div>
<div v-else> <div v-else>
...@@ -1133,52 +1134,31 @@ ...@@ -1133,52 +1134,31 @@
handlerParams.orderExceptionHandlerResult == 'allow_over') handlerParams.orderExceptionHandlerResult == 'allow_over')
" "
> >
<div v-for="row in loopOrderItem" :key="row.orderItemId"> <div v-for="row in loopOrderItem" :key="row.orderItemId">
<div v-if="row.charging == 1">
<div
v-if="orderExceptionData.orderExceptionStatus == 0"
class="price_list"
>
<div class="price_label">{{ $t("全包价") }}:</div>
<div v-if="!row.seaFreightCurrency || !row.seaFreightVolume">
/
</div>
<div v-else>
<inputor
default2="0"
style="width: 100px"
v-model.number="row.oneSeaFreight"
type="number"
:placeholder="$t('整数或者两位小数')"
/>
<span
>{{ currencyMap[row.seaFreightCurrency] }} /
{{ unitMap[row.seaFreightVolume] }}</span
>
<!-- <selector v-model="row.seaFreightCurrency" style="width:100px" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 />
/ <selector v-model="row.seaFreightVolume" style="width:100px" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 /> -->
</div>
</div>
<div v-else class="price_list">
<div v-if="!row.oneSeaFreight">
<span class="price_label">{{ $t("全包价") }}:</span>
<span>{{ $t("未报价") }}</span>
</div>
<div v-else>
<span class="price_label">{{ $t("全包价") }}:</span>
<span
>{{ row.oneSeaFreight }}
{{ currencyMap[row.seaFreightCurrency] }} /
{{ unitMap[row.seaFreightVolume] }}</span
>
</div>
</div>
</div>
<div v-else>
<!-- <span v-if="!scope.row.oneSeaFreight">{{$t('运费')}}:{{$t('未报价')}}</span> --> <!-- <span v-if="!scope.row.oneSeaFreight">{{$t('运费')}}:{{$t('未报价')}}</span> -->
<div v-if="orderExceptionData.orderExceptionStatus == 0"> <div v-if="orderExceptionData.orderExceptionStatus == 0">
<div class="price_list"> <div>
<div class="price_label">{{ $t("运费") }}:</div> <el-form-item v-if="unitChangable && handlerParams.orderExceptionHandlerResult != 'confirmed_return'" :label="$t('是否预付')">
<el-radio-group v-model="row.needPay">
<el-radio :label="1">{{ $t("预付") }}</el-radio>
<el-radio :label="0">{{ $t("均可") }}</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div>
<el-form-item v-if="unitChangable && handlerParams.orderExceptionHandlerResult != 'confirmed_return'" :label="$t('单价模式')">
<dict-selector
:type="DICT_TYPE.ECW_PRICE_TYPE"
v-model="row.charging"
form-type="radio"
formatter="number"
/>
</el-form-item>
</div>
<div class="price_list" v-if="handlerParams.orderExceptionHandlerResult != 'confirmed_return'">
<div class="price_label">{{ row.charging == 1 ? $t('全包价') : $t("运费") }}:</div>
<div class="price_list"> <div class="price_list">
<div <div
v-if="!row.seaFreightCurrency || !row.seaFreightVolume" v-if="!row.seaFreightCurrency || !row.seaFreightVolume"
...@@ -1193,16 +1173,18 @@ ...@@ -1193,16 +1173,18 @@
type="number" type="number"
:placeholder="$t('整数或者两位小数')" :placeholder="$t('整数或者两位小数')"
/> />
<span <span v-if="!unitChangable">
>{{ currencyMap[row.seaFreightCurrency] }} / {{ currencyMap[row.seaFreightCurrency] }} /
{{ unitMap[row.seaFreightVolume] }}</span {{ unitMap[row.seaFreightVolume] }}
> </span>
<!-- <selector style="width:100px" v-model="row.seaFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 /> <template v-else>
/ <selector style="width:100px" v-model="row.seaFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 /> --> <selector style="width:100px" v-model="row.seaFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 />
/ <selector style="width:100px" v-model="row.seaFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 />
</template>
</div> </div>
</div> </div>
</div> </div>
<div class="price_list"> <div class="price_list" v-if="(row.charging === 0 || row.charging === '0') && handlerParams.orderExceptionHandlerResult != 'confirmed_return'">
<div class="price_label">{{ $t("清关费") }}:</div> <div class="price_label">{{ $t("清关费") }}:</div>
<div class="price_list"> <div class="price_list">
<div <div
...@@ -1221,12 +1203,14 @@ ...@@ -1221,12 +1203,14 @@
type="number" type="number"
:placeholder="$t('整数或者两位小数')" :placeholder="$t('整数或者两位小数')"
/> />
<span <span v-if="!unitChangable">
>{{ currencyMap[row.clearanceFreightCurrency] }} / {{ currencyMap[row.clearanceFreightCurrency] }} /
{{ unitMap[row.clearanceFreightVolume] }}</span {{ unitMap[row.clearanceFreightVolume] }}
> </span>
<!-- <selector style="width:100px" v-model="row.clearanceFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" defaultable2 /> <template v-else>
/ <selector style="width:100px" v-model="row.clearanceFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" defaultable2 /> --> <selector style="width:100px" v-model="row.clearanceFreightCurrency" :options="currencyList" :label-field="$l('title')" value-field="id" />
/ <selector style="width:100px" v-model="row.clearanceFreightVolume" :options="unitList" :label-field="$l('title')" value-field="id" />
</template>
</div> </div>
</div> </div>
</div> </div>
...@@ -1261,7 +1245,6 @@ ...@@ -1261,7 +1245,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
</div> </div>
<!--预付异常的备选需要根据接口数据过滤--> <!--预付异常的备选需要根据接口数据过滤-->
...@@ -2280,6 +2263,8 @@ export default { ...@@ -2280,6 +2263,8 @@ export default {
selectLine: null, selectLine: null,
calculating: false, // 是否正在计算费用,防止频繁重新请求, calculating: false, // 是否正在计算费用,防止频繁重新请求,
loopOrderItem: [], //线路单询异常清关费, loopOrderItem: [], //线路单询异常清关费,
// 単询异常是否可以更改单位
unitChangable: false
}; };
}, },
activated() { activated() {
...@@ -2331,7 +2316,7 @@ export default { ...@@ -2331,7 +2316,7 @@ export default {
this.orderExceptionData.orderExceptionAmountCurrencyId this.orderExceptionData.orderExceptionAmountCurrencyId
); );
} }
if ( if (
this.orderExceptionData.orderExceptionType == this.orderExceptionData.orderExceptionType ==
"not_shipping_channel_exception" "not_shipping_channel_exception"
...@@ -2493,6 +2478,7 @@ export default { ...@@ -2493,6 +2478,7 @@ export default {
that.loading = true; that.loading = true;
getExceptionById(that.orderExceptionId).then((response) => { getExceptionById(that.orderExceptionId).then((response) => {
that.orderExceptionData = response.data; that.orderExceptionData = response.data;
that.loading = false; that.loading = false;
that.orderId = response.data.orderId; that.orderId = response.data.orderId;
that.getOrderData(); that.getOrderData();
...@@ -2578,6 +2564,19 @@ export default { ...@@ -2578,6 +2564,19 @@ export default {
//not_shipping_channel_exception 不可出渠道异常 //not_shipping_channel_exception 不可出渠道异常
getOrder(this.orderId).then((response) => { getOrder(this.orderId).then((response) => {
this.orderData = response.data; this.orderData = response.data;
const orderItem = this.orderData.orderItemVOList.find(item => item.orderItemId === this.orderExceptionData.orderItemId)
console.log("uniChangable", this.orderExceptionData.orderExceptionStatus,
this.orderExceptionData.orderExceptionType,
orderItem?.oneSeaFreight, orderItem?.oneClearanceFreight)
// 待处理 且 単询异常 且 清关费和运费为0则可以修改单位
if(
this.orderExceptionData.orderExceptionStatus == 0 &&
this.orderExceptionData.orderExceptionType === "line_loop_exception" &&
orderItem && orderItem.oneSeaFreight === 0 && orderItem.oneClearanceFreight === 0
){
this.unitChangable = true
}else this.unitChangable = false
if (this.orderData.channelId != 0) { if (this.orderData.channelId != 0) {
this.channelList.map((v) => { this.channelList.map((v) => {
if (v.channelId == this.orderData.channelId) { if (v.channelId == this.orderData.channelId) {
......
...@@ -952,10 +952,10 @@ export default { ...@@ -952,10 +952,10 @@ export default {
isAllProduct: 0, isAllProduct: 0,
}); });
if (this.form.needOrderInquiry == 0) { // 阶梯价
//不是单询价才校验价格参数 lanbm 2024-06-17 if (this.form.stepPrice) {
// 阶梯价 // 单询不校验
if (this.form.stepPrice) { if (this.form.needOrderInquiry == 0) {
let isValid = true; let isValid = true;
for (let stepPrice of this.$refs.stepPrice) { for (let stepPrice of this.$refs.stepPrice) {
if (!stepPrice.validate()) { if (!stepPrice.validate()) {
...@@ -964,26 +964,34 @@ export default { ...@@ -964,26 +964,34 @@ export default {
} }
} }
if (!isValid) return; if (!isValid) return;
}
// 全包价 // 全包价
if (this.form.priceType == 1) { if (this.form.priceType == 1) {
data.fullPriceStepList = this.getPriceList( data.fullPriceStepList = this.getPriceList(
this.form.fullPriceStepList this.form.fullPriceStepList
); );
delete data.clearancePriceStepList; delete data.clearancePriceStepList;
delete data.freightPriceStepList; delete data.freightPriceStepList;
} else { } else {
data.clearancePriceStepList = this.getPriceList( data.clearancePriceStepList = this.getPriceList(
this.form.clearancePriceStepList this.form.clearancePriceStepList
); );
data.freightPriceStepList = this.getPriceList( data.freightPriceStepList = this.getPriceList(
this.form.freightPriceStepList this.form.freightPriceStepList
); );
delete data.fullPriceStepList; delete data.fullPriceStepList;
}
} }
//海运非阶梯价校验
else { // 删除非阶梯价 包装费字段
delete data.clearancePricePackagingList
delete data.freightPricePackagingList
delete data.fullPricePackagingList
}
//海运非阶梯价校验
else {
// 单询不校验
if (this.form.needOrderInquiry == 0) {
// 有多个组件则表示清关费 + 运费 // 有多个组件则表示清关费 + 运费
if (this.$refs.seaPrice?.length) { if (this.$refs.seaPrice?.length) {
let isValid = true; let isValid = true;
...@@ -999,48 +1007,47 @@ export default { ...@@ -999,48 +1007,47 @@ export default {
else if (this.$refs.seaPrice && !this.$refs.seaPrice.validate()) { else if (this.$refs.seaPrice && !this.$refs.seaPrice.validate()) {
return; return;
} }
}
// 格式化 // 格式化
if (this.form.priceType === 1) { if (this.form.priceType === 1) {
data.fullPricePackagingList = this.getPackingPrice( data.fullPricePackagingList = this.getPackingPrice(
data.fullPricePackagingList data.fullPricePackagingList
); );
delete data.freightPricePackagingList; delete data.freightPricePackagingList;
delete data.clearancePricePackagingList; delete data.clearancePricePackagingList;
} else { } else {
data.freightPricePackagingList = this.getPackingPrice( data.freightPricePackagingList = this.getPackingPrice(
data.freightPricePackagingList data.freightPricePackagingList
); );
data.clearancePricePackagingList = this.getPackingPrice( data.clearancePricePackagingList = this.getPackingPrice(
data.clearancePricePackagingList data.clearancePricePackagingList
); );
delete data.fullPricePackagingList; delete data.fullPricePackagingList;
}
// 删除阶梯价字段
delete data.freightPriceStepList;
delete data.fullPriceStepList;
delete data.clearancePriceStepList;
} }
// 设置了有效期,且已过期则给提示 // 删除阶梯价字段
if (this.form.validateEndDate && force !== true) { delete data.freightPriceStepList;
let validateEndDate = new Date(this.form.validateEndDate); delete data.fullPriceStepList;
if (validateEndDate.getTime() < Date.now()) { delete data.clearancePriceStepList;
return this.$confirm( }
"您设置的线路价格已过期,确定提交吗?",
"提示", // 设置了有效期,且已过期则给提示
{ if (this.form.validateEndDate && force !== true) {
confirmButtonText: "确认提交", let validateEndDate = new Date(this.form.validateEndDate);
cancelButtonText: "取消提交", if (validateEndDate.getTime() < Date.now()) {
type: "warning", return this.$confirm(
} "您设置的线路价格已过期,确定提交吗?",
).then((res) => { "提示",
this.submitForm(true); {
}); confirmButtonText: "确认提交",
} cancelButtonText: "取消提交",
type: "warning",
}
).then((res) => {
this.submitForm(true);
});
} }
} }
// 修改单条路线 // 修改单条路线
......
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item :label="$t('关键字')" prop="nickname"> <el-form-item :label="$t('关键字')" prop="nickname">
<el-input v-model="queryParams.searchKey" :placeholder="$t('搜索昵称、姓名、手机、Email')" clearable @keyup.enter.native="handleQuery"/> <el-input
v-model="queryParams.searchKey"
:placeholder="$t('搜索昵称、姓名、手机、Email')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('成交')" prop="mobile"> <el-form-item :label="$t('成交')" prop="mobile">
<el-select v-model="queryParams.isDeal"> <el-select v-model="queryParams.isDeal">
<el-option v-for="item in [{label:$t('全部'),value:''},{label:$t('是'),value:true},{label:$t('否'),value:false}]" :value="item.value" :label="item.label" :key="item.value" ></el-option> <el-option
</el-select> v-for="item in [
{ label: $t('全部'), value: '' },
{ label: $t('是'), value: true },
{ label: $t('否'), value: false },
]"
:value="item.value"
:label="item.label"
:key="item.value"
></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('认证')" prop="password"> <el-form-item :label="$t('认证')" prop="password">
<el-select v-model="queryParams.authType"> <el-select v-model="queryParams.authType">
<el-option v-for="item in [{label: $t('全部'),value: ''},{label:$t('营业执照认证'),value:1},{label:$t('身份证认证'),value:2},{label:$t('双认证'),value:3}]" :key="item.value" :value="item.value" :label="item.label"></el-option> <el-option
v-for="item in [
{ label: $t('全部'), value: '' },
{ label: $t('营业执照认证'), value: 1 },
{ label: $t('身份证认证'), value: 2 },
{ label: $t('双认证'), value: 3 },
]"
:key="item.value"
:value="item.value"
:label="item.label"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('审核状态')" prop="registerIp"> <el-form-item :label="$t('审核状态')" prop="registerIp">
<dict-selector v-model="queryParams.auditStatus" :type="DICT_TYPE.AUDIT_STATUS"></dict-selector> <dict-selector
v-model="queryParams.auditStatus"
:type="DICT_TYPE.AUDIT_STATUS"
></dict-selector>
</el-form-item> </el-form-item>
<el-form-item :label="$t('创建时间')"> <el-form-item :label="$t('创建时间')">
<el-date-picker <el-date-picker
v-model="dateRangeCreateTime" v-model="dateRangeCreateTime"
type="datetimerange" type="datetimerange"
:start-placeholder="$t('开始日期')" :start-placeholder="$t('开始日期')"
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
:end-placeholder="$t('结束日期')"> :end-placeholder="$t('结束日期')"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item :label="$t('客户编号')" prop="customerCode">
<el-input
v-model="queryParams.customerCode"
:placeholder="$t('请输入客户编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="$t('会员编号')" prop="memberCode">
<el-input
v-model="queryParams.memberCode"
:placeholder="$t('请输入会员编号')"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{
<el-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button> $t("搜索")
<el-button v-has-permi="['member:export']" :loading="exportLoading" type="primary" @click="exportFn">{{$t('导 出')}}</el-button> }}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{
$t("重置")
}}</el-button>
<el-button
v-has-permi="['member:export']"
:loading="exportLoading"
type="primary"
@click="exportFn"
>{{ $t("导 出") }}</el-button
>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 操作工具栏 --> <!-- 操作工具栏 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column :label="$t('公司名称')" align="center" prop="enterpriseName" /> <el-table-column
<el-table-column :label="$t('用户昵称')" align="center" prop="nickname" width="150"/> :label="$t('会员编号')"
<el-table-column :label="$t('真实姓名')" align="center" prop="identityName" /> align="center"
prop="memberCode"
/>
<el-table-column
:label="$t('公司名称')"
align="center"
prop="enterpriseName"
/>
<el-table-column :label="$t('客户编号')" align="center">
<template v-slot="{ row }">
<el-button @click="handleGoDetail(row.customerId)" type="text">{{
row.customerCode
}}</el-button>
</template>
</el-table-column>
<el-table-column
:label="$t('用户昵称')"
align="center"
prop="nickname"
width="150"
/>
<el-table-column
:label="$t('真实姓名')"
align="center"
prop="identityName"
/>
<el-table-column :label="$t('区号')"> <el-table-column :label="$t('区号')">
<template v-slot:default = 'scope'> <template v-slot:default="scope">
+{{scope.row.areaCode ? `${scope.row.areaCode}`:''}} +{{ scope.row.areaCode ? `${scope.row.areaCode}` : "" }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('手机号')" show-overflow-tooltip align="center" prop="mobile" width="150"> <el-table-column
</el-table-column> :label="$t('手机号')"
<el-table-column :label="$t('成交')" align="center" prop="customerStatus" show-overflow-tooltip > show-overflow-tooltip
<template v-slot="{row}"> align="center"
{{row.customerStatus === 3 ? $t('成交') : $t('非成交')}} prop="mobile"
width="150"
>
</el-table-column>
<el-table-column
:label="$t('成交')"
align="center"
prop="customerStatus"
show-overflow-tooltip
>
<template v-slot="{ row }">
{{ row.customerStatus === 3 ? $t("成交") : $t("非成交") }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('认证')" align="center" :formatter="authentication" /> <el-table-column
<el-table-column :label="$t('状态')" align="center" prop="status" > :label="$t('认证')"
align="center"
:formatter="authentication"
/>
<el-table-column :label="$t('状态')" align="center" prop="status">
<template slot-scope="scope"> <template slot-scope="scope">
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)" /> <el-switch
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('身份证审核状态')" align="center" prop="createTime" > <el-table-column
:label="$t('身份证审核状态')"
align="center"
prop="createTime"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="!scope.row.identityAuditStatus">{{$t('未提交')}}</div> <div v-if="!scope.row.identityAuditStatus">{{ $t("未提交") }}</div>
<dict-tag v-else :type="DICT_TYPE.AUDIT_STATUS" :value="scope.row.identityAuditStatus" ></dict-tag> <dict-tag
<el-tooltip v-if="scope.row.identityAuditStatus === 3" class="item" effect="dark" :content="scope.row.identityAuditRemark" placement="bottom"> v-else
:type="DICT_TYPE.AUDIT_STATUS"
:value="scope.row.identityAuditStatus"
></dict-tag>
<el-tooltip
v-if="scope.row.identityAuditStatus === 3"
class="item"
effect="dark"
:content="scope.row.identityAuditRemark"
placement="bottom"
>
<i class="el-icon-question"></i> <i class="el-icon-question"></i>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('营业执照审核状态')" align="center" prop="createTime" > <el-table-column
:label="$t('营业执照审核状态')"
align="center"
prop="createTime"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="!scope.row.enterpriseAuditStatus">{{$t('未提交')}}</div> <div v-if="!scope.row.enterpriseAuditStatus">{{ $t("未提交") }}</div>
<dict-tag v-else :type="DICT_TYPE.AUDIT_STATUS" :value="scope.row.enterpriseAuditStatus" ></dict-tag> <dict-tag
<el-tooltip v-if="scope.row.enterpriseAuditStatus === 3" class="item" effect="dark" :content="scope.row.rowenterpriseAuditRemark" placement="bottom"> v-else
<i class="el-icon-question"></i> :type="DICT_TYPE.AUDIT_STATUS"
</el-tooltip> :value="scope.row.enterpriseAuditStatus"
></dict-tag>
<el-tooltip
v-if="scope.row.enterpriseAuditStatus === 3"
class="item"
effect="dark"
:content="scope.row.rowenterpriseAuditRemark"
placement="bottom"
>
<i class="el-icon-question"></i>
</el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('创建时间')" align="center" prop="createTime" width="180"> <el-table-column
:label="$t('创建时间')"
align="center"
prop="createTime"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width" width="200px"> <el-table-column
<template slot-scope="scope" > :label="$t('操作')"
<el-button v-has-permi="['member:certificate']" size="mini" type="text" @click="guarantee(scope.row)">{{$t('保函/证书')}}</el-button> align="center"
<el-button v-has-permi="['member:log']" size="mini" type="text" @click="operationLogFn(scope.row)">{{$t('操作日志')}}</el-button> class-name="small-padding fixed-width"
<el-button v-has-permi="['member:id-card']" size="mini" type="text" @click="identityFn(scope.row , '1')">{{$t('身份证')}}</el-button> width="200px"
<el-button v-has-permi="['member:business-license']" size="mini" type="text" @click="identityFn(scope.row, '2')">{{$t('营业执照')}}</el-button> >
<el-button v-has-permi="['member:delete']" size="mini" type="text" @click="deleteFn(scope.row)">{{$t('删 除')}}</el-button> <template slot-scope="scope">
<el-button type="text" v-has-permi="['member:user:info']" size="mini" @click="$router.push('member/member-details/' + scope.row.id )" >{{ $t('查看') }}</el-button> <el-button
v-has-permi="['member:certificate']"
size="mini"
type="text"
@click="guarantee(scope.row)"
>{{ $t("保函/证书") }}</el-button
>
<el-button
v-has-permi="['member:log']"
size="mini"
type="text"
@click="operationLogFn(scope.row)"
>{{ $t("操作日志") }}</el-button
>
<el-button
v-has-permi="['member:id-card']"
size="mini"
type="text"
@click="identityFn(scope.row, '1')"
>{{ $t("身份证") }}</el-button
>
<el-button
v-has-permi="['member:business-license']"
size="mini"
type="text"
@click="identityFn(scope.row, '2')"
>{{ $t("营业执照") }}</el-button
>
<el-button
v-has-permi="['member:delete']"
size="mini"
type="text"
@click="deleteFn(scope.row)"
>{{ $t("删 除") }}</el-button
>
<el-button
type="text"
v-has-permi="['member:user:info']"
size="mini"
@click="$router.push('member/member-details/' + scope.row.id)"
>{{ $t("查看") }}</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.page" :limit.sync="queryParams.rows" <pagination
@pagination="getList"/> v-show="total > 0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.rows"
@pagination="getList"
/>
<el-dialog <el-dialog
title="保函/证书" title="保函/证书"
:visible.sync="guaranteeShow" :visible.sync="guaranteeShow"
:before-close="()=>{guaranteeUrl = ''; guaranteeShow = false;}" :before-close="
width="50%"> () => {
guaranteeUrl = '';
guaranteeShow = false;
}
"
width="50%"
>
<el-form> <el-form>
<el-form-item :label="$t('保函/证书')"> <el-form-item :label="$t('保函/证书')">
<el-row :gutter="20" type="flex" justify="center" > <el-row :gutter="20" type="flex" justify="center">
<el-col :span="12"><el-input v-model="guaranteeUrl" ></el-input></el-col> <el-col :span="12"
<el-col :span="4"><div style="height: 45px;overflow: hidden;"> ><el-input v-model="guaranteeUrl"></el-input
<file-upload v-model="guaranteeUrl" :fileType="['png', 'jpg', 'jpeg','pdf']" :limit="1" :isShowTip="false"></file-upload> ></el-col>
</div></el-col> <el-col :span="4"
><div style="height: 45px; overflow: hidden">
<file-upload
v-model="guaranteeUrl"
:fileType="['png', 'jpg', 'jpeg', 'pdf']"
:limit="1"
:isShowTip="false"
></file-upload></div
></el-col>
<el-col :span="6"> <el-col :span="6">
<div>{{$t('可上传图片,pdf文档')}}</div> <div>{{ $t("可上传图片,pdf文档") }}</div>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div style="text-align: center;"><el-button @click="setGuarantee">{{$t('保 存')}}</el-button></div> <div style="text-align: center">
<el-button @click="setGuarantee">{{ $t("保 存") }}</el-button>
</div>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
:title="$t('操作日志')" :title="$t('操作日志')"
:visible.sync="operationLogShow" :visible.sync="operationLogShow"
width="50%"> width="50%"
>
<el-table :data="operationLogList"> <el-table :data="operationLogList">
<el-table-column :label="$t('标题')" prop="title"></el-table-column> <el-table-column :label="$t('标题')" prop="title"></el-table-column>
<el-table-column :label="$t('操作内容')" prop="content"></el-table-column> <el-table-column
:label="$t('操作内容')"
prop="content"
></el-table-column>
<el-table-column :label="$t('操作人')" prop="userId"> <el-table-column :label="$t('操作人')" prop="userId">
<template v-slot="{row}"> <template v-slot="{ row }">
{{list.find(i => i.id == row.userId).identityName}} {{ list.find((i) => i.id == row.userId).identityName }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作时间')"> <el-table-column :label="$t('操作时间')">
<template v-slot:default ="scope"> <template v-slot:default="scope">
{{parseTime(scope.row.createTime) }} {{ parseTime(scope.row.createTime) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('操作ip')" prop="ip"></el-table-column> <el-table-column :label="$t('操作ip')" prop="ip"></el-table-column>
</el-table> </el-table>
<pagination v-show="totalLog > 0" :total="totalLog" :page.sync="operationLogFrom.page" :limit.sync="operationLogFrom.row" <pagination
@pagination="getOperationLogList"/> v-show="totalLog > 0"
:total="totalLog"
:page.sync="operationLogFrom.page"
:limit.sync="operationLogFrom.row"
@pagination="getOperationLogList"
/>
</el-dialog> </el-dialog>
<el-dialog <el-dialog :title="$t('认证')" :visible.sync="attestationShow" width="80%">
:title="$t('认证')" <div class="details">
:visible.sync="attestationShow" <el-tabs v-model="activeName" @tab-click="handleClick">
width="80%"> <el-tab-pane :label="$t('身份证')" name="1">
<div class="details"> <div style="padding: 0 40px; box-sizing: border-box">
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-form
<el-tab-pane :label="$t('身份证')" name="1"> :disabled="[2, 3].includes(IdDetails.status) && modifyIdCard"
<div style="padding:0 40px;box-sizing: border-box;"> ref="formId"
<el-form :disabled="[2,3].includes(IdDetails.status) && modifyIdCard" ref="formId" label-position="left" label-width="100px" :rules="rulesId" :model="IdDetails" > label-position="left"
<el-form-item :label="$t('姓名')" prop="name"> label-width="100px"
<el-input v-model="IdDetails.name"></el-input> :rules="rulesId"
</el-form-item> :model="IdDetails"
<el-form-item :label="$t('证件类型')" prop="cardType"> >
<dict-selector v-model="IdDetails.cardType" :type="DICT_TYPE.CERTIFICATE_TYPE" ></dict-selector> <el-form-item :label="$t('姓名')" prop="name">
</el-form-item> <el-input v-model="IdDetails.name"></el-input>
<el-form-item :label="$t('证件号码')" prop="cardNumber"> </el-form-item>
<el-input v-model="IdDetails.cardNumber"></el-input> <el-form-item :label="$t('证件类型')" prop="cardType">
</el-form-item> <dict-selector
<el-form-item :label="$t('证件正面照')" prop="img1"> v-model="IdDetails.cardType"
<div> :type="DICT_TYPE.CERTIFICATE_TYPE"
<el-input readonly style="margin-bottom: 20px" v-model="IdDetails.img1"></el-input> ></dict-selector>
<ImageUpload :isShowTip="false" v-model="IdDetails.img1" :limit="1"></ImageUpload> </el-form-item>
</div> <el-form-item :label="$t('证件号码')" prop="cardNumber">
</el-form-item> <el-input v-model="IdDetails.cardNumber"></el-input>
<el-form-item :label="$t('证件背面照')" prop="img2"> </el-form-item>
<div> <el-form-item :label="$t('证件正面照')" prop="img1">
<el-input readonly style="margin-bottom: 20px" v-model="IdDetails.img2"></el-input> <div>
<ImageUpload :isShowTip="false" :limit="1" v-model="IdDetails.img2"></ImageUpload> <el-input
</div> readonly
</el-form-item> style="margin-bottom: 20px"
<el-form-item :label="$t('审核状态')" v-if="modifyIdCard && IdDetails.status !== 0 "> v-model="IdDetails.img1"
{{getDictDatas(DICT_TYPE.AUDIT_STATUS)[IdDetails.status].label}} ></el-input>
</el-form-item> <ImageUpload
<el-form-item :label="$t('审核时间')" v-if="[2,3].includes(IdDetails.status) && modifyIdCard"> :isShowTip="false"
{{parseTime(IdDetails.auditTime)}} v-model="IdDetails.img1"
</el-form-item> :limit="1"
<el-form-item v-if="modifyIdCard && IdDetails.status !== 0" :label="$t('审核备注')"> ></ImageUpload>
<el-input v-model="IdDetails.auditRemark" :disabled="IdDetails.status === 3" type="textarea"></el-input>
</el-form-item>
</el-form>
<div v-if="IdDetails.status === 1" style="text-align: center;margin-top: 20px;">
<el-button type="primary" @click="idCardAuditFn(2)">{{$t('审核通过')}}</el-button>
<el-button type="primary" @click="idCardAuditFn(3)">{{$t('审核不通过')}}</el-button>
<el-button @click="attestationShow = false">{{ $t('取 消') }}</el-button>
</div>
<div v-if="IdDetails.status === 2 || IdDetails.status === 3" style="text-align: center;margin-top: 20px;">
<el-button type="primary" v-if="modifyIdCard" @click="modifyIdCard = false;">{{$t('修 改')}}</el-button>
<el-button type="primary" v-else @click="setMemberUserUpdateIdCard">{{$t('提交审核')}}</el-button>
<el-button @click="attestationShow = false">{{$t('取 消')}}</el-button>
</div> </div>
<div v-if="IdDetails.status === 0" style="text-align: center;margin-top: 20px;"> </el-form-item>
<el-button type="primary" @click="submitId">{{$t('上 传')}}</el-button> <el-form-item :label="$t('证件背面照')" prop="img2">
<el-button @click="attestationShow = false">{{$t('取 消')}}</el-button> <div>
<el-input
readonly
style="margin-bottom: 20px"
v-model="IdDetails.img2"
></el-input>
<ImageUpload
:isShowTip="false"
:limit="1"
v-model="IdDetails.img2"
></ImageUpload>
</div> </div>
</div> </el-form-item>
</el-tab-pane> <el-form-item
<el-tab-pane :label="$t('营业执照')" name="2" > :label="$t('审核状态')"
<div style="width: 500px;padding:0 40px;box-sizing: border-box;"> v-if="modifyIdCard && IdDetails.status !== 0"
<el-form :disabled="modifyLicense && [2,3].includes(enterpriseFrom.status)" :rules="rulesEnterprise" :model="enterpriseFrom" label-position="left" ref="formEnter" label-width="100px"> >
<el-form-item :label="$t('企业名称')" prop="name"> {{
<el-input v-model="enterpriseFrom.name" ></el-input> getDictDatas(DICT_TYPE.AUDIT_STATUS)[IdDetails.status].label
</el-form-item> }}
<el-form-item :label="$t('企业法人')" prop="legalName"> </el-form-item>
<el-input v-model="enterpriseFrom.legalName" ></el-input> <el-form-item
</el-form-item> :label="$t('审核时间')"
<el-form-item :label="$t('证件号码')" prop="cardNumber"> v-if="[2, 3].includes(IdDetails.status) && modifyIdCard"
<el-input v-model="enterpriseFrom.cardNumber"></el-input> >
</el-form-item> {{ parseTime(IdDetails.auditTime) }}
<el-form-item :label="$t('证件照')" prop="img1"> </el-form-item>
<div> <el-form-item
<el-input readonly style="margin-bottom: 20px" v-model="enterpriseFrom.img1"></el-input> v-if="modifyIdCard && IdDetails.status !== 0"
<ImageUpload :isShowTip="false" :limit="1" v-model="enterpriseFrom.img1"></ImageUpload> :label="$t('审核备注')"
</div> >
</el-form-item> <el-input
<el-form-item :label="$t('附件')"> v-model="IdDetails.auditRemark"
<el-input readonly v-model="enterpriseFrom.img2"></el-input> :disabled="IdDetails.status === 3"
<ImageUpload :isShowTip="false" :limit="1" v-model="enterpriseFrom.img2"></ImageUpload> type="textarea"
</el-form-item> ></el-input>
<el-form-item v-if="modifyLicense && enterpriseFrom.status !== 0 " :label="$t('审核状态')">{{getDictDatas(DICT_TYPE.AUDIT_STATUS)[enterpriseFrom.status].label}}</el-form-item> </el-form-item>
<el-form-item v-if="[2,3].includes(enterpriseFrom.status) && modifyLicense " :label="$t('审核时间')">{{parseTime(enterpriseFrom.auditTime)}}</el-form-item> </el-form>
<el-form-item v-if="modifyLicense && enterpriseFrom.status !== 0" :label="$t('审核备注')"> <div
<el-input v-model="enterpriseFrom.auditRemark" :disabled="enterpriseFrom.status === 3" type="textarea"></el-input> v-if="IdDetails.status === 1"
</el-form-item> style="text-align: center; margin-top: 20px"
</el-form> >
<div v-if="enterpriseFrom.status === 1" style="text-align: center;margin-top: 20px;"> <el-button type="primary" @click="idCardAuditFn(2)">{{
<el-button type="primary" @click="certificateVerificationFn(2)">{{$t('审核通过')}}</el-button> $t("审核通过")
<el-button type="primary" @click="certificateVerificationFn(3)">{{$t('审核不通过')}}</el-button> }}</el-button>
<el-button @click="attestationShow = false">{{$t('取 消')}}</el-button> <el-button type="primary" @click="idCardAuditFn(3)">{{
$t("审核不通过")
}}</el-button>
<el-button @click="attestationShow = false">{{
$t("取 消")
}}</el-button>
</div>
<div
v-if="IdDetails.status === 2 || IdDetails.status === 3"
style="text-align: center; margin-top: 20px"
>
<el-button
type="primary"
v-if="modifyIdCard"
@click="modifyIdCard = false"
>{{ $t("修 改") }}</el-button
>
<el-button
type="primary"
v-else
@click="setMemberUserUpdateIdCard"
>{{ $t("提交审核") }}</el-button
>
<el-button @click="attestationShow = false">{{
$t("取 消")
}}</el-button>
</div>
<div
v-if="IdDetails.status === 0"
style="text-align: center; margin-top: 20px"
>
<el-button type="primary" @click="submitId">{{
$t("上 传")
}}</el-button>
<el-button @click="attestationShow = false">{{
$t("取 消")
}}</el-button>
</div>
</div>
</el-tab-pane>
<el-tab-pane :label="$t('营业执照')" name="2">
<div style="width: 500px; padding: 0 40px; box-sizing: border-box">
<el-form
:disabled="
modifyLicense && [2, 3].includes(enterpriseFrom.status)
"
:rules="rulesEnterprise"
:model="enterpriseFrom"
label-position="left"
ref="formEnter"
label-width="100px"
>
<el-form-item :label="$t('企业名称')" prop="name">
<el-input v-model="enterpriseFrom.name"></el-input>
</el-form-item>
<el-form-item :label="$t('企业法人')" prop="legalName">
<el-input v-model="enterpriseFrom.legalName"></el-input>
</el-form-item>
<el-form-item :label="$t('证件号码')" prop="cardNumber">
<el-input v-model="enterpriseFrom.cardNumber"></el-input>
</el-form-item>
<el-form-item :label="$t('证件照')" prop="img1">
<div>
<el-input
readonly
style="margin-bottom: 20px"
v-model="enterpriseFrom.img1"
></el-input>
<ImageUpload
:isShowTip="false"
:limit="1"
v-model="enterpriseFrom.img1"
></ImageUpload>
</div> </div>
<div v-if="enterpriseFrom.status === 2 || enterpriseFrom.status === 3" style="text-align: center;margin-top: 20px;"> </el-form-item>
<el-button type="primary" v-if="modifyLicense" @click="modifyLicense = false">{{$t('修 改')}}</el-button> <el-form-item :label="$t('附件')">
<el-button type="primary" v-else @click="setMemberUserUpdateEnterprise">{{$t('提交审核')}}</el-button> <el-input readonly v-model="enterpriseFrom.img2"></el-input>
<el-button @click="attestationShow = false">{{$t('取 消')}}</el-button> <ImageUpload
</div> :isShowTip="false"
<div v-if="enterpriseFrom.status === 0" style="text-align: center;margin-top: 20px;"> :limit="1"
<el-button type="primary" @click="submit">{{$t('上 传')}}</el-button> v-model="enterpriseFrom.img2"
<el-button @click="attestationShow = false">{{$t('取 消')}}</el-button> ></ImageUpload>
</div> </el-form-item>
</div> <el-form-item
</el-tab-pane> v-if="modifyLicense && enterpriseFrom.status !== 0"
</el-tabs> :label="$t('审核状态')"
</div> >{{
</el-dialog> getDictDatas(DICT_TYPE.AUDIT_STATUS)[enterpriseFrom.status]
.label
}}</el-form-item
>
<el-form-item
v-if="[2, 3].includes(enterpriseFrom.status) && modifyLicense"
:label="$t('审核时间')"
>{{ parseTime(enterpriseFrom.auditTime) }}</el-form-item
>
<el-form-item
v-if="modifyLicense && enterpriseFrom.status !== 0"
:label="$t('审核备注')"
>
<el-input
v-model="enterpriseFrom.auditRemark"
:disabled="enterpriseFrom.status === 3"
type="textarea"
></el-input>
</el-form-item>
</el-form>
<div
v-if="enterpriseFrom.status === 1"
style="text-align: center; margin-top: 20px"
>
<el-button
type="primary"
@click="certificateVerificationFn(2)"
>{{ $t("审核通过") }}</el-button
>
<el-button
type="primary"
@click="certificateVerificationFn(3)"
>{{ $t("审核不通过") }}</el-button
>
<el-button @click="attestationShow = false">{{
$t("取 消")
}}</el-button>
</div>
<div
v-if="
enterpriseFrom.status === 2 || enterpriseFrom.status === 3
"
style="text-align: center; margin-top: 20px"
>
<el-button
type="primary"
v-if="modifyLicense"
@click="modifyLicense = false"
>{{ $t("修 改") }}</el-button
>
<el-button
type="primary"
v-else
@click="setMemberUserUpdateEnterprise"
>{{ $t("提交审核") }}</el-button
>
<el-button @click="attestationShow = false">{{
$t("取 消")
}}</el-button>
</div>
<div
v-if="enterpriseFrom.status === 0"
style="text-align: center; margin-top: 20px"
>
<el-button type="primary" @click="submit">{{
$t("上 传")
}}</el-button>
<el-button @click="attestationShow = false">{{
$t("取 消")
}}</el-button>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</el-dialog>
</div> </div>
</template> </template>
...@@ -265,30 +622,35 @@ import { ...@@ -265,30 +622,35 @@ import {
setUserUpdateStatus, setUserUpdateStatus,
userCreateAuditEnterprise, userCreateAuditEnterprise,
memberUserAuditEnterprise, memberUserAuditEnterprise,
createAuditIdCard createAuditIdCard,
} from "@/api/member/user"; } from "@/api/member/user";
import {DICT_TYPE, getDictDatas} from "@/utils/dict"; import { DICT_TYPE, getDictDatas } from "@/utils/dict";
import FileUpload from "@/components/FileUpload" import FileUpload from "@/components/FileUpload";
import ImageUpload from "@/components/ImageUpload"; import ImageUpload from "@/components/ImageUpload";
import uploadImage from "@/components/UploadImage"; import uploadImage from "@/components/UploadImage";
import {CommonStatusEnum} from "@/utils/constants"; import { CommonStatusEnum } from "@/utils/constants";
import {changeUserStatus, listServiceUser, listSimpleUsers} from "@/api/system/user"; import {
changeUserStatus,
listServiceUser,
listSimpleUsers,
} from "@/api/system/user";
export default { export default {
name: "User", name: "User",
components: { components: {
FileUpload, FileUpload,
ImageUpload,uploadImage ImageUpload,
uploadImage,
}, },
data() { data() {
return { return {
totalLog:0, totalLog: 0,
IdDetails:{}, IdDetails: {},
enterpriseFrom:{}, enterpriseFrom: {},
guaranteeUrl:undefined, guaranteeUrl: undefined,
DICT_TYPE, DICT_TYPE,
getDictDatas, getDictDatas,
// audit_status // audit_status
activeName:"1", activeName: "1",
// 遮罩层 // 遮罩层
loading: true, loading: true,
// 导出遮罩层 // 导出遮罩层
...@@ -309,111 +671,196 @@ export default { ...@@ -309,111 +671,196 @@ export default {
queryParams: { queryParams: {
page: 1, page: 1,
rows: 10, rows: 10,
isDeal:undefined,// 是否成交 isDeal: undefined, // 是否成交
searchKey:undefined,//关键字 searchKey: undefined, //关键字
auditStatus:undefined,//审核状态 auditStatus: undefined, //审核状态
authType:undefined,//关键字 authType: undefined, //关键字
customerCode: null,
memberCode: null,
}, },
// 表单参数 // 表单参数
form: {}, form: {},
// 表单校验 // 表单校验
rulesId: { rulesId: {
name: [{ required: true, message: this.$t('用户昵称不能为空'), trigger: "blur" }], name: [
cardType: [{ required: true, message: this.$t('证件类型不能为空'), trigger: "blur" }], {
cardNumber: [{ required: true, message: this.$t('证件号码不能为空'), trigger: "blur" }], required: true,
img1: [{ required: true, message: this.$t('身份正面照不能为空'), trigger: ['blur','change'] }], message: this.$t("用户昵称不能为空"),
img2: [{ required: true, message: this.$t('身份正面照不能为空'), trigger: ['blur','change'] }], trigger: "blur",
},
],
cardType: [
{
required: true,
message: this.$t("证件类型不能为空"),
trigger: "blur",
},
],
cardNumber: [
{
required: true,
message: this.$t("证件号码不能为空"),
trigger: "blur",
},
],
img1: [
{
required: true,
message: this.$t("身份正面照不能为空"),
trigger: ["blur", "change"],
},
],
img2: [
{
required: true,
message: this.$t("身份正面照不能为空"),
trigger: ["blur", "change"],
},
],
}, },
rulesEnterprise: { rulesEnterprise: {
name: [{required: true, message: this.$t('企业名称不能为空'), trigger: "blur"}], name: [
legalName: [{required: true, message: this.$t('企业法人不能为空'), trigger: "blur"}], {
cardNumber: [{required: true, message: this.$t('证件号码不能为空'), trigger: "blur"}], required: true,
img1: [{required: true, message: this.$t('证件照不能为空'), trigger: ['blur','change']}], message: this.$t("企业名称不能为空"),
trigger: "blur",
},
],
legalName: [
{
required: true,
message: this.$t("企业法人不能为空"),
trigger: "blur",
},
],
cardNumber: [
{
required: true,
message: this.$t("证件号码不能为空"),
trigger: "blur",
},
],
img1: [
{
required: true,
message: this.$t("证件照不能为空"),
trigger: ["blur", "change"],
},
],
}, },
publicObj:undefined, publicObj: undefined,
operationLogShow:false, operationLogShow: false,
guaranteeShow:false, guaranteeShow: false,
operationLogFrom:{ operationLogFrom: {
page:1, page: 1,
row:10, row: 10,
userId:undefined userId: undefined,
}, },
operationLogList:[], operationLogList: [],
attestationShow:false, attestationShow: false,
modifyIdCard:true,//修改身份证 modifyIdCard: true, //修改身份证
modifyLicense:true,//修改营业执照 modifyLicense: true, //修改营业执照
}; };
}, },
created() { created() {
this.resetId(); this.resetId();
this.resetEnterprise() this.resetEnterprise();
this.getList(); this.getList();
}, },
methods: { methods: {
deleteFn(row){ handleGoDetail(customerId) {
this.$router.push("/customer/query/" + customerId);
},
deleteFn(row) {
const nickname = row.nickname; const nickname = row.nickname;
this.$modal.confirm(`${this.$t('是否确认删除昵称为{nickname}的会员?', {nickname})}`).then(function (){ this.$modal
return deleteUser(row.id) .confirm(
}).then( res => { `${this.$t("是否确认删除昵称为{nickname}的会员?", { nickname })}`
if(res.code === 0) this.getList(); this.$message.success(this.$t('删除成功')) )
}).catch(() =>{ .then(function () {
// this.$message.success(this.$t('删除失败')) return deleteUser(row.id);
} })
) .then((res) => {
if (res.code === 0) this.getList();
this.$message.success(this.$t("删除成功"));
})
.catch(() => {
// this.$message.success(this.$t('删除失败'))
});
}, },
//导出 //导出
exportFn(){ exportFn() {
this.$modal.confirm(this.$t('是否确认导出所有用户数据项?')).then(() => { this.$modal
this.exportLoading = true; .confirm(this.$t("是否确认导出所有用户数据项?"))
return exportUserExcel(this.queryParams); .then(() => {
}).then(response => { this.exportLoading = true;
this.$download.excel(response, `${this.$t('注册会员')}.xls`); return exportUserExcel(this.queryParams);
this.exportLoading = false; })
}).catch(() => {}); .then((response) => {
this.$download.excel(response, `${this.$t("注册会员")}.xls`);
this.exportLoading = false;
})
.catch(() => {});
}, },
// 用户状态修改 // 用户状态修改
handleStatusChange(row) { handleStatusChange(row) {
let text = row.status === CommonStatusEnum.ENABLE ? this.$t('启用') : this.$t('停用'); let text =
this.$modal.confirm(this.$t('确认要"') + text + '""' + row.nickname + this.$t('"用户吗?')).then(function() { row.status === CommonStatusEnum.ENABLE
return setUserUpdateStatus({id:row.id,status:row.status}) ? this.$t("启用")
}).then(() => { : this.$t("停用");
this.$modal.msgSuccess(text + this.$t('成功')); this.$modal
}).catch(function() { .confirm(
row.status = row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE this.$t('确认要"') + text + '""' + row.nickname + this.$t('"用户吗?')
: CommonStatusEnum.ENABLE; )
}); .then(function () {
return setUserUpdateStatus({ id: row.id, status: row.status });
})
.then(() => {
this.$modal.msgSuccess(text + this.$t("成功"));
})
.catch(function () {
row.status =
row.status === CommonStatusEnum.ENABLE
? CommonStatusEnum.DISABLE
: CommonStatusEnum.ENABLE;
});
}, },
/** 查询列表 */ /** 查询列表 */
getList() { getList() {
this.loading = true; this.loading = true;
// 处理查询参数 // 处理查询参数
let params = {...this.queryParams}; let params = { ...this.queryParams };
// this.addBeginAndEndTime(params, this.dateRangeLoginDate, 'loginDate'); // this.addBeginAndEndTime(params, this.dateRangeLoginDate, 'loginDate');
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime', false); this.addBeginAndEndTime(
params,
this.dateRangeCreateTime,
"createTime",
false
);
// 执行查询 // 执行查询
getUserPage(params).then(response => { getUserPage(params).then((response) => {
this.list = response.data.list; this.list = response.data.list;
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
}); });
}, },
/** 表单重置 */ /** 表单重置 */
resetId(){ resetId() {
this.IdDetails = { this.IdDetails = {
auditRemark: undefined, auditRemark: undefined,
auditTime: undefined, auditTime: undefined,
cardNumber: undefined, cardNumber: undefined,
cardType: undefined, cardType: undefined,
createTime: undefined, createTime: undefined,
id: 0, id: 0,
img1: undefined, img1: undefined,
img2: undefined, img2: undefined,
name: '', name: "",
status: 0, status: 0,
userId: 0 userId: 0,
} };
},//清空身份证 }, //清空身份证
resetEnterprise(){ resetEnterprise() {
this.enterpriseFrom = { this.enterpriseFrom = {
auditRemark: undefined, auditRemark: undefined,
auditTime: undefined, auditTime: undefined,
...@@ -425,9 +872,9 @@ export default { ...@@ -425,9 +872,9 @@ export default {
legalName: undefined, legalName: undefined,
name: undefined, name: undefined,
status: 0, status: 0,
userId: undefined userId: undefined,
} };
},//清空企业 }, //清空企业
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.page = 1; this.queryParams.page = 1;
...@@ -440,235 +887,237 @@ export default { ...@@ -440,235 +887,237 @@ export default {
this.queryParams = { this.queryParams = {
page: 1, page: 1,
rows: 10, rows: 10,
isDeal:undefined,// 是否成交 isDeal: undefined, // 是否成交
searchKey:undefined,//关键字 searchKey: undefined, //关键字
auditStatus:undefined,//审核状态 auditStatus: undefined, //审核状态
authType:undefined,//关键字 authType: undefined, //关键字
} };
this.resetForm("queryForm"); this.resetForm("queryForm");
this.handleQuery(); this.handleQuery();
}, },
// 保函证书 // 保函证书
guarantee(row) { guarantee(row) {
this.publicObj = row; this.publicObj = row;
this.guaranteeShow = true; this.guaranteeShow = true;
this.guaranteeUrl = row.backLetterImg; this.guaranteeUrl = row.backLetterImg;
}, },
// 操作日志 // 操作日志
operationLogFn(row){ operationLogFn(row) {
this.publicObj = row; this.publicObj = row;
this.operationLogFrom.page = 1; this.operationLogFrom.page = 1;
this.operationLogFrom.userId = row.id this.operationLogFrom.userId = row.id;
this.operationLogShow = true; this.operationLogShow = true;
this.operationLogList = []; this.operationLogList = [];
this.getOperationLogList(); this.getOperationLogList();
}, },
getOperationLogList(){ getOperationLogList() {
operationLogApi(this.operationLogFrom).then(r=>{ operationLogApi(this.operationLogFrom).then((r) => {
if(r.code === 0){ if (r.code === 0) {
this.operationLogList = r.data.list this.operationLogList = r.data.list;
this.totalLog = r.data.total this.totalLog = r.data.total;
} }
}) });
}, },
setGuarantee(){ setGuarantee() {
seTupdateBackletter({userId:this.publicObj.id,backLetter:this.guaranteeUrl}).then(r=>{ seTupdateBackletter({
if(r.code === 0){ userId: this.publicObj.id,
backLetter: this.guaranteeUrl,
}).then((r) => {
if (r.code === 0) {
this.publicObj.backLetterImg = this.guaranteeUrl; this.publicObj.backLetterImg = this.guaranteeUrl;
this.guaranteeShow = false; this.guaranteeShow = false;
this.$message.success(this.$t('保存成功')); this.$message.success(this.$t("保存成功"));
} }
}) });
}, },
identityFn(row,val){ identityFn(row, val) {
this.attestationShow = true; this.attestationShow = true;
this.activeName = val; this.activeName = val;
this.publicObj = row; this.publicObj = row;
if(val == 1){ if (val == 1) {
this.getIdentityDetails(); this.getIdentityDetails();
}else { } else {
this.getEnterpriseFn(); this.getEnterpriseFn();
} }
}, },
handleClick(val){ handleClick(val) {
if(val.name == 1){ if (val.name == 1) {
this.getIdentityDetails(); this.getIdentityDetails();
}else { } else {
this.getEnterpriseFn(); this.getEnterpriseFn();
} }
}, },
getIdentityDetails(){ getIdentityDetails() {
this.resetId(); this.resetId();
memberGetAuthIdcardInfo({userId:this.publicObj.id}).then(r=>{ memberGetAuthIdcardInfo({ userId: this.publicObj.id }).then((r) => {
if(r.code === 0 && !!r.data){ if (r.code === 0 && !!r.data) {
this.IdDetails = r.data this.IdDetails = r.data;
} }
}) });
}, },
getEnterpriseFn(){ getEnterpriseFn() {
this.resetEnterprise(); this.resetEnterprise();
memberGetAuthEnterpriseInfo({userId:this.publicObj.id}).then(r => { memberGetAuthEnterpriseInfo({ userId: this.publicObj.id }).then((r) => {
if(r.code === 0 && !!r.data){ if (r.code === 0 && !!r.data) {
this.enterpriseFrom = r.data this.enterpriseFrom = r.data;
} }
}) });
}, },
//身份证审核 //身份证审核
idCardAuditFn(val){ idCardAuditFn(val) {
let p = { let p = {
auditStatus:val, auditStatus: val,
userCardAuthId:this.IdDetails.id, userCardAuthId: this.IdDetails.id,
auditRemark:this.IdDetails.auditRemark auditRemark: this.IdDetails.auditRemark,
} };
memberUserAuditIdCard(p).then(r => { memberUserAuditIdCard(p).then((r) => {
if(r.code === 0){ if (r.code === 0) {
this.$message.success(this.$t('修改成功')); this.$message.success(this.$t("修改成功"));
this.getList() this.getList();
this.getIdentityDetails() this.getIdentityDetails();
} }
}) });
}, },
// 企业证书审核 // 企业证书审核
certificateVerificationFn(val){ certificateVerificationFn(val) {
let p = { let p = {
auditStatus:val, auditStatus: val,
userEnterpriseAuthId:this.enterpriseFrom.id, userEnterpriseAuthId: this.enterpriseFrom.id,
auditRemark:this.enterpriseFrom.auditRemark auditRemark: this.enterpriseFrom.auditRemark,
} };
memberUserAuditEnterprise(p).then(r => { memberUserAuditEnterprise(p).then((r) => {
if(r.code === 0){ if (r.code === 0) {
this.getList() this.getList();
this.getEnterpriseFn(); this.getEnterpriseFn();
} }
}) });
}, },
setMemberUserUpdateIdCard(){ setMemberUserUpdateIdCard() {
this.$refs.formId.validate(async valid =>{ this.$refs.formId.validate(async (valid) => {
if(valid){ if (valid) {
let p ={ let p = {
cardNumber:this.IdDetails.cardNumber, cardNumber: this.IdDetails.cardNumber,
cardType:this.IdDetails.cardType, cardType: this.IdDetails.cardType,
img1:this.IdDetails.img1, img1: this.IdDetails.img1,
img2:this.IdDetails.img2, img2: this.IdDetails.img2,
name:this.IdDetails.name, name: this.IdDetails.name,
userCardAuthId:this.IdDetails.id, userCardAuthId: this.IdDetails.id,
auditPass:true, auditPass: true,
}; };
memberUserUpdateIdCard(p).then(r => { memberUserUpdateIdCard(p).then((r) => {
if(r.code === 0){ if (r.code === 0) {
this.$message.success(this.$t('修改成功')) this.$message.success(this.$t("修改成功"));
if(p.auditPass === true ){ if (p.auditPass === true) {
this.getIdentityDetails() this.getIdentityDetails();
} }
this.getList() this.getList();
this.modifyIdCard = true; this.modifyIdCard = true;
} }
}) });
} }
}) });
}, },
setMemberUserUpdateEnterprise(){ setMemberUserUpdateEnterprise() {
this.$refs.formEnter.validate(async valid =>{ this.$refs.formEnter.validate(async (valid) => {
if(valid){ if (valid) {
let p = { let p = {
cardNumber:this.enterpriseFrom.cardNumber, cardNumber: this.enterpriseFrom.cardNumber,
img1:this.enterpriseFrom.img1, img1: this.enterpriseFrom.img1,
img2:this.enterpriseFrom.img2, img2: this.enterpriseFrom.img2,
legalName:this.enterpriseFrom.legalName, legalName: this.enterpriseFrom.legalName,
name:this.enterpriseFrom.name, name: this.enterpriseFrom.name,
userEnterpriseAuthId:this.enterpriseFrom.id, userEnterpriseAuthId: this.enterpriseFrom.id,
auditPass:true, auditPass: true,
} };
memberUserUpdateEnterprise(p).then(r =>{ memberUserUpdateEnterprise(p).then((r) => {
if(r.code === 0){ if (r.code === 0) {
if(p.auditPass === true){ if (p.auditPass === true) {
this.getEnterpriseFn(); this.getEnterpriseFn();
} }
this.getList() this.getList();
this.modifyLicense = true; this.modifyLicense = true;
this.$message.success(this.$t('修改成功')); this.$message.success(this.$t("修改成功"));
} }
}) });
} }
}) });
}, },
authentication(row){ authentication(row) {
if(!row.identityAuditStatus && !row.enterpriseAuditStatus){ if (!row.identityAuditStatus && !row.enterpriseAuditStatus) {
return this.$t('') return this.$t("");
}else if(!!row.identityAuditStatus && !!row.enterpriseAuditStatus){ } else if (!!row.identityAuditStatus && !!row.enterpriseAuditStatus) {
return this.$t('双认证') return this.$t("双认证");
} else if(row.identityAuditStatus >= 0){ } else if (row.identityAuditStatus >= 0) {
return this.$t('身份') return this.$t("身份");
}else if(row.enterpriseAuditStatus >= 0){ } else if (row.enterpriseAuditStatus >= 0) {
return this.$t('营业') return this.$t("营业");
} }
}, },
submit(){ submit() {
let p = { let p = {
cardNumber:this.enterpriseFrom.cardNumber, cardNumber: this.enterpriseFrom.cardNumber,
img1:this.enterpriseFrom.img1, img1: this.enterpriseFrom.img1,
img2:this.enterpriseFrom.img2, img2: this.enterpriseFrom.img2,
legalName:this.enterpriseFrom.legalName, legalName: this.enterpriseFrom.legalName,
name:this.enterpriseFrom.name, name: this.enterpriseFrom.name,
userEnterpriseAuthId:this.enterpriseFrom.id, userEnterpriseAuthId: this.enterpriseFrom.id,
userId:this.publicObj.id userId: this.publicObj.id,
} };
userCreateAuditEnterprise(p).then(r => { userCreateAuditEnterprise(p).then((r) => {
if(r.code === 0){ if (r.code === 0) {
this.$message.success(this.$t('添加成功!')); this.$message.success(this.$t("添加成功!"));
this.enterpriseFrom.status = 2 this.enterpriseFrom.status = 2;
this.enterpriseFrom.auditTime = new Date().getTime() this.enterpriseFrom.auditTime = new Date().getTime();
this.getEnterpriseFn(); this.getEnterpriseFn();
this.getList() this.getList();
} }
}) });
}, },
submitId(){ submitId() {
this.$refs.formId.validate(async valid =>{ this.$refs.formId.validate(async (valid) => {
if(valid){ if (valid) {
let p ={ let p = {
cardNumber:this.IdDetails.cardNumber, cardNumber: this.IdDetails.cardNumber,
cardType:this.IdDetails.cardType, cardType: this.IdDetails.cardType,
img1:this.IdDetails.img1, img1: this.IdDetails.img1,
img2:this.IdDetails.img2, img2: this.IdDetails.img2,
name:this.IdDetails.name, name: this.IdDetails.name,
status:2, status: 2,
userId:this.publicObj.id userId: this.publicObj.id,
}; };
createAuditIdCard(p).then(r => { createAuditIdCard(p).then((r) => {
if(r.code === 0){ if (r.code === 0) {
this.$message.success(this.$t('添加成功!')); this.$message.success(this.$t("添加成功!"));
this.IdDetails.status = 2 this.IdDetails.status = 2;
this.IdDetails.auditTime = new Date().getTime() this.IdDetails.auditTime = new Date().getTime();
this.getIdentityDetails(); this.getIdentityDetails();
this.getList() this.getList();
} }
}) });
} }
}) });
} },
},
watch: {
attestationShow(newVal) {
if (!newVal) {
this.resetId();
this.resetEnterprise();
this.publicObj = undefined;
} else {
this.modifyIdCard = true;
this.modifyLicense = true;
}
},
}, },
watch:{
attestationShow(newVal){
if(!newVal){
this.resetId();
this.resetEnterprise()
this.publicObj = undefined;
}else {
this.modifyIdCard = true;
this.modifyLicense = true;
}
}
}
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.details{ .details {
.el-input { .el-input {
width: 300px; width: 300px;
} }
.el-textarea{ .el-textarea {
width: 300px; width: 300px;
} }
} }
......
...@@ -81,6 +81,15 @@ ...@@ -81,6 +81,15 @@
<el-descriptions-item :label="$t('上次登录')">{{ <el-descriptions-item :label="$t('上次登录')">{{
details.loginDate details.loginDate
}}</el-descriptions-item> }}</el-descriptions-item>
<el-descriptions-item :label="$t('绑定客户')">{{
details.customerCode
}}</el-descriptions-item>
<el-descriptions-item :label="$t('国家')">{{
isChinese ? details.countryTitleZh : details.countryTitleEn
}}</el-descriptions-item>
<el-descriptions-item :label="$t('城市')">{{
isChinese ? details.cityTitleZh : cityTitleEn
}}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<!--lanbm 2024-05-15 修改信息显示BUG--> <!--lanbm 2024-05-15 修改信息显示BUG-->
<el-descriptions <el-descriptions
...@@ -168,6 +177,320 @@ ...@@ -168,6 +177,320 @@
: "" : ""
}}</el-descriptions-item> }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<!-- 积分信息 -->
<el-descriptions
style="margin-top: 20px"
:title="$t('积分信息')"
:column="6"
direction="vertical"
border
>
<el-descriptions-item :label="$t('会员图标')">
<el-image
:src="details.userScoreLevelInfo.levelIcon"
style="width: 20px; height: 20px"
>{{ $t("") }}</el-image
></el-descriptions-item
>
<el-descriptions-item :label="$t('会员等级')">
{{ details.userScoreLevelInfo.levelName }}
</el-descriptions-item>
<el-descriptions-item :label="$t('当前积分')">{{
details.userScoreLevelInfo.holdScore
}}</el-descriptions-item>
<el-descriptions-item :label="$t('已兑换积分')">{{
details.userScoreLevelInfo.usedScore
}}</el-descriptions-item>
<el-descriptions-item :label="$t('推荐码')">{{
details.userScoreLevelInfo.memberCode
}}</el-descriptions-item>
<el-descriptions-item :label="$t('操作')">
<!-- <el-button
type="text"
class="copy-btn"
:data-clipboard-text="details.memberCode"
>
{{ $t("复制推荐码") }}
</el-button> -->
<el-button type="text" @click="handleExchangeRewards(details)">
{{ $t("兑换礼品") }}
</el-button>
</el-descriptions-item>
</el-descriptions>
<!-- table Tab -->
<el-menu
:default-active="activeIndex"
class="el-menu-demo"
mode="horizontal"
@select="handleSelect"
>
<el-menu-item index="reward">{{ $t("积分记录") }}</el-menu-item>
<el-menu-item index="exchange">{{ $t("兑换记录") }}</el-menu-item>
</el-menu>
<div class="table-container">
<div class="reward" v-if="activeIndex == 'reward'">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="120px"
>
<el-form-item :label="$t('积分规则')">
<dict-selector
clearable
:type="DICT_TYPE.SCORE_RULE_TYPE"
v-model="queryParams.sourceType"
@change="handleQuery"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('规则说明')">
<el-input
style="width: 300px"
v-model.trim="queryParams.ruleDesc"
: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-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTime"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</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" :data="memberList">
<el-table-column
width="140"
:label="$t('积分记录ID')"
align="center"
prop="id"
></el-table-column>
<el-table-column :label="$t('积分来源')" align="center">
<template slot-scope="scope">
{{
isChinese
? handleSourceType(scope.row.sourceType).label
: handleSourceType(scope.row.sourceType).labelEn
}}
</template>
</el-table-column>
<el-table-column
:label="$t('规则标题')"
align="center"
:prop="isChinese ? 'ruleTitleZh' : 'ruleTitleEn'"
>
</el-table-column>
<el-table-column
:label="$t('规则说明')"
align="center"
:prop="isChinese ? 'ruleDescZh' : 'ruleDescEn'"
>
</el-table-column>
<el-table-column
align="center"
:label="$t('分值')"
prop="scoreCount"
></el-table-column>
<el-table-column :label="$t('操作积分时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.createTime) || "/" }}</template
>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="handleQueryPagination"
/>
</div>
<div class="exchange" v-else>
<el-form
:model="queryParamsRecord"
ref="queryForm"
size="small"
:inline="true"
label-width="120px"
>
<el-form-item :label="$t('礼品名称')">
<el-input
style="width: 300px"
v-model.trim="queryParamsRecord.rewardTitle"
:placeholder="$t('请输入礼品名称')"
clearable
@keyup.enter.native="handleQuery"
onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
/>
</el-form-item>
<el-form-item :label="$t('领取方式')">
<dict-selector
clearable
:type="DICT_TYPE.WAY_OF_RECEIVING"
v-model="queryParamsRecord.redeemType"
>
</dict-selector>
</el-form-item>
<el-form-item :label="$t('兑换时间')">
<el-date-picker
type="datetimerange"
clearable
placement="bottom-start"
v-model="dateRangeCreateTimeRecord"
style="width: 240px"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
:start-placeholder="$t('开始日期')"
:end-placeholder="$t('结束日期')"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
@click="handleQueryRecord"
>{{ $t("搜索") }}</el-button
>
<el-button icon="el-icon-refresh" @click="resetQueryRecord">{{
$t("重置")
}}</el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
v-loading="loading"
:data="memberRecordList"
>
<el-table-column
width="140"
:label="$t('兑换记录ID')"
align="center"
prop="id"
></el-table-column>
<el-table-column
width="140"
:label="$t('礼品ID')"
align="center"
prop="rewardCode"
></el-table-column>
<el-table-column
:label="$t('礼品名称')"
align="center"
:prop="isChinese ? 'rewardTitleZh' : 'rewardTitleEn'"
></el-table-column>
<el-table-column
:label="$t('会员名称')"
align="center"
:prop="isChinese ? 'memberNameZh' : 'memberNameEn'"
></el-table-column>
<el-table-column :label="$t('兑换时间')" align="center">
<template v-slot="{ row }">
{{ parseTime(row.redemptionTime) || "/" }}</template
>
</el-table-column>
<el-table-column
:label="$t('兑换积分')"
align="center"
prop="totalCount"
></el-table-column>
<el-table-column width="140" :label="$t('兑换入口')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeEntrance(row.entrance).label
: handleExchangeEntrance(row.entrance).labelEn
}}
</template>
</el-table-column>
<el-table-column
width="140"
:label="$t('兑换网点')"
align="center"
:prop="isChinese ? 'nodeTitleZh' : 'nodeTitleEn'"
>
</el-table-column>
<el-table-column width="140" :label="$t('领取方式')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeRedeemType(row.redeemType).label
: handleExchangeRedeemType(row.redeemType).labelEn
}}
</template>
</el-table-column>
<el-table-column width="140" :label="$t('状态')" align="center">
<template v-slot="{ row }">
{{
isChinese
? handleExchangeStatus(row.status).label
: handleExchangeStatus(row.status).labelEn
}}
</template>
</el-table-column>
<el-table-column
width="140"
:label="$t('备注')"
align="center"
prop="remark"
></el-table-column
>
<el-table-column
width="140"
:label="$t('数量')"
align="center"
prop="rewardCount"
></el-table-column>
<el-table-column
width="140"
:label="$t('创建人')"
align="center"
prop="creatorName"
></el-table-column>
<el-table-column
width="140"
:label="$t('更新人')"
align="center"
prop="updaterName"
></el-table-column>
</el-table>
<!-- //分页列表 -->
<pagination
v-show="totalRecord > 0"
:total="totalRecord"
:page.sync="queryParamsRecord.pageNo"
:limit.sync="queryParamsRecord.pageSize"
@pagination="handleQueryPaginationRecord"
/>
</div>
</div>
<el-dialog <el-dialog
title="保函/证书" title="保函/证书"
:visible.sync="guaranteeShow" :visible.sync="guaranteeShow"
...@@ -509,12 +832,54 @@ import { ...@@ -509,12 +832,54 @@ import {
import FileUpload from "@/components/FileUpload/index.vue"; import FileUpload from "@/components/FileUpload/index.vue";
import ImageUpload from "@/components/ImageUpload/index.vue"; import ImageUpload from "@/components/ImageUpload/index.vue";
import { DICT_TYPE, getDictDatas } from "@/utils/dict"; import { DICT_TYPE, getDictDatas } from "@/utils/dict";
import ClipboardJS from "clipboard";
import {
queryMemberScoreRecord,
queryMemberExchangeRecord,
} from "@/api/ecw/memberManagement";
export default { export default {
name: "memberDetails", name: "memberDetails",
components: { ImageUpload, FileUpload }, components: { ImageUpload, FileUpload },
data() { data() {
return { return {
//兑换记录:
dateRangeCreateTimeRecord: [],
memberRecordList: [],
queryParamsRecord: {
rewardTitle: "",
memberId: this.$route.params.id,
memberName: "", //会员昵称
redeemType: "", //兑换方式
status: "",
rewardCount: "",
rewardCountOperate: "",
rewardCode: "",
entrance: "", //兑换入口
startTime: "",
endTime: "",
nodeId: "",
pageNo: 1,
pageSize: 100,
},
queryParams: {
ruleTitle: "",
ruleDesc: "",
key: "",
sourceType: "",
scoreCount: "",
memberId: this.$route.params.id,
scoreCountOperate: "",
endTime: "",
pageNo: 1,
pageSize: 10,
startTime: "",
},
dateRangeCreateTime: [],
total: 0,
totalRecord: 0,
loading: true,
activeIndex: "reward",
// 表单校验 // 表单校验
rulesId: { rulesId: {
name: [ name: [
...@@ -648,8 +1013,156 @@ export default { ...@@ -648,8 +1013,156 @@ export default {
}, },
created() { created() {
this.getDetails(); this.getDetails();
this.handleQuery();
this.handleQueryRecord();
},
computed: {
isChinese() {
return this.$i18n.locale === "zh_CN";
},
},
mounted() {
let clipboard = new ClipboardJS(".copy-btn");
clipboard.on("success", () => {
this.$message.success(this.$t("复制成功"));
});
clipboard.on("error", () => {
this.$message.error(this.$t("复制失败"));
});
}, },
methods: { methods: {
handleExchangeRedeemType(id) {
return this.getDictDatas(DICT_TYPE.WAY_OF_RECEIVING).filter(
(item) => item.value == id
)[0];
},
//兑换入口
handleExchangeEntrance(id) {
return this.getDictDatas(DICT_TYPE.PLATFORM_TYPE).filter(
(item) => item.value == id
)[0];
},
//兑换状态
handleExchangeStatus(id) {
return this.getDictDatas(DICT_TYPE.REWARD_REDEEM_STATUS).filter(
(item) => item.value == id
)[0];
},
handleQueryRecord() {
this.queryParamsRecord.pageNo = 1;
let params = { ...this.queryParamsRecord };
if (this.dateRangeCreateTimeRecord) {
params.startTime = this.dateRangeCreateTimeRecord[0];
params.endTime = this.dateRangeCreateTimeRecord[1];
}
queryMemberExchangeRecord(params).then((res) => {
this.loading = false;
this.memberRecordList = res.data.list;
this.totalRecord = res.data.total;
});
},
resetQueryRecord() {
this.loading = true;
this.dateRangeCreateTimeRecord = [];
this.queryParamsRecord = {
country: null,
city: null,
endTime: null,
holdScore: null,
memberId: this.$route.params.id,
holdScoreOperate: null,
key: null,
pageNo: 1,
pageSize: 100,
startTime: null,
usedScore: null,
usedScoreOperate: null,
};
this.handleQueryRecord();
},
handleQueryPaginationRecord() {
let params = { ...this.queryParamsRecord };
if (this.dateRangeCreateTimeRecord) {
params.startTime = this.dateRangeCreateTimeRecord[0];
params.endTime = this.dateRangeCreateTimeRecord[1];
}
queryMemberExchangeRecord(params).then((res) => {
this.loading = false;
this.memberRecordList = res.data.list;
this.totalRecord = res.data.total;
});
},
handleSourceType(id) {
return this.getDictDatas(DICT_TYPE.MEMBER_SCORE_SOURCE).filter(
(item) => item.value == id
)[0];
},
handleholdScoreStatus(id) {
return this.getDictDatas(DICT_TYPE.MEMBER_SCORE_OPERATE_TYPE).filter(
(item) => item.value == id
)[0];
},
handleQuery() {
this.queryParams.pageNo = 1;
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
queryMemberScoreRecord(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
handleQueryPagination() {
let params = { ...this.queryParams };
if (this.dateRangeCreateTime) {
params.startTime = this.dateRangeCreateTime[0];
params.endTime = this.dateRangeCreateTime[1];
}
queryMemberScoreRecord(params).then((res) => {
this.loading = false;
this.memberList = res.data.list;
this.total = res.data.total;
});
},
resetQuery() {
this.loading = true;
this.dateRangeCreateTime = [];
this.queryParams = {
ruleTitle: "",
ruleDesc: "",
key: "",
sourceType: "",
scoreCount: "",
memberId: this.$route.params.id,
scoreCountOperate: "",
endTime: "",
pageNo: 1,
pageSize: 1000,
startTime: "",
};
this.handleQuery();
},
handleCopyReferralCode(details) {},
handleSelect(key, keyPath) {
console.log(key, keyPath);
this.activeIndex = key;
},
handleExchangeRewards(details) {
this.$router.push({
path: "/memberManagement/exchangeRecordOperation",
query: {
memberId: details.userScoreLevelInfo.memberId,
pageStatus: "add",
},
});
},
deleteFn(row) { deleteFn(row) {
const nickname = row.nickname; const nickname = row.nickname;
this.$modal this.$modal
...@@ -669,7 +1182,6 @@ export default { ...@@ -669,7 +1182,6 @@ export default {
}, },
getDetails() { getDetails() {
memberUserGet({ id: this.$route.params.id }).then((r) => { memberUserGet({ id: this.$route.params.id }).then((r) => {
console.log(r, "rrrr");
this.details = r.data; this.details = r.data;
}); });
}, },
...@@ -899,4 +1411,7 @@ export default { ...@@ -899,4 +1411,7 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.table-container {
padding-top: 20px;
}
</style> </style>
...@@ -574,7 +574,7 @@ export default { ...@@ -574,7 +574,7 @@ export default {
$route(to) { $route(to) {
//lanbm 2024-05-06 解决重新进入参数不刷新的问题 //lanbm 2024-05-06 解决重新进入参数不刷新的问题
//this.$route.name == "客户分析" 用name做逻辑判断,有时候菜单名称会变化 //this.$route.name == "客户分析" 用name做逻辑判断,有时候菜单名称会变化
//"/report/customer_analysis" lanbm 2024-05-07 调整为根据path做逻辑判断 //"/report/customer_analysis" 调整为根据path做逻辑判断
if (this.$route.path == "/report/customer_analysis") { if (this.$route.path == "/report/customer_analysis") {
this.doLoadData(); this.doLoadData();
} }
......
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
/>--> />-->
</div> </div>
</template> </template>
<script> <script>
import UserSelector from "@/components/UserSelector"; import UserSelector from "@/components/UserSelector";
import Treeselect from "@riophae/vue-treeselect"; import Treeselect from "@riophae/vue-treeselect";
...@@ -389,4 +389,3 @@ export default { ...@@ -389,4 +389,3 @@ export default {
}, },
}; };
</script> </script>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment