Browse Source

refactor:地区级联

zhangrenyuan/feature-20250728113353-金币前端三期
lihui 2 weeks ago
parent
commit
13467ba2ff
  1. 2
      src/views/audit/gold/rechargeAudit.vue
  2. 80
      src/views/consume/gold/coinConsumeDetail.vue
  3. 260
      src/views/permissions/userPermission.vue
  4. 98
      src/views/recharge/gold/coinRechargeDetail.vue
  5. 77
      src/views/refund/gold/coinRefundDetail.vue
  6. 84
      src/views/usergold/gold/clientCountBalance.vue
  7. 77
      src/views/usergold/gold/clientCountDetail.vue

2
src/views/audit/gold/rechargeAudit.vue

@ -95,7 +95,7 @@
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
{{ scope.row.market || "----" }}
</template>
</el-table-column>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>

80
src/views/consume/gold/coinConsumeDetail.vue

@ -29,7 +29,7 @@ const tableData = ref([])
const consumeUser = ref({
jwcode: null,
payPlatform: "",
markets: [],
market: "",
startTime: '',
endTime: '',
@ -63,7 +63,7 @@ const getTime = ref({
const activity = ref([])
//
const markets = ref([])
const market = ref("")
//
const sortField = ref('')
@ -115,7 +115,7 @@ const goods = ref([])
const totalGoldSearch = ref({
jwcode: null,
payPlatform: "",
markets: [],
market:"" ,
startTime: "",
endTime: "",
goodsName: ""
@ -194,7 +194,7 @@ const ConsumeSelectBy = async function (val) {
totalGoldSearch.value.startTime = consumeUser.value.startTime
totalGoldSearch.value.endTime = consumeUser.value.endTime
totalGoldSearch.value.payPlatform = consumeUser.value.payPlatform
totalGoldSearch.value.markets = consumeUser.value.markets
totalGoldSearch.value.market = consumeUser.value.market
totalGoldSearch.value.goodsName = consumeUser.value.goodsName
totalGoldSearch.value.jwcode = consumeUser.value.jwcode
//
@ -267,7 +267,7 @@ const reset = function () {
consumeUser.value.goodsName = ''
consumeUser.value.markets = []
consumeUser.value.market = ""
consumeUser.value.payPlatform = ''
@ -396,7 +396,7 @@ const exportExcel = async function () {
consumeUser: {
jwcode: consumeUser.value.jwcode || '',
payPlatform: consumeUser.value.payPlatform || '',
markets: consumeUser.value.markets || [],
marketss: consumeUser.value.market || "",
startTime: consumeUser.value.startTime || '',
endTime: consumeUser.value.endTime || '',
goodsName: consumeUser.value.goodsName || '',
@ -483,63 +483,16 @@ const getTagText = (state) => {
}
}
//
const selectedMarketPath = ref([])
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (Array.isArray(value) && value.length > 0) {
const ids = new Set();
value.forEach(path => {
const lastName = path[path.length - 1];
const id = reverseMarketMapping[lastName];
if (id) ids.add(Number(id));
});
//
const getAllLeafNames = (nodes) => {
const leafNames = [];
const traverse = (node, parentName = null) => {
if (!node.children || node.children.length === 0) {
leafNames.push({name: node.label, parent: parentName});
} else {
node.children.forEach(child => traverse(child, node.label));
}
};
nodes.forEach(node => traverse(node));
return leafNames;
};
const leafNameMap = getAllLeafNames(markets.value); //
//
const parentToChildren = {};
leafNameMap.forEach(({name, parent}) => {
if (!parentToChildren[parent]) parentToChildren[parent] = [];
parentToChildren[parent].push(name);
});
//
const selectedLeafNames = value.map(path => path[path.length - 1]);
// parent parent
Object.entries(parentToChildren).forEach(([parent, children]) => {
const allChildrenSelected = children.every(child => selectedLeafNames.includes(child));
if (allChildrenSelected && reverseMarketMapping[parent]) {
ids.add(Number(reverseMarketMapping[parent]));
}
});
consumeUser.value.markets = Array.from(ids);
if (value && value.length > 0) {
const lastValue = value[value.length - 1]
consumeUser.value.market = reverseMarketMapping[lastValue]
} else {
consumeUser.value.markets = [];
consumeUser.value.market = ''
}
}
console.log('最终映射后的 market IDs:', consumeUser.value.markets);
};
const props = {multiple: true}
//
const getMarket = async function () {
try {
@ -569,8 +522,8 @@ const getMarket = async function () {
});
};
//
markets.value = transformTree(result.data)
console.log('转换后的地区树==============', markets.value)
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -603,14 +556,11 @@ const getMarket = async function () {
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="markets"
:options="market"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:180px"
@change="handleMarketChange"
:props="props"
/>
</el-col>
<el-col :span="6">

260
src/views/permissions/userPermission.vue

@ -9,6 +9,9 @@ import API from '@/util/http'
const tableData = ref([])
const total = ref(100)
const propsAdduser = {
multiple: true, //
}
// admin
const admin = ref({
account: '',
@ -173,17 +176,45 @@ const getRoleArea = async function () {
console.log('请求失败', error)
}
}
//
const marketsTree = ref([])
const getArea = async function () {
try {
const result = await request({
url: '/general/adminMarkets',
data: {account: adminData.value.account}
})
market.value = result.data
// POST
const result = await API({
url: '/market/selectMarket',
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
children: grandchildren
};
});
};
//
marketsTree.value = transformTree(result.data)
console.log('转换后的地区树==============', marketsTree.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const getStore = async function () {
try {
@ -260,6 +291,7 @@ const permissionAdd = async function () {
"machineId": addAdmin.value.machineIds[0],//
"remark": addAdmin.value.remark//
}
console.log('提交前addAdmin market', addAdmin.value.market)
const result = await request({
url: '/permission/addPermission',
data: params
@ -288,6 +320,20 @@ const Ref = ref(null)
//
const permissionList = ref([])
const getRoles = async function () {
try {
const res = await API({url: '/role/selectAll'})
permissionList.value = res.data.map(item => ({
label: item.roleName,
value: item.id
}))
console.log('权限列表:', permissionList.value)
} catch (error) {
console.error('获取权限列表失败:', error)
}
}
//
const openUserEditVisible = function () {
@ -577,7 +623,8 @@ const handleCurrentChange = function (val) {
const data = ref([])
const handleMarketChange = (values) => {
// todo
/*const handleMarketChange = (values) => {
console.log('values的类型:', typeof values);
console.log('values的值:', values);
//
@ -589,27 +636,99 @@ const handleMarketChange = (values) => {
}
console.log('看看现在的地区', addAdmin.value.market);
};
const includeHq = computed(() => {
const i = addAdmin.value.market.includes('总部')
return (item) => i && item != '总部'
})
const EditincludeHq = computed(() => {
const i = permissionEditObj.value.market.includes('总部')
return (item) => i && item != '总部'
})
const EdithandleMarketChange = (values) => {
//
const hasHeadquarters = values.includes('总部');
if (hasHeadquarters) {
//
permissionEditObj.value.market = ['总部'];
};*/
//
const selectedMarketPath = ref("")
// id
const handleMarketChange = (value) => {
if (value && value.length > 0) {
admin.value.market = value[value.length - 1]
} else {
admin.value.market = ''
}
console.log('看看现在的地区', permissionEditObj.value.market);
}
//
const handleMarketChangeAddUser = (value) => {
if (Array.isArray(value) && value.length > 0) {
//
const selectedMarkets = value
.map(path => Array.isArray(path) && path.length > 0 ? path[path.length - 1] : null)
.filter(Boolean);
//
const hasHeadquarters = selectedMarkets.includes('总部');
if (hasHeadquarters) {
//
addAdmin.value.market = ['总部'];
} else {
//
addAdmin.value.market = selectedMarkets;
}
} else {
//
addAdmin.value.market = [];
}
};
//
const handleMarketChangeEditUser = (value) => {
if (Array.isArray(value) && value.length > 0) {
//
const selectedMarkets = value
.map(path => Array.isArray(path) && path.length > 0 ? path[path.length - 1] : null)
.filter(Boolean);
//
const hasHeadquarters = selectedMarkets.includes('总部');
if (hasHeadquarters) {
//
permissionEditObj.value.market = ['总部'];
} else {
//
permissionEditObj.value.market = selectedMarkets;
}
} else {
//
permissionEditObj.value.market = [];
}
};
//
const addUserProps = computed(() => {
// addAdmin.market
const hasHeadquarters = addAdmin.value.market.includes('总部');
return {
multiple: true, //
//
disabled: (data) => {
return hasHeadquarters && data.label !== '总部';
}
};
});
//
const editUserProps = computed(() => {
// addAdmin.market
const hasHeadquarters = permissionEditObj.value.market.includes('总部');
return {
multiple: true, //
//
disabled: (data) => {
return hasHeadquarters && data.label !== '总部';
}
};
});
const selectParentNodes = (treeData, nodeId, checkedKeys) => {
if (!Array.isArray(treeData)) return false;
@ -712,37 +831,37 @@ const cancelResetPassword = function () {
}
//
const selectParentNodesForSubmit = (treeData, nodeId, checkedKeys) => {
if (!Array.isArray(treeData)) return false;
for (const item of treeData) {
//
if (item.children && item.children.length > 0) {
const foundInChildren = selectParentNodesForSubmit(item.children, nodeId, checkedKeys);
if (foundInChildren) {
//
checkedKeys.add(item.id);
return true;
}
}
const selectParentNodesForSubmit = (treeData, nodeId, checkedKeys) => {
if (!Array.isArray(treeData)) return false;
//
if (item.id === nodeId) {
for (const item of treeData) {
//
if (item.children && item.children.length > 0) {
const foundInChildren = selectParentNodesForSubmit(item.children, nodeId, checkedKeys);
if (foundInChildren) {
//
checkedKeys.add(item.id);
return true;
}
}
return false;
};
//
if (item.id === nodeId) {
return true;
}
}
return false;
};
const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
trailing: false
})
const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
trailing: false
})
// 使 _.throttle trailing false
const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
trailing: false
})
const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
trailing: false
})
//
onMounted(async function () {
@ -750,11 +869,11 @@ onMounted(async function () {
await getPermission()
await getArea()
await getStore()
await getRoles()
await getRoleArea()
})
</script>
<template>
@ -762,7 +881,7 @@ onMounted(async function () {
<!--搜索菜单-->
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px" >
<el-card style="margin-bottom: 20px;margin-top:10px">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text>
@ -770,9 +889,15 @@ onMounted(async function () {
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="admin.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
<el-cascader
v-model="admin.market"
:options="marketsTree"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">职位名称</el-text>
@ -880,10 +1005,19 @@ onMounted(async function () {
</el-form-item>
<el-form-item prop="market" label="所属地区:" required clearable>
<el-select multiple v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 220px" clearable
@change="handleMarketChange">
<el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="includeHq(item)"/>
</el-select>
<el-cascader
v-model="addAdmin.market"
:options="marketsTree"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:220px"
@change="handleMarketChangeAddUser"
:max-collapse-tags="2"
:props="addUserProps"
/>
</el-form-item>
<el-form-item prop="permission" label="角色名称:" required>
<el-select v-model="addAdmin.permission" placeholder="请选择角色名称" style="width: 220px" clearable>
@ -930,11 +1064,19 @@ onMounted(async function () {
<el-input v-model="permissionEditObj.adminName" placeholder="请输入用户名" style="width: 220px" disabled/>
</el-form-item>
<el-form-item prop="market" label="所属地区:" clearable>
<el-select multiple v-model="permissionEditObj.market" placeholder="请选择所属地区" style="width: 220px"
clearable
@change="EdithandleMarketChange">
<el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="EditincludeHq(item)"/>
</el-select>
<el-cascader
v-model="permissionEditObj.market"
:options="marketsTree"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:220px"
@change="handleMarketChangeEditUser"
:max-collapse-tags="2"
:props="editUserProps"
/>
</el-form-item>
<el-form-item prop="postiton" label="职位:">
<el-input v-model="permissionEditObj.postiton" placeholder="请输入职位" style="width: 220px" clearable/>

98
src/views/recharge/gold/coinRechargeDetail.vue

@ -1,9 +1,6 @@
<script setup>
import {ref, onMounted, reactive, computed} from 'vue'
import ElementPlus from 'element-plus'
import {ElMessage, ElMessageBox} from 'element-plus'
import {AiFillRead} from 'vue-icons-plus/ai'
import axios from 'axios'
import {onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import moment from 'moment'
import API from '@/util/http.js'
import {marketMapping, reverseMarketMapping} from '@/utils/marketMap.js';
@ -23,7 +20,7 @@ const getAdminData = async function () {
}
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
new Date(2000, 2, 1, 23, 59, 59),
]
//
//
@ -39,12 +36,13 @@ const handleDatePickerChange = () => {
// recharge
const rechargeUser = ref({
adminId: adminData.value.id,
markets: [],
market: "",
})
//
const selectedMarketPath = ref([])
//
/*//处理地区选择变化
const handleMarketChange = (value) => {
if (Array.isArray(value) && value.length > 0) {
const ids = new Set();
@ -71,7 +69,7 @@ const handleMarketChange = (value) => {
return leafNames;
};
const leafNameMap = getAllLeafNames(markets.value); //
const leafNameMap = getAllLeafNames(market.value); //
// { parentName: [childName1, childName2, ...] }
const parentToChildren = {};
@ -91,13 +89,50 @@ const handleMarketChange = (value) => {
}
});
rechargeUser.value.markets = Array.from(ids);
// ID
const idArray = Array.from(ids);
rechargeUser.value.market= idArray.length > 0 ? idArray[0].toString() : "";
} else {
rechargeUser.value.market = "";
}
console.log('最终映射后的 market IDs:', rechargeUser.value.market);
};*/
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1]
rechargeUser.value.market = reverseMarketMapping[lastValue]
} else {
rechargeUser.value.markets = [];
rechargeUser.value.market = ''
}
}
console.log('最终映射后的 market IDs:', rechargeUser.value.markets);
};
/*// 处理地区选择变化单选场景
const handleMarketChange = (value) => {
//
rechargeUser.value.market = "";
//
if (Array.isArray(value) && value.length > 0) {
// value
const selectedPath = value[0];
if (Array.isArray(selectedPath) && selectedPath.length > 0) {
//
const lastName = selectedPath[selectedPath.length - 1];
// ID
const id = reverseMarketMapping[lastName];
// ID
if (id) {
rechargeUser.value.market = String(id);
}
}
}
console.log('最终选中的 market ID:', rechargeUser.value.market);
};*/
//
const getObj = ref({
@ -113,7 +148,7 @@ const activity = ref([])
//
const allData = ref([])
//
const markets = ref([])
const market = ref("")
//
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
// money permanentGold freeGold
@ -211,8 +246,8 @@ const getArea = async function () {
});
};
//
markets.value = transformTree(result.data)
console.log('转换后的地区树==============', markets.value)
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -278,7 +313,7 @@ const get = async function (val) {
})
// rechargeUser.value
const detailWithoutSort = ref({
markets: rechargeUser.value.markets,
market: rechargeUser.value.market,
activity: rechargeUser.value.activity,
adminId: rechargeUser.value.adminId,
startTime: rechargeUser.value.startTime,
@ -336,8 +371,8 @@ const reset = function () {
delete rechargeUser.value.jwcode
delete rechargeUser.value.activity
delete rechargeUser.value.payPlatform
rechargeUser.value.markets = []
selectedMarketPath.value = [] //
rechargeUser.value.market = ""
selectedMarketPath.value = "" //
delete rechargeUser.value.startTime
delete rechargeUser.value.endTime
delete sortField.value
@ -351,7 +386,7 @@ const reset = function () {
const getToday = function () {
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime =today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
@ -521,7 +556,6 @@ const getTagText = (state) => {
return '未知状态';
}
}
const props = {multiple: true}
</script>
@ -545,27 +579,16 @@ const props = {multiple: true}
</el-select>
</div>
</el-col>
<!-- <el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="rechargeUser.market" placeholder="请选择所属地区" style="width: 180px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</div>
</el-col> -->
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="markets"
:options="market"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:180px"
@change="handleMarketChange"
:props="props"
/>
</div>
</el-col>
@ -584,7 +607,8 @@ const props = {multiple: true}
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
@ -658,7 +682,7 @@ const props = {multiple: true}
</el-row>
<!-- 导出弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名"/>
<el-table-column prop="state" label="状态">
<template #default="scope">

77
src/views/refund/gold/coinRefundDetail.vue

@ -51,7 +51,7 @@ const tableData = ref([])
// ======================================
// detail
const refundUser = ref({
markets:[]
market:""
})
//
const getObj = ref({
@ -64,7 +64,7 @@ const total = ref(100)
const getTime = ref([])
//
const markets = ref([])
const market = ref([])
//
const permanentGolds = ref(0)
@ -188,7 +188,7 @@ const search = function () {
}
//
const reset = function () {
refundUser.value = {markets: []}
refundUser.value = {market: ""}
sortField.value = ''
sortOrder.value = ''
getTime.value = {}
@ -365,7 +365,7 @@ const exportExcel = async function () {
refundUser: {
jwcode: refundUser.value.jwcode || '',
refundModel: refundUser.value.refundModel || '',
markets: refundUser.value.markets || [],
market: refundUser.value.market || "",
startTime: refundUser.value.startTime || '',
endTime: refundUser.value.endTime || '',
goodsName: refundUser.value.goodsName || '',
@ -463,63 +463,15 @@ const getTagText = (state) => {
//
const selectedMarketPath = ref([])
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (Array.isArray(value) && value.length > 0) {
const ids = new Set();
value.forEach(path => {
const lastName = path[path.length - 1];
const id = reverseMarketMapping[lastName];
if (id) ids.add(Number(id));
});
//
const getAllLeafNames = (nodes) => {
const leafNames = [];
const traverse = (node, parentName = null) => {
if (!node.children || node.children.length === 0) {
leafNames.push({name: node.label, parent: parentName});
} else {
node.children.forEach(child => traverse(child, node.label));
}
};
nodes.forEach(node => traverse(node));
return leafNames;
};
const leafNameMap = getAllLeafNames(markets.value); //
//
const parentToChildren = {};
leafNameMap.forEach(({name, parent}) => {
if (!parentToChildren[parent]) parentToChildren[parent] = [];
parentToChildren[parent].push(name);
});
//
const selectedLeafNames = value.map(path => path[path.length - 1]);
// parent parent
Object.entries(parentToChildren).forEach(([parent, children]) => {
const allChildrenSelected = children.every(child => selectedLeafNames.includes(child));
if (allChildrenSelected && reverseMarketMapping[parent]) {
ids.add(Number(reverseMarketMapping[parent]));
}
});
refundUser.value.markets = Array.from(ids);
if (value && value.length > 0) {
const lastValue = value[value.length - 1]
refundUser.value.market = reverseMarketMapping[lastValue]
} else {
refundUser.value.markets = [];
refundUser.value.market = ''
}
console.log('最终映射后的 markets IDs:', refundUser.value.markets);
};
const props = {multiple: true}
}
//
const getMarket = async function () {
try {
@ -549,8 +501,8 @@ const getMarket = async function () {
});
};
//
markets.value = transformTree(result.data)
console.log('转换后的地区树==============', markets.value)
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -598,14 +550,11 @@ const getMarket = async function () {
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="markets"
:options="market"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:180px"
@change="handleMarketChange"
:props="props"
/>
</el-col>
<el-col :span="6">

84
src/views/usergold/gold/clientCountBalance.vue

@ -26,7 +26,7 @@ const getAdminData = async function () {
//
const isLoadingmarket = ref(false);
const markets = ref([])
const market = ref("")
//
@ -55,7 +55,7 @@ const total = ref(100)
const getTime = ref([])
// User
const user = ref({
markets: [],
market: "",
})
//
const getAllObj = ref({})
@ -105,7 +105,7 @@ const get = async function (val) {
url: '/goldDetail/goldTotal',
data: {
jwcode: user.value.jwcode,
markets: user.value.markets
market: user.value.market
}
})
// result.data.list
@ -167,7 +167,7 @@ const search = function () {
}
//
const reset = function () {
user.value = { markets: [] }
user.value = { market: "" }
sortField.value = ''
sortOrder.value = ''
get()
@ -217,7 +217,7 @@ const exportExcel = async function () {
const params = {
user: {
jwcode: user.value.jwcode || '',
markets: user.value.markets || []
market: user.value.market || ""
}
}
const res = await API({ url: '/goldDetail/exportGold', data: params })
@ -300,63 +300,15 @@ const getTagText = (state) => {
}
}
//
const selectedMarketPath = ref([])
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (Array.isArray(value) && value.length > 0) {
const ids = new Set();
value.forEach(path => {
const lastName = path[path.length - 1];
const id = reverseMarketMapping[lastName];
if (id) ids.add(Number(id));
});
//
const getAllLeafNames = (nodes) => {
const leafNames = [];
const traverse = (node, parentName = null) => {
if (!node.children || node.children.length === 0) {
leafNames.push({ name: node.label, parent: parentName });
} else {
node.children.forEach(child => traverse(child, node.label));
}
};
nodes.forEach(node => traverse(node));
return leafNames;
};
const leafNameMap = getAllLeafNames(markets.value); //
//
const parentToChildren = {};
leafNameMap.forEach(({ name, parent }) => {
if (!parentToChildren[parent]) parentToChildren[parent] = [];
parentToChildren[parent].push(name);
});
//
const selectedLeafNames = value.map(path => path[path.length - 1]);
// parent parent
Object.entries(parentToChildren).forEach(([parent, children]) => {
const allChildrenSelected = children.every(child => selectedLeafNames.includes(child));
if (allChildrenSelected && reverseMarketMapping[parent]) {
ids.add(Number(reverseMarketMapping[parent]));
}
});
user.value.markets = Array.from(ids);
if (value && value.length > 0) {
const lastValue = value[value.length - 1]
user.value.market = reverseMarketMapping[lastValue]
} else {
user.value.markets = [];
user.value.market = ''
}
console.log('最终映射后的 market IDs:', user.value.markets);
};
const props = { multiple: true }
}
//
const getMarket = async function () {
try {
@ -386,8 +338,8 @@ const getMarket = async function () {
});
};
//
markets.value = transformTree(result.data)
console.log('转换后的地区树==============', markets.value)
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -406,8 +358,14 @@ const getMarket = async function () {
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="markets" placeholder="请选择所属地区" clearable collapse-tags
collapse-tags-tooltip style="width:180px" @change="handleMarketChange" :props="props" />
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</div>
<el-button type="primary" @click="search()">查询</el-button>
<el-button @click="reset" type="success">重置</el-button>

77
src/views/usergold/gold/clientCountDetail.vue

@ -95,7 +95,7 @@ const type = [
//
//
const isLoadingmarket = ref(false);
const markets = ref([])
const market = ref("")
@ -113,7 +113,7 @@ const total = ref(100)
const getTime = ref([])
// goldDetail
const goldDetail = ref({
markets: [],
market: "",
})
//
const getObj = ref({
@ -208,7 +208,7 @@ const reset = function () {
delete goldDetail.value.startTime
delete goldDetail.value.endTime
// delete goldDetail.value.markets
goldDetail.value.markets = []
goldDetail.value.market = ""
delete sortField.value
delete sortOrder.value
getTime.value = []
@ -308,7 +308,7 @@ const exportExcel = async function () {
jwcode: goldDetail.value.jwcode || '',
payPlatform: goldDetail.value.payPlatform || '',
type: goldDetail.value.type || '',
markets: goldDetail.value.markets || [],
market: goldDetail.value.market ||"",
startTime: goldDetail.value.startTime || '',
endTime: goldDetail.value.endTime || '',
sortField: goldDetail.value.sortField || '',
@ -419,63 +419,15 @@ const getTagText = (state) => {
//
const selectedMarketPath = ref([])
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (Array.isArray(value) && value.length > 0) {
const ids = new Set();
value.forEach(path => {
const lastName = path[path.length - 1];
const id = reverseMarketMapping[lastName];
if (id) ids.add(Number(id));
});
//
const getAllLeafNames = (nodes) => {
const leafNames = [];
const traverse = (node, parentName = null) => {
if (!node.children || node.children.length === 0) {
leafNames.push({name: node.label, parent: parentName});
} else {
node.children.forEach(child => traverse(child, node.label));
}
};
nodes.forEach(node => traverse(node));
return leafNames;
};
const leafNameMap = getAllLeafNames(markets.value); //
//
const parentToChildren = {};
leafNameMap.forEach(({name, parent}) => {
if (!parentToChildren[parent]) parentToChildren[parent] = [];
parentToChildren[parent].push(name);
});
//
const selectedLeafNames = value.map(path => path[path.length - 1]);
// parent parent
Object.entries(parentToChildren).forEach(([parent, children]) => {
const allChildrenSelected = children.every(child => selectedLeafNames.includes(child));
if (allChildrenSelected && reverseMarketMapping[parent]) {
ids.add(Number(reverseMarketMapping[parent]));
}
});
goldDetail.value.markets = Array.from(ids);
if (value && value.length > 0) {
const lastValue = value[value.length - 1]
goldDetail.value.market = reverseMarketMapping[lastValue]
} else {
goldDetail.value.markets = [];
goldDetail.value.market = ''
}
console.log('最终映射后的 market IDs:', goldDetail.value.markets);
};
const props = {multiple: true}
}
//
const getMarket = async function () {
try {
@ -505,8 +457,8 @@ const getMarket = async function () {
});
};
//
markets.value = transformTree(result.data)
console.log('转换后的地区树==============', markets.value)
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -548,14 +500,11 @@ const getMarket = async function () {
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="markets"
:options="market"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:180px"
@change="handleMarketChange"
:props="props"
/>
</div>
</el-col>

Loading…
Cancel
Save