金融市场配置等

V0.1
yujialong 1 year ago
parent a9d1f93311
commit 06a6fae1a8
  1. 2
      src/api/config.ts
  2. BIN
      src/assets/images/icon8-1.png
  3. 12
      src/layout/components/AppHeader.vue
  4. 55
      src/layout/components/AppSidebar/Menu.vue
  5. 4
      src/layout/index.vue
  6. 286
      src/views/config/Buyer.vue
  7. 140
      src/views/config/Financial.vue
  8. 16
      src/views/config/Index.vue
  9. 2
      src/views/product/bank/Add.vue
  10. 2
      src/views/product/bank/CardList.vue
  11. 4
      src/views/product/strategy/150.vue
  12. 4
      src/views/product/strategy/151.vue
  13. 3
      src/views/product/strategy/CardList.vue

@ -6,3 +6,5 @@ export const ages = async (): Promise<any> => (await axios.post('/product/ages/l
export const edu = async (): Promise<any> => (await axios.post('/product/edu/list')).data;
export const accountType = async (): Promise<any> => (await axios.post('/product/accountType/list')).data;
export const buyerType = async (): Promise<any> => (await axios.post('/product/buyerType/list')).data;
export const financialMarketFind = async (): Promise<any> => (await axios.post('/product/financialMarket/details')).data;
export const financialMarketSave = async (data: Record<string, any>): Promise<any> => (await axios.post('/product/financialMarket/saveOrUpdate', data)).data;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -1,5 +1,5 @@
<template>
<div class="flex justify-between items-center w-full py-6 px-5 overflow-hidden bg-transparent">
<div class="width-[100%] flex justify-between items-center w-full py-6 px-5 overflow-hidden bg-transparent">
<logo :collapse="collapse" />
<div class="inline-flex items-center">
<el-tooltip effect="light"
@ -39,16 +39,8 @@ import Logo from './Logo.vue';
const router = useRouter();
const switchRole = (type: number) => {
router.push(`/product?type=0&i=1&role=${type}`);
};
onMounted(() => {});
const handleLogout = () => {
logout();
// router.push(`/login?redirect=${route.fullPath}`);
window.location.reload();
};
//
const toLevel = () => {
router.push('/');
@ -57,8 +49,6 @@ const toLevel = () => {
const toRole = () => {
router.push(`/role?levelId=${Cookies.get('sand-level')}`);
};
const passwordFormVisible = ref<boolean>(false);
</script>
<style lang="scss" scoped></style>

@ -2,7 +2,7 @@
<ul class="switch px-7 mt-5">
<template v-if="role == 41">
<li :class="{ active: active == 1 }"
@click="toPage('/product?type=0&i=1')">
@click="toPage('/product?type=0&i=1&role=41')">
<img class="icon"
src="@/assets/images/icon5.png"
alt="" />
@ -12,7 +12,7 @@
<p class="text">个人产品</p>
</li>
<li :class="{ active: active == 2 }"
@click="toPage('/product?type=1&i=2')">
@click="toPage('/product?type=1&i=2&role=41')">
<img class="icon"
src="@/assets/images/icon6.png"
alt="" />
@ -24,7 +24,7 @@
</template>
<template v-else-if="role == 42">
<li :class="{ active: active == 1 }"
@click="toPage('/product/strategy/config?type=&i=1&role=42')">
@click="toPage('/product?type=&i=1&role=42')">
<img class="icon"
src="@/assets/images/icon1.png"
alt="" />
@ -62,67 +62,36 @@
<p class="text">贷后管理模型</p>
</li>
</template>
<li v-else
<li v-else-if="role == 43"
class="active">
<img class="icon"
src="@/assets/images/icon6.png"
alt="" />
<img class="icon-1"
src="@/assets/images/icon7-1.png"
alt="" />
<p class="text">审批产品</p>
</li>
<li v-else
class="active">
<img class="icon-1"
src="@/assets/images/icon8-1.png"
alt="" />
<p class="text">参数配置</p>
</li>
</ul>
</template>
<script setup lang="ts">
import { computed, ref, toRefs } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { isShowMenu } from '@/store/useCurrentUser';
const router = useRouter();
const route = useRoute();
const active = computed(() => route.query.i);
const role = computed(() => route.query.role || 41);
const role = computed(() => route.query.role);
//
const toPage = (path: string) => {
router.push(path);
};
function isExternal(path: string): boolean {
return /^(https?:|mailto:|tel:)/.test(path);
}
// const props = defineProps({ route: { type: Object, required: true }, basePath: { type: String, default: '' } });
// const { route, basePath } = toRefs(props);
// const router = useRouter();
// //
// const isShow = computed(() => !route.value.meta?.hidden);
// //
// const subMenu = computed(() => route.value.meta?.title && route.value.children);
// // title
// const targetRoute = computed(() => (!route.value.meta?.title && route.value.children?.length > 0 ? route.value.children[0] : route.value));
// const icon = computed(() => targetRoute.value.meta?.icon);
// const title = computed(() => targetRoute.value.meta?.title);
// // targetItem使使basePath
// const path = computed(() => (route.value !== targetRoute.value ? targetRoute.value.path : ''));
// const resolvePath = (routePath: string) => {
// if (isExternal(routePath)) {
// return routePath;
// }
// return `${basePath.value}/${routePath}`;
// };
// const handleClick = () => {
// const fullPath = resolvePath(path.value);
// if (isExternal(fullPath)) {
// window.open(fullPath, '_blank');
// } else {
// router.push(resolvePath(path.value));
// }
// };
</script>
<style lang="scss" scoped>

@ -3,7 +3,7 @@
<app-header />
<app-sidebar v-if="!hideNav"
class="sidebar fixed w-sidebar h-full px-5 overflow-hidden transition-width duration-300 z-40" />
<div class="main min-h-[calc(100vh-85px)] transition-margin duration-300 overflow-auto"
<div class="main h-[calc(100vh-95px)] transition-margin duration-300 overflow-auto"
:class="{ 'md:ml-sidebar': !hideNav }">
<app-main />
</div>
@ -11,7 +11,7 @@
</template>
<script lang="ts">
import { ref, defineComponent, computed, watch } from 'vue';
import { defineComponent, computed } from 'vue';
import { useRoute } from 'vue-router';
import Setting from '@/settings';
import { AppSidebar, AppHeader, AppMain } from './components';

@ -1,150 +1,152 @@
<template>
<h6 class="title">城市人口及年龄参数</h6>
<el-table class="c-table"
:data="form.ageAduRatioList"
:span-method="ageSpan"
border>
<el-table-column prop="productName"
label="城市总人口 (人)"
align="center">
<template #default="{ row }">
<el-input v-model.number="row.totalPopulation"
placeholder="请输入"
type="number"
min="0"></el-input>
</template>
</el-table-column>
<el-table-column prop="ageStage"
label="年龄 (岁)"
align="center"></el-table-column>
<el-table-column prop="ageRatio"
label="年龄占比 (%)"
align="center">
<template #default="{ row }">
<el-input v-model="row.ageRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
</el-table>
<div class="max-h-[calc(100vh-280px)] overflow-auto">
<h6 class="title">城市人口及年龄参数</h6>
<el-table class="c-table"
:data="form.ageAduRatioList"
:span-method="ageSpan"
border>
<el-table-column prop="productName"
label="城市总人口 (人)"
align="center">
<template #default="{ row }">
<el-input v-model.number="row.totalPopulation"
placeholder="请输入"
type="number"
min="0"></el-input>
</template>
</el-table-column>
<el-table-column prop="ageStage"
label="年龄 (岁)"
align="center"></el-table-column>
<el-table-column prop="ageRatio"
label="年龄占比 (%)"
align="center">
<template #default="{ row }">
<el-input v-model="row.ageRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">学历参数</h6>
<el-table class="c-table"
:data="edus"
:span-method="eduSpan"
border>
<el-table-column prop="ageStage"
label="年龄 (岁)"
align="center"> </el-table-column>
<el-table-column prop="education"
label="学历"
align="center"></el-table-column>
<el-table-column prop="parentIds"
label="学历占比 (%)"
align="center">
<template #default="{ row }">
<el-input v-model="row.eduRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">学历参数</h6>
<el-table class="c-table"
:data="edus"
:span-method="eduSpan"
border>
<el-table-column prop="ageStage"
label="年龄 (岁)"
align="center"> </el-table-column>
<el-table-column prop="education"
label="学历"
align="center"></el-table-column>
<el-table-column prop="parentIds"
label="学历占比 (%)"
align="center">
<template #default="{ row }">
<el-input v-model="row.eduRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">企业数量配置</h6>
<el-table class="c-table"
:data="form.enterpriseNumList"
border>
<el-table-column prop="productName"
label="企业类型"
align="center">
<template #default="{ row }">
{{ row.enterpriseType == 1 ? '小微企业' : '创业企业' }}
</template>
</el-table-column>
<el-table-column prop="parentIds"
label="企业数量(家)"
align="center">
<template #default="{ row }">
<el-input v-model.number="row.number"
placeholder="请输入"
maxlength="3"
type="number"
min="0"></el-input>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">企业数量配置</h6>
<el-table class="c-table"
:data="form.enterpriseNumList"
border>
<el-table-column prop="productName"
label="企业类型"
align="center">
<template #default="{ row }">
{{ row.enterpriseType == 1 ? '小微企业' : '创业企业' }}
</template>
</el-table-column>
<el-table-column prop="parentIds"
label="企业数量(家)"
align="center">
<template #default="{ row }">
<el-input v-model.number="row.number"
placeholder="请输入"
maxlength="3"
type="number"
min="0"></el-input>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">单个商品每日需求量</h6>
<el-table class="c-table"
:data="form.commodityDemandList"
border>
<el-table-column prop="typeName"
label="买家类型"
min-width="100"
align="center"> </el-table-column>
<el-table-column prop="parentIds"
label="买家总占比 (%)"
min-width="100"
align="center">
<template #default="{ row }">
<el-input v-model="row.buyerRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
<el-table-column prop="parentIds"
label="每次需求人数占比 (%)"
min-width="130"
align="center">
<template #default="{ row }">
<el-input v-model="row.peopleNumRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
<el-table-column prop="parentIds"
label="单个买家单次需求"
min-width="200"
align="center">
<template #default="{ row }">
<div class="flex items-center">
<template v-if="row.typeId == 7 || row.typeId == 8">
<span class="mr-2 whitespace-nowrap">一个保险产品一次最多购买</span>
<el-input v-model="row.buyerSingleDemand"
placeholder="请输入"></el-input>
<span class="ml-2"></span>
</template>
<template v-else>
<span class="mr-2 whitespace-nowrap">{{ row.typeId == 9 ? '投入' : '贷款' }}</span>
<el-input v-model="row.buyerSingleDemandMin"
placeholder="请输入"></el-input>
<span class="mx-2">~</span>
<el-input v-model="row.buyerSingleDemandMax"
placeholder="请输入"></el-input>
<span class="ml-2 whitespace-nowrap">万元</span>
</template>
</div>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">单个商品每日需求量</h6>
<el-table class="c-table"
:data="form.commodityDemandList"
border>
<el-table-column prop="typeName"
label="买家类型"
min-width="100"
align="center"> </el-table-column>
<el-table-column prop="parentIds"
label="买家总占比 (%)"
min-width="100"
align="center">
<template #default="{ row }">
<el-input v-model="row.buyerRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
<el-table-column prop="parentIds"
label="每次需求人数占比 (%)"
min-width="130"
align="center">
<template #default="{ row }">
<el-input v-model="row.peopleNumRatio"
placeholder="请输入"></el-input>
</template>
</el-table-column>
<el-table-column prop="parentIds"
label="单个买家单次需求"
min-width="200"
align="center">
<template #default="{ row }">
<div class="flex items-center">
<template v-if="row.typeId == 7 || row.typeId == 8">
<span class="mr-2 whitespace-nowrap">一个保险产品一次最多购买</span>
<el-input v-model="row.buyerSingleDemand"
placeholder="请输入"></el-input>
<span class="ml-2"></span>
</template>
<template v-else>
<span class="mr-2 whitespace-nowrap">{{ row.typeId == 9 ? '投入' : '贷款' }}</span>
<el-input v-model="row.buyerSingleDemandMin"
placeholder="请输入"></el-input>
<span class="mx-2">~</span>
<el-input v-model="row.buyerSingleDemandMax"
placeholder="请输入"></el-input>
<span class="ml-2 whitespace-nowrap">万元</span>
</template>
</div>
</template>
</el-table-column>
</el-table>
<h6 class="title mt-7">系统账户起始金额</h6>
<el-form v-if="form.moneyAllocationList.length"
class="w-[300px]"
label-width="120px"
label-suffix=":">
<el-form-item label="银行账户">
<el-input v-model="form.moneyAllocationList[0].startingAmount">
<template #suffix> 万元 </template>
</el-input>
</el-form-item>
<el-form-item label="保险账户">
<el-input v-model="form.moneyAllocationList[1].startingAmount">
<template #suffix> 万元 </template>
</el-input>
</el-form-item>
<el-form-item label="基金账户">
<el-input v-model="form.moneyAllocationList[2].startingAmount">
<template #suffix> 万元 </template>
</el-input>
</el-form-item>
</el-form>
<h6 class="title mt-7">系统账户起始金额</h6>
<el-form v-if="form.moneyAllocationList.length"
class="w-[300px]"
label-width="120px"
label-suffix=":">
<el-form-item label="银行账户">
<el-input v-model="form.moneyAllocationList[0].startingAmount">
<template #suffix> 万元 </template>
</el-input>
</el-form-item>
<el-form-item label="保险账户">
<el-input v-model="form.moneyAllocationList[1].startingAmount">
<template #suffix> 万元 </template>
</el-input>
</el-form-item>
<el-form-item label="基金账户">
<el-input v-model="form.moneyAllocationList[2].startingAmount">
<template #suffix> 万元 </template>
</el-input>
</el-form-item>
</el-form>
</div>
<div class="flex justify-end">
<div class="submit"

@ -0,0 +1,140 @@
<template>
<div class="max-h-[calc(100vh-280px)] overflow-auto">
<el-form ref="formRef"
label-width="100px"
label-suffix=":"
class="form"
status-icon>
<h6 class="title">单个银行账户</h6>
<el-form-item label="收益计算">
<div>
<p class="text leading-[32px] ">收入 = 收回的本金 + 利息</p>
<p class="text leading-[32px] ">成本 = 贷出去未收回的本金 + 购买渠道金额</p>
<p class="text leading-[32px] ">收益 = 收入 - 成本</p>
</div>
</el-form-item>
<el-form-item label="银行资产">
<div class="flex-1">
<div class="flex items-center">
<span class="text">起始金额</span>
<el-input class="w-[140px] mx-2"
v-model="form[0].startingAmount"></el-input>
<span class="text">万元</span>
</div>
<p class="text mt-4">银行账户金额 = 起始金额 + 累计收益</p>
</div>
</el-form-item>
<h6 class="title">单个保险账户</h6>
<el-form-item label="收益计算">
<div>
<p class="text leading-[32px] ">收入 = 收到的保费</p>
<p class="text leading-[32px] ">成本 = 赔偿金 + 购买渠道金额</p>
<p class="text leading-[32px] ">收益 = 收入 - 成本</p>
</div>
</el-form-item>
<el-form-item label="保险资产">
<div class="flex-1">
<div class="flex items-center">
<span class="text">起始金额</span>
<el-input class="w-[140px] mx-2"
v-model="form[1].startingAmount"></el-input>
<span class="text">万元</span>
</div>
<p class="text mt-4">保险账户金额 = 起始金额 + 累计收益</p>
</div>
</el-form-item>
<h6 class="title">单个基金账户</h6>
<el-form-item label="冻结账户">
<div>
<p class="text leading-[32px] ">冻结账户金额 = 申购金额 + 赎回金额</p>
<p class="text leading-[32px] ">基金申购以及赎回确认份额期间</p>
</div>
</el-form-item>
<el-form-item label="收益计算">
<div>
<p class="text leading-[32px] ">收入 = 申购费用 + 管理费用 + 托管费用 + 销售服务费用 + 赎回费用</p>
<p class="text leading-[32px] ">成本 = 购买渠道金额</p>
<p class="text leading-[32px] ">收益 = 申购费用 + 管理费用 + 托管费用 + 销售服务费用 + 赎回费用</p>
</div>
</el-form-item>
<el-form-item label="基金资产:">
<div class="flex-1">
<div class="flex items-center">
<span class="text">起始金额</span>
<el-input class="w-[140px] mx-2"
v-model="form[2].startingAmount"></el-input>
<span class="text">万元</span>
</div>
<p class="text mt-4">基金账户金额 = 所有基金资产净值+起始金额 + 累计收益 - 购买渠道金额</p>
</div>
</el-form-item>
</el-form>
</div>
<div class="flex justify-end">
<div class="submit"
@click="submit">保存修改</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { ElMessage } from 'element-plus';
import { financialMarketFind, financialMarketSave } from '@/api/config';
const form = ref<Record<string, any>[]>([
{
accountTypeId: 1,
distinguish: 2,
startingAmount: '',
},
{
accountTypeId: 2,
distinguish: 2,
startingAmount: '',
},
{
accountTypeId: 3,
distinguish: 2,
startingAmount: '',
},
]);
const getInfo = async () => {
const { data } = await financialMarketFind();
// res1.list.map((e) => {
// e.startingAmount = '';
// });
if (data.length) form.value = data;
};
const submit = async () => {
if (form.value[0].startingAmount === '' || isNaN(form.value[0].startingAmount)) return ElMessage.error('请输入合理的银行起始金额');
if (form.value[1].startingAmount === '' || isNaN(form.value[1].startingAmount)) return ElMessage.error('请输入合理的保险起始金额');
if (form.value[2].startingAmount === '' || isNaN(form.value[2].startingAmount)) return ElMessage.error('请输入合理的基金起始金额');
await financialMarketSave({ moneyAllocationList: form.value });
ElMessage.success('保存成功!');
getInfo();
};
onMounted(() => {
getInfo();
});
</script>
<style lang="scss" scoped>
@import url(../../styles/form.scss);
.title {
@apply flex items-center mb-5 text-base text-[#222D42] font-semibold;
&:before {
content: '';
@apply w-1 h-4 mr-2 bg-[#006BFF] rounded-sm;
}
}
.text {
@apply whitespace-nowrap text-sm text-[#333];
}
</style>

@ -4,10 +4,12 @@
@tab-click="tabChange">
<el-tab-pane label="系统买方"
name="tab1">
<buyer></buyer>
<buyer />
</el-tab-pane>
<el-tab-pane label="金融市场"
name="tab2"> </el-tab-pane>
name="tab2">
<Financial />
</el-tab-pane>
<el-tab-pane label="扫单配置"
name="tab3"> </el-tab-pane>
<el-tab-pane label="渠道广告"
@ -18,12 +20,9 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { ElMessage } from 'element-plus';
import type { TabsPaneContext } from 'element-plus';
import Buyer from './Buyer.vue';
defineProps({ modelValue: { type: Object, required: true } });
defineEmits({ 'update:form': null });
import Financial from './Financial.vue';
const curTab = ref<string>('tab1');
@ -31,10 +30,7 @@ const curTab = ref<string>('tab1');
const tabChange = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event);
};
onMounted(() => {
// getGuarantee();
// fetchData();
});
onMounted(() => {});
</script>
<style lang="scss" scoped></style>

@ -201,11 +201,9 @@
<div class="flex-1">
<div class="num-inputs">
<el-input placeholder="最小额度"
min="0"
v-model.number="form.minimumLoan"></el-input>
<span class="split">-</span>
<el-input placeholder="最高额度"
min="0"
v-model.number="form.loanCeiling"></el-input>
<span class="unit">万元</span>
</div>

@ -115,7 +115,7 @@ const handleDelete = async (id: number) => {
}
.products {
li {
@apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-no-repeat;
@apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-[length:100%_100%] bg-no-repeat;
&.active {
@apply border-[#CAE0FF];
}

@ -157,8 +157,8 @@ const getConfig = async () => {
let symbol = cur?.ruleOne.match(/[<>=]+/g);
let had = cur?.ruleOne.match(/[有无]+/g);
let temp = {
checkpointId: Cookies.get('sand-level'),
projectId: Cookies.get('sand-projectId'),
checkpointId: levelId,
projectId,
name: e.name,
recordChildren: e.recordChildren,
isRule: isRule(e.id) ? 1 : 0,

@ -127,8 +127,8 @@ const getConfig = async () => {
let symbol = cur?.ruleOne.match(/[<>=]+/g);
let had = cur?.ruleOne.match(/[有无]+/g);
let temp = {
checkpointId: Cookies.get('sand-level'),
projectId: Cookies.get('sand-projectId'),
checkpointId: levelId,
projectId,
name: e.name,
recordChildren: e.recordChildren,
isRule: isRule(e.id) ? 1 : 0,

@ -18,7 +18,8 @@
</ul>
</div>
<div class="right flex-1 px-5 pt-2">
<component :is="defineAsyncComponent(() => import('./' + id + '.vue'))"></component>
<component v-if="id"
:is="defineAsyncComponent(() => import('./' + id + '.vue'))"></component>
</div>
</div>
</el-tab-pane>

Loading…
Cancel
Save