|
|
@@ -1,131 +1,110 @@
|
|
|
<!-- 交易商管理-个性化管理-资金账户个性化 -->
|
|
|
<template>
|
|
|
- <app-view>
|
|
|
- <template #header>
|
|
|
- <el-form ref="formRef" class="el-form--filter" :model="qs" :rules="formRules" :show-message="false">
|
|
|
- <el-form-item label="交易商" prop="userid">
|
|
|
- <el-select v-model="selectedInvestor" value-key="id" :validate-event="false"
|
|
|
- @change="onGroupChange">
|
|
|
- <template v-for="item in investorList" :key="item.id">
|
|
|
- <el-option :label="item.name" :value="item" />
|
|
|
- </template>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="资金账户" prop="accountid">
|
|
|
- <el-select v-model="selectedAccount" value-key="id" :validate-event="false"
|
|
|
- @change="onMarketChange">
|
|
|
- <template v-for="item in accountList" :key="item.id">
|
|
|
- <el-option :label="item.name" :value="item" />
|
|
|
- </template>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="商品" prop="goodsid">
|
|
|
- <el-select v-model="selectedGoods" value-key="id" :validate-event="false">
|
|
|
- <template v-for="item in goodsList" :key="item.id">
|
|
|
- <el-option :label="item.name" :value="item" />
|
|
|
- </template>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="onSearch">{{ t('operation.search') }}</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </template>
|
|
|
- <div style="display: flex;justify-content: space-between;">
|
|
|
- <app-operation :data-list="getActionButtons(['investor_custom_accountcfg_add'])" @click="openComponent" />
|
|
|
- <app-operation
|
|
|
- :data-list="getActionButtons(['investor_custom_accountcfg_modify', 'investor_custom_accountcfg_delete'])"
|
|
|
- @click="openComponent" v-if="data" />
|
|
|
- </div>
|
|
|
- <template v-if="data">
|
|
|
- <app-table-details title="基本信息设置" :data="data" :label-width="160" :cell-props="detailProps" :column="2" />
|
|
|
- <app-table :data="data.druleList" :columns="ruleColumns">
|
|
|
- <template #headerLeft>
|
|
|
- <b>交易规则设置</b>
|
|
|
- </template>
|
|
|
- <!-- 平台 -->
|
|
|
- <template #paramvalue="{ row }">
|
|
|
- <span v-if="row.ruleid === 105">{{ feetypeEnum.getEnumTypeName(row.paramvalue) }}</span>
|
|
|
- <span v-else>{{ row.paramvalue || 0 }}</span>
|
|
|
- </template>
|
|
|
- <!-- 会员 -->
|
|
|
- <template #dvalue="{ row }">
|
|
|
- <span v-if="row.ruleid === 105">
|
|
|
- {{ handleNoneValue(feetypeEnum.getEnumTypeName(row.dvalue)) }}
|
|
|
- </span>
|
|
|
- <span v-else>{{ handleNoneValue(row.dvalue) }}</span>
|
|
|
- </template>
|
|
|
- <!-- 分组 -->
|
|
|
- <template #gvalue="{ row }">
|
|
|
- <span v-if="row.ruleid === 105">
|
|
|
- {{ handleNoneValue(feetypeEnum.getEnumTypeName(row.gvalue)) }}
|
|
|
- </span>
|
|
|
- <span v-else>{{ handleNoneValue(row.gvalue) }}</span>
|
|
|
- </template>
|
|
|
- <!-- 个性化 -->
|
|
|
- <template #cvalue="{ row }">
|
|
|
- <span v-if="row.ruleid === 105">
|
|
|
- {{ handleNoneValue(feetypeEnum.getEnumTypeName(row.cvalue)) }}
|
|
|
- </span>
|
|
|
- <span v-else>{{ handleNoneValue(row.cvalue) }}</span>
|
|
|
- </template>
|
|
|
- </app-table>
|
|
|
- <app-table :data="data.dfeeList" :columns="feeColumns">
|
|
|
- <template #headerLeft>
|
|
|
- <b>交易服务费设置</b>
|
|
|
- </template>
|
|
|
- <!-- 平台 -->
|
|
|
- <template #exchangevalue="{ row }">
|
|
|
- <template v-if="row.feealgorithm">
|
|
|
- <span>{{ scfRiskMode.getEnumTypeName(row.feealgorithm) }}:</span>
|
|
|
- <span>{{ row.exchangevalue + (row.feealgorithm === 1 && '‱') }}</span>
|
|
|
+ <div class="g-view-tree">
|
|
|
+ <app-view>
|
|
|
+ <el-tree :data="nodeList" node-key="id" :props="{ label: 'name' }" :default-expanded-keys="['-1']"
|
|
|
+ @node-click="nodeClick" highlight-current />
|
|
|
+ </app-view>
|
|
|
+ <app-view>
|
|
|
+ <div style="display: flex;justify-content: space-between;">
|
|
|
+ <app-operation :data-list="getActionButtons(['investor_custom_accountcfg_add'])"
|
|
|
+ @click="openComponent" />
|
|
|
+ <app-operation
|
|
|
+ :data-list="getActionButtons(['investor_custom_accountcfg_modify', 'investor_custom_accountcfg_delete'])"
|
|
|
+ @click="openComponent" v-if="data" />
|
|
|
+ </div>
|
|
|
+ <template v-if="data">
|
|
|
+ <app-table-details title="基本信息" :data="currentInfo" :label-width="160" :cell-props="detailProps"
|
|
|
+ :column="2" />
|
|
|
+ <app-table :data="data.druleList" :columns="ruleColumns">
|
|
|
+ <template #headerLeft>
|
|
|
+ <b>交易规则</b>
|
|
|
</template>
|
|
|
- <template v-else>
|
|
|
- {{ handleNoneValue() }}
|
|
|
+ <!-- 平台 -->
|
|
|
+ <template #paramvalue="{ row }">
|
|
|
+ <span v-if="row.ruleid === 105">{{ feetypeEnum.getEnumTypeName(row.paramvalue) }}</span>
|
|
|
+ <span v-else>{{ row.paramvalue || 0 }}</span>
|
|
|
</template>
|
|
|
- </template>
|
|
|
- <!-- 会员 -->
|
|
|
- <template #dvalue="{ row }">
|
|
|
- <template v-if="row.drithm">
|
|
|
- <span>{{ scfRiskMode.getEnumTypeName(row.drithm) }}:</span>
|
|
|
- <span>{{ row.dvalue + (row.drithm === 1 && '‱') }}</span>
|
|
|
+ <!-- 会员 -->
|
|
|
+ <template #dvalue="{ row }">
|
|
|
+ <span v-if="row.ruleid === 105">
|
|
|
+ {{ handleNoneValue(feetypeEnum.getEnumTypeName(row.dvalue)) }}
|
|
|
+ </span>
|
|
|
+ <span v-else>{{ handleNoneValue(row.dvalue) }}</span>
|
|
|
</template>
|
|
|
- <template v-else>
|
|
|
- {{ handleNoneValue() }}
|
|
|
+ <!-- 分组 -->
|
|
|
+ <template #gvalue="{ row }">
|
|
|
+ <span v-if="row.ruleid === 105">
|
|
|
+ {{ handleNoneValue(feetypeEnum.getEnumTypeName(row.gvalue)) }}
|
|
|
+ </span>
|
|
|
+ <span v-else>{{ handleNoneValue(row.gvalue) }}</span>
|
|
|
</template>
|
|
|
- </template>
|
|
|
- <!-- 分组 -->
|
|
|
- <template #gvalue="{ row }">
|
|
|
- <template v-if="row.grithm">
|
|
|
- <span>{{ scfRiskMode.getEnumTypeName(row.grithm) }}:</span>
|
|
|
- <span>{{ row.gvalue + (row.grithm === 1 && '‱') }}</span>
|
|
|
+ <!-- 个性化 -->
|
|
|
+ <template #cvalue="{ row }">
|
|
|
+ <span v-if="row.ruleid === 105">
|
|
|
+ {{ handleNoneValue(feetypeEnum.getEnumTypeName(row.cvalue)) }}
|
|
|
+ </span>
|
|
|
+ <span v-else>{{ handleNoneValue(row.cvalue) }}</span>
|
|
|
</template>
|
|
|
- <template v-else>
|
|
|
- {{ handleNoneValue() }}
|
|
|
+ </app-table>
|
|
|
+ <app-table :data="data.dfeeList" :columns="feeColumns">
|
|
|
+ <template #headerLeft>
|
|
|
+ <b>交易服务费</b>
|
|
|
</template>
|
|
|
- </template>
|
|
|
- <!-- 个性化 -->
|
|
|
- <template #cvalue="{ row }">
|
|
|
- <template v-if="row.crithm">
|
|
|
- <span>{{ scfRiskMode.getEnumTypeName(row.crithm) }}:</span>
|
|
|
- <span>{{ row.cvalue + (row.crithm === 1 && '‱') }}</span>
|
|
|
+ <!-- 平台 -->
|
|
|
+ <template #exchangevalue="{ row }">
|
|
|
+ <template v-if="row.feealgorithm">
|
|
|
+ <span>{{ scfRiskMode.getEnumTypeName(row.feealgorithm) }}:</span>
|
|
|
+ <span>{{ row.exchangevalue + (row.feealgorithm === 1 && '‱') }}</span>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ {{ handleNoneValue() }}
|
|
|
+ </template>
|
|
|
</template>
|
|
|
- <template v-else>
|
|
|
- {{ handleNoneValue() }}
|
|
|
+ <!-- 会员 -->
|
|
|
+ <template #dvalue="{ row }">
|
|
|
+ <template v-if="row.drithm">
|
|
|
+ <span>{{ scfRiskMode.getEnumTypeName(row.drithm) }}:</span>
|
|
|
+ <span>{{ row.dvalue + (row.drithm === 1 && '‱') }}</span>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ {{ handleNoneValue() }}
|
|
|
+ </template>
|
|
|
</template>
|
|
|
- </template>
|
|
|
- </app-table>
|
|
|
- </template>
|
|
|
- <el-empty v-else />
|
|
|
+ <!-- 分组 -->
|
|
|
+ <template #gvalue="{ row }">
|
|
|
+ <template v-if="row.grithm">
|
|
|
+ <span>{{ scfRiskMode.getEnumTypeName(row.grithm) }}:</span>
|
|
|
+ <span>{{ row.gvalue + (row.grithm === 1 && '‱') }}</span>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ {{ handleNoneValue() }}
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <!-- 个性化 -->
|
|
|
+ <template #cvalue="{ row }">
|
|
|
+ <template v-if="row.crithm">
|
|
|
+ <span>{{ scfRiskMode.getEnumTypeName(row.crithm) }}:</span>
|
|
|
+ <span>{{ row.cvalue + (row.crithm === 1 && '‱') }}</span>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ {{ handleNoneValue() }}
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </app-table>
|
|
|
+ </template>
|
|
|
+ <el-empty v-else />
|
|
|
+ </app-view>
|
|
|
<component :is="componentMap.get(componentId)" v-bind="{ record: toRaw(data) }" @closed="closeComponent"
|
|
|
v-if="componentId" />
|
|
|
- </app-view>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { shallowRef, computed, nextTick, toRaw } from 'vue'
|
|
|
-import { ElMessage, FormInstance, FormRules } from 'element-plus'
|
|
|
-import { handleNoneValue } from '@/filters'
|
|
|
+import { ref, reactive, computed, toRaw } from 'vue'
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
+import type Node from 'element-plus/es/components/tree/src/model/node'
|
|
|
+import { handleNoneValue, buildTree } from '@/filters'
|
|
|
import { useEnum } from '@/hooks/enum'
|
|
|
import { useRequest } from '@/hooks/request'
|
|
|
import { useOperation } from '@/hooks/operation'
|
|
|
@@ -134,67 +113,79 @@ import { CellProp } from '@pc/components/base/table-details/types'
|
|
|
import AppTable from '@pc/components/base/table/index.vue'
|
|
|
import AppOperation from '@pc/components/base/operation/index.vue'
|
|
|
import AppTableDetails from '@pc/components/base/table-details/index.vue'
|
|
|
-import { i18n } from '@/stores'
|
|
|
+
|
|
|
+const customerTypeEnum = useEnum('customerType')
|
|
|
+const feetypeEnum = useEnum('feetype')
|
|
|
+const scfRiskMode = useEnum('SCFRiskMode')
|
|
|
+
|
|
|
+const nodeList = ref<(Model.AccTradeTreeRsp & { children: Model.AccTradeTreeRsp[]; })[]>([])
|
|
|
+const selectedNode = ref<Node>()
|
|
|
+
|
|
|
+const currentInfo = reactive({
|
|
|
+ userName: '',
|
|
|
+ accountName: '',
|
|
|
+ goodsName: '',
|
|
|
+ customerType: ''
|
|
|
+})
|
|
|
+
|
|
|
+const qs = computed<Model.AccTradeConfigViewReq>(() => {
|
|
|
+ const data = selectedNode.value?.data
|
|
|
+ return {
|
|
|
+ userid: data?.userid,
|
|
|
+ accountid: data?.accountid,
|
|
|
+ marketid: data?.marketid,
|
|
|
+ goodsid: data?.goodsid,
|
|
|
+ tradetype: data?.tradetype
|
|
|
+ }
|
|
|
+})
|
|
|
|
|
|
const { componentMap, componentId, openComponent, closeComponent, getActionButtons } = useOperation<Model.AccTradeConfigViewRsp>({
|
|
|
onClose: (componentId) => {
|
|
|
getNodeList()
|
|
|
if (componentId === 'investor_custom_accountcfg_modify') {
|
|
|
- onSearch()
|
|
|
+ getDetails(qs.value)
|
|
|
}
|
|
|
if (componentId === 'investor_custom_accountcfg_delete') {
|
|
|
- selectedInvestor.value = undefined
|
|
|
- selectedAccount.value = undefined
|
|
|
- selectedGoods.value = undefined
|
|
|
data.value = undefined
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-const customerTypeEnum = useEnum('customerType')
|
|
|
-const feetypeEnum = useEnum('feetype')
|
|
|
-const scfRiskMode = useEnum('SCFRiskMode')
|
|
|
-
|
|
|
-const { global: { t } } = i18n
|
|
|
-const formRef = shallowRef<FormInstance>()
|
|
|
-const qs = shallowRef<Partial<Model.AccTradeConfigViewReq>>({})
|
|
|
-
|
|
|
-const info = shallowRef<Partial<{
|
|
|
- userName: string,
|
|
|
- accountName: string,
|
|
|
- goodsName: string
|
|
|
-}>>({})
|
|
|
-
|
|
|
-const selectedInvestor = shallowRef<Model.AccTradeTreeRsp>() // 选中的交易商对象
|
|
|
-const selectedAccount = shallowRef<Model.AccTradeTreeRsp>() // 选中的资金账户对象
|
|
|
-const selectedGoods = shallowRef<Model.AccTradeTreeRsp>() // 选中的商品对象
|
|
|
-
|
|
|
-// 交易商列表
|
|
|
-const investorList = computed(() => nodeList.value.filter((e) => e.pid === '-1'))
|
|
|
-// 资金账户列表
|
|
|
-const accountList = computed(() => nodeList.value.filter((e) => e.pid === selectedInvestor.value?.id))
|
|
|
-// 商品列表
|
|
|
-const goodsList = computed(() => nodeList.value.filter((e) => e.pid === selectedAccount.value?.id))
|
|
|
-
|
|
|
-const { dataList: nodeList, run: getNodeList } = useRequest(getAccTradeTree, {
|
|
|
+const { run: getNodeList } = useRequest(getAccTradeTree, {
|
|
|
+ onSuccess: (res) => {
|
|
|
+ res.data.push(
|
|
|
+ {
|
|
|
+ accountid: 0,
|
|
|
+ goodsid: 0,
|
|
|
+ id: '-1',
|
|
|
+ level: 0,
|
|
|
+ marketid: 0,
|
|
|
+ name: '交易商账户个性化设置',
|
|
|
+ pid: '0',
|
|
|
+ tradetype: 1,
|
|
|
+ userid: 0,
|
|
|
+ }
|
|
|
+ )
|
|
|
+ nodeList.value = buildTree(res.data, 'id', 'pid', (node) => node.pid === '0')
|
|
|
+ },
|
|
|
onError: (err) => {
|
|
|
ElMessage.error(err)
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-const { data, run } = useRequest(accTradeConfigView, {
|
|
|
+const { data, run: getDetails } = useRequest(accTradeConfigView, {
|
|
|
manual: true,
|
|
|
onError: (err) => {
|
|
|
ElMessage.error(err)
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-const detailProps: CellProp[] = [
|
|
|
- { prop: 'usergroupid', label: '交易商', formatValue: () => info.value.userName },
|
|
|
- { prop: 'usergroupid', label: '资金账户', formatValue: () => info.value.accountName },
|
|
|
- { prop: 'usergroupid', label: '商品', formatValue: () => info.value.goodsName },
|
|
|
- { prop: 'paramid', label: '保证金类别', formatValue: (val) => customerTypeEnum.getEnumTypeName(val) },
|
|
|
-]
|
|
|
+const detailProps = computed<CellProp[]>(() => [
|
|
|
+ { prop: 'userName', label: '交易商' },
|
|
|
+ { prop: 'accountName', label: '资金账户' },
|
|
|
+ { prop: 'goodsName', label: '商品' },
|
|
|
+ { prop: 'customerType', label: '保证金类别', formatValue: () => customerTypeEnum.getEnumTypeName(data.value?.paramid) },
|
|
|
+])
|
|
|
|
|
|
const ruleColumns = computed<Model.TableColumn[]>(() => [
|
|
|
{ field: 'rulename', label: '扩展项' },
|
|
|
@@ -212,63 +203,13 @@ const feeColumns = computed<Model.TableColumn[]>(() => [
|
|
|
{ field: 'cvalue', label: '个性化' },
|
|
|
])
|
|
|
|
|
|
-// 表单验证规则
|
|
|
-const formRules: FormRules = {
|
|
|
- userid: [{
|
|
|
- required: true,
|
|
|
- validator: (rule, value, callback) => {
|
|
|
- if (selectedInvestor.value) {
|
|
|
- callback()
|
|
|
- } else {
|
|
|
- callback(new Error('请选择交易商'))
|
|
|
- }
|
|
|
- },
|
|
|
- }],
|
|
|
- accountid: [{
|
|
|
- required: true,
|
|
|
- validator: (rule, value, callback) => {
|
|
|
- if (selectedAccount.value) {
|
|
|
- callback()
|
|
|
- } else {
|
|
|
- callback(new Error('请选择资金账户'))
|
|
|
- }
|
|
|
- },
|
|
|
- }],
|
|
|
- goodsid: [{ required: true }],
|
|
|
-}
|
|
|
-
|
|
|
-// 选择交易商
|
|
|
-const onGroupChange = () => {
|
|
|
- selectedAccount.value = undefined
|
|
|
- selectedGoods.value = undefined
|
|
|
-}
|
|
|
-
|
|
|
-// 选择市场
|
|
|
-const onMarketChange = () => {
|
|
|
- selectedGoods.value = undefined
|
|
|
-}
|
|
|
-
|
|
|
-const onSearch = () => {
|
|
|
- qs.value = {
|
|
|
- userid: selectedGoods.value?.userid,
|
|
|
- accountid: selectedGoods.value?.accountid,
|
|
|
- marketid: selectedGoods.value?.marketid,
|
|
|
- goodsid: selectedGoods.value?.goodsid,
|
|
|
- tradetype: selectedGoods.value?.tradetype
|
|
|
+const nodeClick = (data: Model.CreateTreeRsp, node: Node) => {
|
|
|
+ if (data.goodsid) {
|
|
|
+ selectedNode.value = node
|
|
|
+ currentInfo.goodsName = node.label
|
|
|
+ currentInfo.accountName = node.parent.label
|
|
|
+ currentInfo.userName = node.parent.parent.label
|
|
|
+ getDetails(qs.value)
|
|
|
}
|
|
|
- nextTick(() => {
|
|
|
- formRef.value?.validate((valid) => {
|
|
|
- if (valid) {
|
|
|
- info.value = {
|
|
|
- userName: selectedInvestor.value?.name,
|
|
|
- accountName: selectedAccount.value?.name,
|
|
|
- goodsName: selectedGoods.value?.name,
|
|
|
- }
|
|
|
- run(qs.value)
|
|
|
- } else {
|
|
|
- data.value = undefined
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
}
|
|
|
</script>
|