feat:搜索条件
This commit is contained in:
1 parent
5071dcbade
commit
f4dff79f5a
14 files changed
+733
-86
No files matched your search
@@ -0,0 +1,592 @@
|
|||||||
|
<template>
|
||||||
|
<Splitpanes class="draggable-dep-mch-tree" @resize="state.treeWidth = $event[0].size">
|
||||||
|
<pane :size="state.treeWidth" class="draggable-dep-mch-tree__tree-pane">
|
||||||
|
<!-- 树 -->
|
||||||
|
<div v-loading="activeState.loading" class="dep-mch-tree-panel">
|
||||||
|
<!-- tab区域:用户部门/商户部门,标签右上角显示当前勾选数量 -->
|
||||||
|
<div class="dep-mch-tree-panel__tabs">
|
||||||
|
<el-tabs v-model="state.activeTab" @tab-change="handleTabChange">
|
||||||
|
<el-tab-pane name="DEPT">
|
||||||
|
<template #label>
|
||||||
|
<span class="dep-mch-tree-panel__tab-label">
|
||||||
|
{{ deptTabLabel }}
|
||||||
|
<el-badge :value="state.dept.checkedTreeNodes.length"
|
||||||
|
:hidden="state.dept.checkedTreeNodes.length === 0" />
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane name="MCH_DEPT">
|
||||||
|
<template #label>
|
||||||
|
<span class="dep-mch-tree-panel__tab-label">
|
||||||
|
{{ mchTabLabel }}
|
||||||
|
<el-badge :value="state.mchDept.checkedTreeNodes.length"
|
||||||
|
:hidden="state.mchDept.checkedTreeNodes.length === 0" />
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 头部区域 -->
|
||||||
|
<div class="dep-mch-tree-panel__header">
|
||||||
|
<el-input v-model="activeState.searchName" class="dep-mch-tree-panel__search" suffix-icon="search"
|
||||||
|
:placeholder="activePlaceholder" :aria-label="activePlaceholder || '搜索树节点'" size="small"
|
||||||
|
clearable @change="handleSearchInputChange" />
|
||||||
|
<div v-if="showExpand" class="dep-mch-tree-panel__operations">
|
||||||
|
<el-dropdown :hide-on-click="false">
|
||||||
|
<button type="button" class="dep-mch-tree-panel__more" title="树操作" aria-label="树操作">
|
||||||
|
<el-icon>
|
||||||
|
<MoreFilled />
|
||||||
|
</el-icon>
|
||||||
|
</button>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu>
|
||||||
|
<el-dropdown-item>
|
||||||
|
<el-button class="!h-5 !text-gray-500 dark:!text-white dark:hover:!text-primary"
|
||||||
|
link :icon="activeState.isExpand ? 'expand' : 'fold'"
|
||||||
|
@click="toggleRowExpansionAll(activeState.isExpand ? false : true)">
|
||||||
|
{{ activeState.isExpand ? "折叠" : "展开" }}
|
||||||
|
</el-button>
|
||||||
|
</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 树形结构:用户部门树 -->
|
||||||
|
<div v-show="state.activeTab === 'DEPT'" class="dep-mch-tree-panel__body">
|
||||||
|
<el-tree ref="deptTreeRef" class="dep-mch-tree-panel__tree" :props="props.props"
|
||||||
|
:data="state.dept.treeDataList" :expand-on-click-node="false" node-key="id"
|
||||||
|
:highlight-current="nodeClickable ? true : false" default-expand-all show-checkbox
|
||||||
|
@node-click="(data: any) => handleNodeClick(data, 'DEPT')"
|
||||||
|
@check="(data: any, checkStatus: any) => handleCheck(data, checkStatus, 'DEPT')">
|
||||||
|
<template #default="{ node, data }">
|
||||||
|
<el-tooltip v-if="data.isLock" effect="dark" :content="$t('sysuser.noDataScopeTip')"
|
||||||
|
placement="right">
|
||||||
|
<span class="dep-mch-tree-panel__locked-node">
|
||||||
|
{{ node.label }}
|
||||||
|
<SvgIcon name="ele-Lock" />
|
||||||
|
</span>
|
||||||
|
</el-tooltip>
|
||||||
|
</template>
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 树形结构:商户部门树 -->
|
||||||
|
<div v-show="state.activeTab === 'MCH_DEPT'" class="dep-mch-tree-panel__body">
|
||||||
|
<el-tree ref="mchDeptTreeRef" class="dep-mch-tree-panel__tree" :props="props.props"
|
||||||
|
:data="state.mchDept.treeDataList" :expand-on-click-node="false" node-key="id"
|
||||||
|
:highlight-current="nodeClickable ? true : false" default-expand-all show-checkbox
|
||||||
|
@node-click="(data: any) => handleNodeClick(data, 'MCH_DEPT')"
|
||||||
|
@check="(data: any, checkStatus: any) => handleCheck(data, checkStatus, 'MCH_DEPT')">
|
||||||
|
<template #default="{ node, data }">
|
||||||
|
<el-tooltip v-if="data.isLock" effect="dark" :content="$t('sysuser.noDataScopeTip')"
|
||||||
|
placement="right">
|
||||||
|
<span class="dep-mch-tree-panel__locked-node">
|
||||||
|
{{ node.label }}
|
||||||
|
<SvgIcon name="ele-Lock" />
|
||||||
|
</span>
|
||||||
|
</el-tooltip>
|
||||||
|
</template>
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 底部区域:当前tab的包含/不包含开关(包含=绿色,不包含=红色) -->
|
||||||
|
<div class="dep-mch-tree-panel__footer">
|
||||||
|
<el-switch v-model="activeState.switch" size="small" :inactive-text="switchInactiveText"
|
||||||
|
:active-text="switchActiveText" :inactive-color="switchInactiveColor"
|
||||||
|
:active-color="switchActiveColor" @change="handleSwitchChange"
|
||||||
|
:disabled="nodeClickable && activeState.checkedTreeNodes.length > 0" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</pane>
|
||||||
|
|
||||||
|
<pane :size="100 - state.treeWidth" class="draggable-dep-mch-tree__content-pane">
|
||||||
|
<!-- 折叠按钮 -->
|
||||||
|
<button type="button" class="draggable-dep-mch-tree__fold"
|
||||||
|
:title="treeVisible ? `收起${activeTreeName}` : `展开${activeTreeName}`"
|
||||||
|
:aria-label="treeVisible ? `收起${activeTreeName}` : `展开${activeTreeName}`" @click="handleClickTreeFold()">
|
||||||
|
<el-icon>
|
||||||
|
<ArrowLeftBold v-if="treeVisible" />
|
||||||
|
<ArrowRightBold v-else />
|
||||||
|
</el-icon>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="draggable-dep-mch-tree__content">
|
||||||
|
<slot name="default" />
|
||||||
|
</div>
|
||||||
|
</pane>
|
||||||
|
</Splitpanes>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="DraggableDepMchTree">
|
||||||
|
import { computed } from "vue"
|
||||||
|
import { useMessage } from "/@/hooks/message"
|
||||||
|
import { deptTree } from "/@/api/admin/dept"
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
placeholder?: string // 用户部门输入框占位符
|
||||||
|
mchPlaceholder?: string // 商户部门输入框占位符
|
||||||
|
deptTabLabel?: string // 用户部门tab文案
|
||||||
|
mchTabLabel?: string // 商户部门tab文案
|
||||||
|
showExpand?: boolean // 折叠控制
|
||||||
|
query?: (searchName?: string) => Promise<any> // 部门树查询函数(两个tab共用)
|
||||||
|
props?: object
|
||||||
|
nodeClickable?: boolean
|
||||||
|
switchInactiveText?: string | undefined
|
||||||
|
switchActiveText?: string | undefined
|
||||||
|
switchInactiveColor?: string // 包含状态开关颜色
|
||||||
|
switchActiveColor?: string // 不包含状态开关颜色
|
||||||
|
defaultTreeWidth?: number | string
|
||||||
|
defaultTab?: string // 默认tab:DEPT | MCH_DEPT
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
placeholder: "",
|
||||||
|
mchPlaceholder: "",
|
||||||
|
deptTabLabel: "用户部门",
|
||||||
|
mchTabLabel: "商户部门",
|
||||||
|
showExpand: true,
|
||||||
|
query: (name?: string) => deptTree({ deptName: name || "" }),
|
||||||
|
props: () => {
|
||||||
|
return {
|
||||||
|
label: "name",
|
||||||
|
children: "children",
|
||||||
|
value: "id",
|
||||||
|
disabled: "isLock",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
nodeClickable: true,
|
||||||
|
switchInactiveText: "包含",
|
||||||
|
switchActiveText: "不包含",
|
||||||
|
switchInactiveColor: "var(--el-color-success)",
|
||||||
|
switchActiveColor: "var(--el-color-danger)",
|
||||||
|
defaultTreeWidth: 20,
|
||||||
|
defaultTab: "DEPT",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
const emit = defineEmits(["getSelectNode"])
|
||||||
|
|
||||||
|
const deptTreeRef = ref() // 用户部门树组件ref
|
||||||
|
const mchDeptTreeRef = ref() // 商户部门树组件ref
|
||||||
|
|
||||||
|
const createTabState = () => ({
|
||||||
|
searchName: "", // 查询关键字
|
||||||
|
isExpand: true, // 是否展开树所有节点
|
||||||
|
treeDataList: [] as any[],
|
||||||
|
curClickedNode: {} as any,
|
||||||
|
checkedTreeNodes: [] as any[], // 被勾选的树节点
|
||||||
|
loading: false,
|
||||||
|
switch: false, // switch开关(false=包含 true=不包含)
|
||||||
|
inited: false, // 是否已加载过树数据
|
||||||
|
})
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
activeTab: props.defaultTab, // 当前tab:DEPT | MCH_DEPT
|
||||||
|
treeWidth: Number(props.defaultTreeWidth), // 树组件宽度
|
||||||
|
treeWidthMemo: Number(props.defaultTreeWidth), // 树组件宽度记录
|
||||||
|
dept: createTabState(), // 用户部门tab状态
|
||||||
|
mchDept: createTabState(), // 商户部门tab状态
|
||||||
|
})
|
||||||
|
|
||||||
|
// 当前tab状态
|
||||||
|
const activeState = computed(() => (state.activeTab === "MCH_DEPT" ? state.mchDept : state.dept))
|
||||||
|
// 当前tab的树ref
|
||||||
|
const activeTreeRef = computed(() => (state.activeTab === "MCH_DEPT" ? mchDeptTreeRef : deptTreeRef))
|
||||||
|
// 当前tab输入框占位符
|
||||||
|
const activePlaceholder = computed(() =>
|
||||||
|
state.activeTab === "MCH_DEPT" ? props.mchPlaceholder || "请输入商户部门名称" : props.placeholder || "请输入用户部门名称",
|
||||||
|
)
|
||||||
|
// 当前tab树名称
|
||||||
|
const activeTreeName = computed(() => (state.activeTab === "MCH_DEPT" ? "商户部门树" : "用户部门树"))
|
||||||
|
|
||||||
|
// 是否折叠树组件
|
||||||
|
const treeVisible = computed(() => state.treeWidth > 0)
|
||||||
|
|
||||||
|
// 获取指定tab的部门树数据(两个tab共用同一棵部门树查询)
|
||||||
|
const getTabTreeData = (tab: "DEPT" | "MCH_DEPT") => {
|
||||||
|
const tabState = tab === "MCH_DEPT" ? state.mchDept : state.dept
|
||||||
|
if (props.query instanceof Function) {
|
||||||
|
tabState.loading = true
|
||||||
|
tabState.inited = true
|
||||||
|
const result = props.query(tabState.searchName)
|
||||||
|
// 如果查询结果为 Promise 类型,则进行后续处理
|
||||||
|
if ((typeof result === "object" || typeof result === "function") && typeof result.then === "function") {
|
||||||
|
result
|
||||||
|
.then((r: any) => {
|
||||||
|
tabState.treeDataList = r.data
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
useMessage().error(err.msg)
|
||||||
|
})
|
||||||
|
.finally(() => (tabState.loading = false))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取当前tab树数据
|
||||||
|
const getTreeData = () => getTabTreeData(state.activeTab as "DEPT" | "MCH_DEPT")
|
||||||
|
|
||||||
|
// tab切换
|
||||||
|
const handleTabChange = (tab: any) => {
|
||||||
|
state.activeTab = tab
|
||||||
|
// 懒加载:首次切换到该tab时才请求树数据
|
||||||
|
if (!activeState.value.inited) getTreeData()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 点击折叠树组件
|
||||||
|
const handleClickTreeFold = () => {
|
||||||
|
if (treeVisible.value) {
|
||||||
|
state.treeWidthMemo = state.treeWidth
|
||||||
|
state.treeWidth = 0
|
||||||
|
} else {
|
||||||
|
state.treeWidth = state.treeWidthMemo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输入框改变
|
||||||
|
const handleSearchInputChange = () => {
|
||||||
|
activeTreeRef.value!.setCheckedKeys([], false)
|
||||||
|
activeState.value.checkedTreeNodes = []
|
||||||
|
activeState.value.curClickedNode = {}
|
||||||
|
getTreeData()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 点击树形结构节点
|
||||||
|
const handleNodeClick = (nodeData: any, tab: "DEPT" | "MCH_DEPT") => {
|
||||||
|
if (!props.nodeClickable) return
|
||||||
|
const tabState = tab === "MCH_DEPT" ? state.mchDept : state.dept
|
||||||
|
tabState.curClickedNode = nodeData
|
||||||
|
emit("getSelectNode", tabState.curClickedNode, tabState.checkedTreeNodes, tabState.switch, tab)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 勾选树节点时
|
||||||
|
const handleCheck = (_data: any, checkStatus: any, tab: "DEPT" | "MCH_DEPT") => {
|
||||||
|
const tabState = tab === "MCH_DEPT" ? state.mchDept : state.dept
|
||||||
|
const { checkedNodes } = checkStatus
|
||||||
|
tabState.checkedTreeNodes = checkedNodes
|
||||||
|
if (props.nodeClickable && tabState.checkedTreeNodes.length > 0) {
|
||||||
|
tabState.switch = false
|
||||||
|
}
|
||||||
|
emit("getSelectNode", tabState.curClickedNode, tabState.checkedTreeNodes, tabState.switch, tab)
|
||||||
|
}
|
||||||
|
|
||||||
|
// switch改变时
|
||||||
|
const handleSwitchChange = () =>
|
||||||
|
emit("getSelectNode", activeState.value.curClickedNode, activeState.value.checkedTreeNodes, activeState.value.switch, state.activeTab)
|
||||||
|
|
||||||
|
// 切换所有节点的展开/收起状态。status:true 为展开,false 为收起
|
||||||
|
const toggleRowExpansionAll = (status: boolean) => {
|
||||||
|
activeState.value.isExpand = status
|
||||||
|
const nodes = activeTreeRef.value!.store._getAllNodes()
|
||||||
|
for (let i = 0; i < nodes.length; i++) {
|
||||||
|
nodes[i].expanded = status
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置数据(重置用户部门+商户部门两个tab)
|
||||||
|
const resetData = () => {
|
||||||
|
state.dept = createTabState()
|
||||||
|
state.mchDept = createTabState()
|
||||||
|
// 保持当前tab,重新加载当前tab数据
|
||||||
|
getTreeData()
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
getTreeData()
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
getTreeData,
|
||||||
|
resetData,
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.draggable-dep-mch-tree {
|
||||||
|
min-width: 0;
|
||||||
|
background: var(--el-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__tree-pane,
|
||||||
|
.draggable-dep-mch-tree__content-pane {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
margin-right: 8px;
|
||||||
|
padding: 8px 6px 6px 8px;
|
||||||
|
background: var(--el-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tabs {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
border-bottom: 1px solid var(--el-border-color-extra-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tabs .el-tabs {
|
||||||
|
--el-tabs-header-height: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tabs .el-tabs__header {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tabs .el-tabs__nav-wrap::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tabs .el-tabs__item {
|
||||||
|
height: 28px;
|
||||||
|
padding: 0 12px;
|
||||||
|
font-size: var(--el-font-size-small);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tab-label {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tab-label .el-badge__content {
|
||||||
|
top: -6px;
|
||||||
|
right: -12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__header {
|
||||||
|
z-index: 2;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 6px 0;
|
||||||
|
border-bottom: 1px solid var(--el-border-color-extra-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__search {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__operations {
|
||||||
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__more {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 28px;
|
||||||
|
height: 28px;
|
||||||
|
padding: 0;
|
||||||
|
font: inherit;
|
||||||
|
color: var(--el-text-color-secondary);
|
||||||
|
cursor: pointer;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
border-radius: var(--el-border-radius-base);
|
||||||
|
outline: none;
|
||||||
|
transition: color 180ms ease, background-color 180ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__more .el-icon {
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__more:hover {
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
background: var(--el-color-primary-light-9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__more:focus-visible {
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
outline: 2px solid var(--el-color-primary-light-5);
|
||||||
|
outline-offset: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__body {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
padding: 4px 2px 4px 0;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tree {
|
||||||
|
--el-tree-node-content-height: 26px;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
font-size: var(--el-font-size-extra-small);
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tree .el-tree-node {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tree .el-tree-node__content {
|
||||||
|
min-width: 0;
|
||||||
|
padding-right: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: var(--el-border-radius-small);
|
||||||
|
transition: color 180ms ease, background-color 180ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tree .el-tree-node__content>.el-tree-node__expand-icon {
|
||||||
|
padding: 3px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tree .el-tree-node__content>label.el-checkbox {
|
||||||
|
--el-checkbox-input-height: 12px;
|
||||||
|
--el-checkbox-input-width: 12px;
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__tree .el-tree-node__label,
|
||||||
|
.dep-mch-tree-panel__locked-node {
|
||||||
|
display: inline-flex;
|
||||||
|
flex: 1;
|
||||||
|
align-items: center;
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__locked-node .svg-icon {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__footer {
|
||||||
|
z-index: 2;
|
||||||
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 30px;
|
||||||
|
padding-top: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--el-bg-color);
|
||||||
|
border-top: 1px solid var(--el-border-color-extra-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__footer .el-switch {
|
||||||
|
font-size: var(--el-font-size-extra-small);
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__content-pane {
|
||||||
|
position: relative;
|
||||||
|
/* 分隔线与折叠按钮使用同一定位容器,避免跨 pane 定位后被裁剪或覆盖。 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__content-pane::before {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 1px;
|
||||||
|
content: "";
|
||||||
|
background: var(--el-border-color-lighter);
|
||||||
|
transition: background-color 180ms ease, width 180ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__content {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 8px 8px 8px 16px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__fold {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
z-index: 3;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
width: 20px;
|
||||||
|
height: 56px;
|
||||||
|
padding: 0;
|
||||||
|
font: inherit;
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--el-text-color-secondary);
|
||||||
|
cursor: pointer;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
outline: none;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
transition: color 180ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__fold::before {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 12px;
|
||||||
|
content: "";
|
||||||
|
background: var(--el-fill-color-dark);
|
||||||
|
border-radius: 0 var(--el-border-radius-round) var(--el-border-radius-round) 0;
|
||||||
|
transition: background-color 180ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__fold .el-icon {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
width: 12px;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__fold:hover {
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__fold:hover::before,
|
||||||
|
.draggable-dep-mch-tree__fold:focus-visible::before {
|
||||||
|
background: var(--el-color-primary-light-8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree__fold:focus-visible {
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
outline: 2px solid var(--el-color-primary-light-5);
|
||||||
|
outline-offset: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree.splitpanes--vertical>.splitpanes__splitter {
|
||||||
|
position: relative;
|
||||||
|
flex: 0 0 6px;
|
||||||
|
width: 6px;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree.splitpanes--vertical>.splitpanes__splitter:hover+.draggable-dep-mch-tree__content-pane::before,
|
||||||
|
.draggable-dep-mch-tree.splitpanes--vertical>.splitpanes__splitter:active+.draggable-dep-mch-tree__content-pane::before {
|
||||||
|
width: 2px;
|
||||||
|
background: var(--el-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
|
||||||
|
.dep-mch-tree-panel__more,
|
||||||
|
.dep-mch-tree-panel__tree .el-tree-node__content,
|
||||||
|
.draggable-dep-mch-tree__fold,
|
||||||
|
.draggable-dep-mch-tree__fold::before,
|
||||||
|
.draggable-dep-mch-tree__content-pane::before {
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draggable-dep-mch-tree.splitpanes--vertical>.splitpanes__pane {
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -18,6 +18,7 @@ import PreviewJson from "/@/components/PreviewJson/index.vue"
|
|||||||
import PreviewText from "/@/components/PreviewText/index.vue"
|
import PreviewText from "/@/components/PreviewText/index.vue"
|
||||||
import PreviewXml from "/@/components/PreviewXml/index.vue"
|
import PreviewXml from "/@/components/PreviewXml/index.vue"
|
||||||
import DraggableDepTree from "/@/components/DraggableDepTree/index.vue"
|
import DraggableDepTree from "/@/components/DraggableDepTree/index.vue"
|
||||||
|
import DraggableDepMchTree from "/@/components/DraggableDepMchTree/index.vue"
|
||||||
import SearchPanel from "/@/components/SearchPanel/index.vue"
|
import SearchPanel from "/@/components/SearchPanel/index.vue"
|
||||||
import UserInfoCell from "/@/components/UserInfoCell/index.vue"
|
import UserInfoCell from "/@/components/UserInfoCell/index.vue"
|
||||||
import UserIdentityInfo from "/@/components/UserIdentityInfo/index.vue"
|
import UserIdentityInfo from "/@/components/UserIdentityInfo/index.vue"
|
||||||
@@ -88,6 +89,7 @@ export default {
|
|||||||
app.component("PreviewText", PreviewText)
|
app.component("PreviewText", PreviewText)
|
||||||
app.component("PreviewXml", PreviewXml)
|
app.component("PreviewXml", PreviewXml)
|
||||||
app.component("DraggableDepTree", DraggableDepTree)
|
app.component("DraggableDepTree", DraggableDepTree)
|
||||||
|
app.component("DraggableDepMchTree", DraggableDepMchTree)
|
||||||
app.component("SearchPanel", SearchPanel)
|
app.component("SearchPanel", SearchPanel)
|
||||||
app.component("UserInfoCell", UserInfoCell)
|
app.component("UserInfoCell", UserInfoCell)
|
||||||
app.component("UserIdentityInfo", UserIdentityInfo)
|
app.component("UserIdentityInfo", UserIdentityInfo)
|
||||||
|
|||||||
@@ -18,12 +18,16 @@
|
|||||||
<el-form-item style="width: 250px" label="车牌号" prop="carNumber">
|
<el-form-item style="width: 250px" label="车牌号" prop="carNumber">
|
||||||
<el-input v-model="state.queryForm.carNumber" placeholder="请输入车牌号" />
|
<el-input v-model="state.queryForm.carNumber" placeholder="请输入车牌号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 250px" label="车辆类型" prop="carType">
|
|
||||||
<dict-select v-model="state.queryForm.carType" dict-code="car_type" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 250px" label="是否启用" prop="enableStatus">
|
<el-form-item style="width: 250px" label="是否启用" prop="enableStatus">
|
||||||
<dict-select v-model="state.queryForm.enableStatus" dict-code="yes_no_type" />
|
<dict-select v-model="state.queryForm.enableStatus" dict-code="yes_no_type" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<template #more>
|
||||||
|
<el-form-item style="width: 250px" label="车辆类型" prop="carType">
|
||||||
|
<dict-select v-model="state.queryForm.carType" dict-code="car_type" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
|||||||
@@ -18,18 +18,22 @@
|
|||||||
<el-form-item style="width: 250px" label="调动类型" prop="bizType">
|
<el-form-item style="width: 250px" label="调动类型" prop="bizType">
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="user_transaction" />
|
<dict-select v-model="state.queryForm.bizType" dict-code="user_transaction" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 300px" label="自动转账到消费钱包" prop="isWalletTransaction">
|
|
||||||
<dict-select v-model="state.queryForm.isWalletTransaction" dict-code="yes_no_type" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 450px" label="申请时间" prop="createTimeList">
|
<el-form-item style="width: 450px" label="申请时间" prop="createTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
|
||||||
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item style="width: 300px" label="自动转账到消费钱包" prop="isWalletTransaction">
|
||||||
<el-form-item style="width: 450px" label="自动转账时间" prop="walletTransactionTimeList">
|
<dict-select v-model="state.queryForm.isWalletTransaction" dict-code="yes_no_type" />
|
||||||
<el-date-picker v-model="state.queryForm.walletTransactionTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
||||||
|
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 450px" label="自动转账时间" prop="walletTransactionTimeList">
|
||||||
|
<el-date-picker v-model="state.queryForm.walletTransactionTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
|||||||
@@ -32,15 +32,18 @@
|
|||||||
<el-form-item label="手机号" prop="phone">
|
<el-form-item label="手机号" prop="phone">
|
||||||
<el-input v-model="state.queryForm.phone" placeholder="请输入手机号" clearable />
|
<el-input v-model="state.queryForm.phone" placeholder="请输入手机号" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 250px" label="部门" prop="deptId">
|
|
||||||
<select-dept v-model="state.queryForm.deptId" clearable />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item style="width: 250px" label="部门" prop="deptId">
|
||||||
<el-form-item style="width: 250px" label="角色" prop="role">
|
<select-dept v-model="state.queryForm.deptId" clearable />
|
||||||
<select-role v-model="state.queryForm.role" clearable />
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item style="width: 250px" label="角色" prop="role">
|
||||||
<el-form-item style="width: 250px" label="编制情况" prop="staffingType">
|
<select-role v-model="state.queryForm.role" clearable />
|
||||||
<dict-select v-model="state.queryForm.staffingType" dict-code="user_staffing_type" />
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item style="width: 250px" label="编制情况" prop="staffingType">
|
||||||
|
<dict-select v-model="state.queryForm.staffingType" dict-code="user_staffing_type" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-auto layout-padding-view">
|
<div class="layout-padding-auto layout-padding-view">
|
||||||
<DraggableDepTree ref="draggableDepTreeRef" placeholder="请输入部门名称" :show-expand="true"
|
<DraggableDepMchTree ref="draggableDepMchTreeRef" placeholder="请输入用户部门名称"
|
||||||
|
mch-placeholder="请输入商户部门名称" :show-expand="true"
|
||||||
@getSelectNode="handleGetSelectNode" switch-inactive-text="包含" switch-active-text="不包含"
|
@getSelectNode="handleGetSelectNode" switch-inactive-text="包含" switch-active-text="不包含"
|
||||||
:defaultTreeWidth="20" :nodeClickable="false" :props="{
|
:defaultTreeWidth="20" :nodeClickable="false" :props="{
|
||||||
label: 'name',
|
label: 'name',
|
||||||
@@ -58,7 +59,7 @@
|
|||||||
<hard-sh-by-day v-if="activeTab === 'MCH'" ref="hardShByDayRef" />
|
<hard-sh-by-day v-if="activeTab === 'MCH'" ref="hardShByDayRef" />
|
||||||
<hard-sh-by-month v-if="activeTab === 'MONTH'" ref="hardShByMonthRef" />
|
<hard-sh-by-month v-if="activeTab === 'MONTH'" ref="hardShByMonthRef" />
|
||||||
</template>
|
</template>
|
||||||
</DraggableDepTree>
|
</DraggableDepMchTree>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -81,7 +82,7 @@ const hardShByMonthRef = ref()
|
|||||||
const queryRef = ref()
|
const queryRef = ref()
|
||||||
const showSearch = ref(true)
|
const showSearch = ref(true)
|
||||||
|
|
||||||
const draggableDepTreeRef = ref()
|
const draggableDepMchTreeRef = ref()
|
||||||
|
|
||||||
// tab变量
|
// tab变量
|
||||||
const tabPane = ref([
|
const tabPane = ref([
|
||||||
@@ -179,15 +180,23 @@ const resetQuery = () => {
|
|||||||
state.queryForm = { ...defaultQueryForm }
|
state.queryForm = { ...defaultQueryForm }
|
||||||
state.queryForm.deptId = ""
|
state.queryForm.deptId = ""
|
||||||
state.queryForm.userDeptIds = []
|
state.queryForm.userDeptIds = []
|
||||||
draggableDepTreeRef.value.resetData()
|
state.queryForm.merchantDeptIds = []
|
||||||
|
draggableDepMchTreeRef.value.resetData()
|
||||||
cancel()
|
cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 树节点选择时
|
// 树节点选择时
|
||||||
const handleGetSelectNode = (curClickedNode: any, checkedTreeNodes: any, isDeepTree: any) => {
|
const handleGetSelectNode = (curClickedNode: any, checkedTreeNodes: any, isDeepTree: any, tab?: string) => {
|
||||||
state.queryForm.deptId = curClickedNode.id
|
if (tab === "MCH_DEPT") {
|
||||||
state.queryForm.userDeptIds = checkedTreeNodes.map((item: any) => item.id)
|
// 商户部门tab:勾选的商户部门ids + 商户部门包含/不包含
|
||||||
state.queryForm.isInclude = !isDeepTree
|
state.queryForm.merchantDeptIds = checkedTreeNodes.map((item: any) => item.id)
|
||||||
|
state.queryForm.isIncludeMerchantDept = !isDeepTree
|
||||||
|
} else {
|
||||||
|
// 用户部门tab:点击的部门 + 勾选的部门ids + 用户部门包含/不包含
|
||||||
|
state.queryForm.deptId = curClickedNode.id
|
||||||
|
state.queryForm.userDeptIds = checkedTreeNodes.map((item: any) => item.id)
|
||||||
|
state.queryForm.isInclude = !isDeepTree
|
||||||
|
}
|
||||||
search()
|
search()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
+13
-9
@@ -14,21 +14,25 @@
|
|||||||
<el-form-item style="width: 250px" label="订单号" prop="payNo">
|
<el-form-item style="width: 250px" label="订单号" prop="payNo">
|
||||||
<el-input v-model="state.queryForm.payNo" />
|
<el-input v-model="state.queryForm.payNo" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 250px" label="支付平台" prop="payPlatformType">
|
|
||||||
<dict-select v-model="state.queryForm.payPlatformType" dict-code="mini_platform_type" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 250px" label="业务类型" prop="bizType">
|
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="third_pay_order_biz_type" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 250px" label="用户" prop="userId">
|
<el-form-item style="width: 250px" label="用户" prop="userId">
|
||||||
<select-user v-model="state.queryForm.userId" />
|
<select-user v-model="state.queryForm.userId" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 450px" label="支付时间" prop="payTimeList">
|
<el-form-item style="width: 450px" label="支付时间" prop="payTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 450px" label="退款时间" prop="refundTimeList">
|
|
||||||
<el-date-picker v-model="state.queryForm.refundTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item style="width: 250px" label="支付平台" prop="payPlatformType">
|
||||||
|
<dict-select v-model="state.queryForm.payPlatformType" dict-code="mini_platform_type" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 250px" label="业务类型" prop="bizType">
|
||||||
|
<dict-select v-model="state.queryForm.bizType" dict-code="third_pay_order_biz_type" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 450px" label="退款时间" prop="refundTimeList">
|
||||||
|
<el-date-picker v-model="state.queryForm.refundTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
@@ -20,12 +20,15 @@
|
|||||||
<el-form-item style="width: 250px" label="卡号" prop="cardNumber">
|
<el-form-item style="width: 250px" label="卡号" prop="cardNumber">
|
||||||
<el-input v-model="state.queryForm.cardNumber" placeholder="饭卡卡号" clearable />
|
<el-input v-model="state.queryForm.cardNumber" placeholder="饭卡卡号" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 250px" label="是否绑定用户" prop="isBindUser">
|
|
||||||
<dict-select v-model="state.queryForm.isBindUser" dict-code="yes_no_type" />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item style="width: 250px" label="是否绑定用户" prop="isBindUser">
|
||||||
<el-form-item style="width: 250px" label="是否硬件激活" prop="isMchActive">
|
<dict-select v-model="state.queryForm.isBindUser" dict-code="yes_no_type" />
|
||||||
<dict-select v-model="state.queryForm.isMchActive" dict-code="yes_no_type" />
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item style="width: 250px" label="是否硬件激活" prop="isMchActive">
|
||||||
|
<dict-select v-model="state.queryForm.isMchActive" dict-code="yes_no_type" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
|
|
||||||
<el-row>
|
<el-row>
|
||||||
|
|||||||
@@ -39,18 +39,22 @@
|
|||||||
<el-form-item style="width: 200px" label="充值方式" prop="bizType">
|
<el-form-item style="width: 200px" label="充值方式" prop="bizType">
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz" />
|
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="false" style="width: 200px" label="充值类型" prop="type">
|
|
||||||
<dict-select v-model="state.queryForm.type" dict-code="wallet_biz_recharge" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 250px" label="钱包类型" prop="walletTypeIdList">
|
<el-form-item style="width: 250px" label="钱包类型" prop="walletTypeIdList">
|
||||||
<select-wallet-type multiple v-model="state.queryForm.walletTypeIdList" placeholder="饭卡类型" clearable />
|
<select-wallet-type multiple v-model="state.queryForm.walletTypeIdList" placeholder="饭卡类型" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 300px" label="充值时间" prop="createTimeList">
|
<el-form-item style="width: 300px" label="充值时间" prop="createTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 260px" label="操作标签" prop="tagList">
|
|
||||||
<dict-select v-model="state.queryForm.tagList" dict-code="wallet_transaction_tag" multiple />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item v-if="false" style="width: 200px" label="充值类型" prop="type">
|
||||||
|
<dict-select v-model="state.queryForm.type" dict-code="wallet_biz_recharge" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 260px" label="操作标签" prop="tagList">
|
||||||
|
<dict-select v-model="state.queryForm.tagList" dict-code="wallet_transaction_tag" multiple />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
@@ -28,18 +28,22 @@
|
|||||||
<el-form-item style="width: 200px" label="充值方式" prop="bizType">
|
<el-form-item style="width: 200px" label="充值方式" prop="bizType">
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz" />
|
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="false" style="width: 200px" label="充值类型" prop="type">
|
|
||||||
<dict-select v-model="state.queryForm.type" dict-code="wallet_biz_recharge" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 250px" label="钱包类型" prop="walletTypeIdList">
|
<el-form-item style="width: 250px" label="钱包类型" prop="walletTypeIdList">
|
||||||
<select-wallet-type multiple v-model="state.queryForm.walletTypeIdList" placeholder="饭卡类型" clearable />
|
<select-wallet-type multiple v-model="state.queryForm.walletTypeIdList" placeholder="饭卡类型" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 300px" label="充值时间" prop="createTimeList">
|
<el-form-item style="width: 300px" label="充值时间" prop="createTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 260px" label="操作标签" prop="tagList">
|
|
||||||
<dict-select v-model="state.queryForm.tagList" dict-code="wallet_transaction_tag" multiple />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item v-if="false" style="width: 200px" label="充值类型" prop="type">
|
||||||
|
<dict-select v-model="state.queryForm.type" dict-code="wallet_biz_recharge" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 260px" label="操作标签" prop="tagList">
|
||||||
|
<dict-select v-model="state.queryForm.tagList" dict-code="wallet_transaction_tag" multiple />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
@@ -14,21 +14,26 @@
|
|||||||
<el-form-item style="width: 300px" label="用户" prop="userIds">
|
<el-form-item style="width: 300px" label="用户" prop="userIds">
|
||||||
<select-user v-model="state.queryForm.userIds" placeholder="用户" />
|
<select-user v-model="state.queryForm.userIds" placeholder="用户" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 200px" label="饭卡类型" prop="walletTypeId">
|
|
||||||
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 200px" label="充值类型" prop="bizType">
|
<el-form-item style="width: 200px" label="充值类型" prop="bizType">
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz_recharge" placeholder="充值类型" />
|
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz_recharge" placeholder="充值类型" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 250px" label="发票号" prop="invoiceCode">
|
|
||||||
<el-input v-model="state.queryForm.invoiceCode" placeholder="发票号" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 450px" label="创建时间" prop="createTimeList">
|
<el-form-item style="width: 450px" label="创建时间" prop="createTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
|
||||||
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item style="width: 200px" label="饭卡类型" prop="walletTypeId">
|
||||||
|
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 250px" label="发票号" prop="invoiceCode">
|
||||||
|
<el-input v-model="state.queryForm.invoiceCode" placeholder="发票号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
||||||
|
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
@@ -23,15 +23,18 @@
|
|||||||
<el-form-item style="width: 350px" label="发票号" prop="code">
|
<el-form-item style="width: 350px" label="发票号" prop="code">
|
||||||
<el-input v-model="state.queryForm.code" />
|
<el-input v-model="state.queryForm.code" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 350px" label="备注" prop="remark">
|
|
||||||
<el-input v-model="state.queryForm.remark" />
|
<template #more>
|
||||||
</el-form-item>
|
<el-form-item style="width: 350px" label="备注" prop="remark">
|
||||||
<el-form-item style="width: 450px" label="创建时间" prop="createTimeList">
|
<el-input v-model="state.queryForm.remark" />
|
||||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item style="width: 450px" label="创建时间" prop="createTimeList">
|
||||||
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
||||||
|
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
@@ -25,18 +25,23 @@
|
|||||||
<el-form-item style="width: 300px" label="用户" prop="userId">
|
<el-form-item style="width: 300px" label="用户" prop="userId">
|
||||||
<select-user v-model="state.queryForm.userId" placeholder="用户" />
|
<select-user v-model="state.queryForm.userId" placeholder="用户" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 200px" label="充值类型" prop="bizType">
|
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz_recharge" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 200px" label="审核状态" prop="processStatus">
|
<el-form-item style="width: 200px" label="审核状态" prop="processStatus">
|
||||||
<dict-select v-model="state.queryForm.processStatus" dict-code="check_status" />
|
<dict-select v-model="state.queryForm.processStatus" dict-code="check_status" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 200px" label="钱包类型" prop="walletTypeId">
|
|
||||||
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
<el-form-item style="width: 450px" label="审核时间" prop="processTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
<el-date-picker v-model="state.queryForm.processTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<template #more>
|
||||||
|
<el-form-item style="width: 200px" label="充值类型" prop="bizType">
|
||||||
|
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz_recharge" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 200px" label="钱包类型" prop="walletTypeId">
|
||||||
|
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
@@ -24,19 +24,24 @@
|
|||||||
<el-form-item style="width: 250px" label="用户" prop="userId">
|
<el-form-item style="width: 250px" label="用户" prop="userId">
|
||||||
<select-user v-model="state.queryForm.userId" />
|
<select-user v-model="state.queryForm.userId" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 250px" label="是否退回" prop="isRefund">
|
|
||||||
<dict-select v-model="state.queryForm.isRefund" dict-code="yes_no_type" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item style="width: 250px" label="转账类型" prop="bizType">
|
<el-form-item style="width: 250px" label="转账类型" prop="bizType">
|
||||||
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_rule_transation_type" />
|
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_rule_transation_type" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 350px" label="转账时间" prop="createTimeList">
|
<el-form-item style="width: 350px" label="转账时间" prop="createTimeList">
|
||||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="width: 350px" label="退回时间" prop="refundTimeList">
|
|
||||||
<el-date-picker v-model="state.queryForm.refundTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-row> </el-row>
|
<el-row> </el-row>
|
||||||
|
|
||||||
|
<template #more>
|
||||||
|
<el-form-item style="width: 250px" label="是否退回" prop="isRefund">
|
||||||
|
<dict-select v-model="state.queryForm.isRefund" dict-code="yes_no_type" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item style="width: 350px" label="退回时间" prop="refundTimeList">
|
||||||
|
<el-date-picker v-model="state.queryForm.refundTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
</SearchPanel>
|
</SearchPanel>
|
||||||
<el-row>
|
<el-row>
|
||||||
<div class="mb8" style="width: 100%">
|
<div class="mb8" style="width: 100%">
|
||||||
|
|||||||
Reference in new issue
Block a user