You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
11 KiB
274 lines
11 KiB
<template> |
|
<div> |
|
<el-tabs v-model="curTab"> |
|
<el-tab-pane :label="id ? '产品要素' : '新增产品'" |
|
name="tab1"> |
|
<el-form label-width="100px" |
|
label-suffix=":" |
|
class="max-w-[calc(100vw-540px)] overflow-auto form" |
|
status-icon> |
|
<el-form-item label="保险名称" |
|
prop="insuranceName"> |
|
<el-input placeholder="取个有吸引力的产品名,限20字。" |
|
maxlength="20" |
|
v-model="form.insuranceName"></el-input> |
|
</el-form-item> |
|
<el-form-item label="险种分类" |
|
prop="insuranceType"> |
|
<el-select v-model="form.insuranceType" |
|
placeholder="请选择"> |
|
<el-option v-for="item in config[0]?.recordChildren[1]?.subject?.itemList" |
|
:key="item" |
|
:label="item.options" |
|
:value="item.itemId" /> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item v-if="form.insuranceType === 310" |
|
label="承保年龄"> |
|
<div class="flex items-center"> |
|
<div class="num-inputs"> |
|
<el-input placeholder="最小年龄" |
|
v-model.number="form.minimumAge"></el-input> |
|
<span class="split">-</span> |
|
<el-input placeholder="最大年龄" |
|
v-model.number="form.maximumAge"></el-input> |
|
<span class="unit">周岁</span> |
|
</div> |
|
</div> |
|
</el-form-item> |
|
<el-form-item label="保险额度"> |
|
<div class="flex-1"> |
|
<div class="flex"> |
|
<p class="field-name w-[130px] mr-32">保险责任</p> |
|
<p class="field-name">保额</p> |
|
</div> |
|
<div v-for="(item, i) in config[form.insuranceType === 310 ? 0 : 1]?.recordChildren[2]?.recordChildren" |
|
:key="i" |
|
class="flex items-center mb-2"> |
|
<div class="w-[130px] mr-32"> |
|
<el-checkbox :key="item.id" |
|
v-model="item.check" |
|
:label="item.name" /> |
|
</div> |
|
<div v-if="item.check"> |
|
<el-input placeholder="请输入" |
|
v-model="item.sumInsured"> |
|
<template #append>{{ item.id === 764 || item.id === 765 ? '元' : '万' }}</template> |
|
</el-input> |
|
</div> |
|
</div> |
|
</div> |
|
</el-form-item> |
|
<el-form-item label="保费金额" |
|
prop="minimumLoan"> |
|
<div> |
|
<el-input placeholder="请输入" |
|
v-model="form.premiumAmount"> |
|
<template #append>元</template> |
|
</el-input> |
|
</div> |
|
</el-form-item> |
|
<el-form-item label="缴纳形式"> |
|
<el-radio :label="312" |
|
v-model="form.formOfPayment">趸交</el-radio> |
|
</el-form-item> |
|
<el-form-item label="保险期限"> |
|
<div class="flex"> |
|
<el-input class="mr-2" |
|
placeholder="请输入" |
|
v-model="form.insuranceDeadline"></el-input> |
|
<el-select v-model="form.insuranceDeadlineUnit" |
|
placeholder="请选择" |
|
clearable> |
|
<el-option v-for="item in units" |
|
:key="item" |
|
:label="item" |
|
:value="item" /> |
|
</el-select> |
|
</div> |
|
</el-form-item> |
|
<el-form-item label="申请材料"> |
|
<el-checkbox-group v-model="form.applicationMaterial"> |
|
<el-checkbox v-for="(item, i) in config[form.insuranceType === 310 ? 0 : 1]?.recordChildren[6]?.subject?.itemList" |
|
:key="i" |
|
:label="item.itemId">{{ item.options }}</el-checkbox> |
|
</el-checkbox-group> |
|
</el-form-item> |
|
<el-form-item label="责任免除"> |
|
<el-checkbox-group v-model="form.exemptionFromLiability"> |
|
<el-checkbox v-for="(item, i) in config[0]?.recordChildren[7]?.subject?.itemList" |
|
:key="i" |
|
:label="item.itemId">{{ item.options }}</el-checkbox> |
|
</el-checkbox-group> |
|
</el-form-item> |
|
<div class="flex justify-end"> |
|
<div class="submit" |
|
@click="submit">完成</div> |
|
</div> |
|
</el-form> |
|
</el-tab-pane> |
|
</el-tabs> |
|
</div> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { ref, reactive, computed, watch, onMounted, defineEmits } from 'vue'; |
|
import { ElMessage } from 'element-plus'; |
|
import { insuranceProductDetails, addInsuranceProducts } from '@/api/insurance'; |
|
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
import { useRouter, useRoute } from 'vue-router'; |
|
import { handleId, isIllegalNum } from '@/utils/common'; |
|
import Cookies from 'js-cookie'; |
|
|
|
const emit = defineEmits(['getList']); |
|
|
|
const router = useRouter(); |
|
const route = useRoute(); |
|
const id = computed(() => route.query.id); |
|
const projectId = +Cookies.get('sand-projectId'); |
|
const levelId = +Cookies.get('sand-level'); |
|
const curTab = ref<string>('tab1'); |
|
const config = ref<any[]>([]); |
|
const info = ref<Record<string, any>>(null); |
|
const units: Array<string> = ['年', '个月', '天', '小时']; |
|
const form = reactive({ |
|
checkPointId: levelId, |
|
projectId, |
|
insuranceName: '', |
|
applicationMaterial: [], |
|
exemptionFromLiability: [], |
|
formOfPayment: '', |
|
insuranceCoverageConfigList: [], |
|
insuranceDeadline: '', |
|
insuranceDeadlineUnit: '', |
|
maximumAge: '', |
|
insuranceType: 310, |
|
premiumAmount: '', |
|
minimumAge: '', |
|
}); |
|
|
|
// 配置项 |
|
const getConfig = async () => { |
|
const { process } = await getProcessInformationBasedOnRoles(275); |
|
config.value = process; |
|
}; |
|
// 详情 |
|
const getDetail = async () => { |
|
if (id.value) { |
|
try { |
|
const { data } = await insuranceProductDetails(id.value); |
|
info.value = data; |
|
} finally { |
|
} |
|
} |
|
}; |
|
watch( |
|
() => route.query, |
|
() => { |
|
getDetail(); |
|
}, |
|
{ |
|
immediate: true, |
|
}, |
|
); |
|
// 新增判分记录 |
|
const addRecord = async (data: Record<string, any>) => { |
|
const isAcci = data.insuranceType === 310; // 意外险 |
|
const preIds = `1,${Cookies.get('sand-level')},275,${isAcci ? 276 : 277}`; // 1,关卡id,角色(这个页面是保险产品经理新增产品) |
|
const rule: Array<Record<string, any>> = [handleId(278, 118, data.insuranceName, preIds + ',278', 3), handleId(279, 119, data.insuranceType, preIds + ',279', 1)]; |
|
data.minimumAge && rule.push(handleId(680, 219, data.minimumAge, preIds + ',678,680', 3)); |
|
data.maximumAge && rule.push(handleId(679, 218, data.maximumAge, preIds + ',678,679', 3)); |
|
// 保险额度 |
|
config.value[form.insuranceType === 310 ? 0 : 1]?.recordChildren[2]?.recordChildren?.map((e) => { |
|
rule.push(handleId(isAcci ? 766 : 768, 140, e.check ? 345 : 346, `${preIds},${isAcci ? 280 : 288},${e.id},${isAcci ? 766 : 768}`, 1)); |
|
e.check && e.sumInsured && rule.push(handleId(isAcci ? 767 : 769, 234, e.sumInsured, `${preIds},${isAcci ? 280 : 288},${e.id},${isAcci ? 767 : 769}`, 3)); |
|
}); |
|
data.premiumAmount && rule.push(handleId(296, 134, data.premiumAmount, preIds + ',296', 3)); |
|
data.formOfPayment && rule.push(handleId(297, 135, data.formOfPayment, preIds + ',297', 1)); |
|
|
|
form.insuranceDeadline && rule.push(handleId(770, 136, form.insuranceDeadline, preIds + ',298,770', 3)); |
|
form.insuranceDeadlineUnit && |
|
rule.push( |
|
handleId( |
|
771, |
|
235, |
|
config.value[form.insuranceType === 310 ? 0 : 1]?.recordChildren[5]?.recordChildren[1]?.subject?.itemList?.find((e) => e.options === form.insuranceDeadlineUnit)?.itemId, |
|
preIds + ',298,771', |
|
1, |
|
), |
|
); |
|
data.applicationMaterial && rule.push(handleId(isAcci ? 299 : 300, isAcci ? 137 : 138, data.applicationMaterial, `${preIds},${isAcci ? 299 : 300}`, 1)); |
|
data.exemptionFromLiability && rule.push(handleId(301, 139, data.exemptionFromLiability, preIds + ',301', 1)); |
|
|
|
await addOperation({ |
|
...getIds(), |
|
parentId: preIds, |
|
lcJudgmentRuleReq: rule, |
|
}); |
|
}; |
|
// 提交 |
|
const submit = async () => { |
|
try { |
|
const param = JSON.parse(JSON.stringify(form)); |
|
|
|
if (!param.insuranceName) return ElMessage.error('请输入保险名称'); |
|
|
|
if (param.insuranceType === 310) { |
|
if (!param.minimumAge) return ElMessage.error('请输入最小年龄'); |
|
if (!param.maximumAge) return ElMessage.error('请输入最大年龄'); |
|
if (isIllegalNum(param.minimumAge) || isIllegalNum(param.maximumAge)) return ElMessage.error('请输入合理的年龄'); |
|
if (param.minimumAge > param.maximumAge) return ElMessage.error('最小年龄不得大于最大年龄'); |
|
} |
|
let invalid = 0; |
|
for (const e of config.value[form.insuranceType === 310 ? 0 : 1]?.recordChildren[2]?.recordChildren) { |
|
if (e.check) { |
|
if (isIllegalNum(e.sumInsured)) { |
|
invalid = 1; |
|
ElMessage.error('请输入合理的保额'); |
|
break; |
|
} |
|
param.insuranceCoverageConfigList.push({ |
|
insuredLiabilityId: e.id, |
|
sumInsured: Number(e.sumInsured).toFixed(2), |
|
}); |
|
} |
|
} |
|
if (invalid) return false; |
|
if (!param.insuranceCoverageConfigList.length) return ElMessage.error('请至少输入一项保险额度'); |
|
if (isIllegalNum(param.premiumAmount)) { |
|
return ElMessage.error('请输入合理的保费金额'); |
|
} else { |
|
param.premiumAmount = Number(param.premiumAmount).toFixed(2); |
|
} |
|
if (!param.formOfPayment) return ElMessage.error('请选择缴纳形式'); |
|
if (isIllegalNum(param.insuranceDeadline)) return ElMessage.error('请输入合理的保险期限'); |
|
if (!param.insuranceDeadlineUnit) return ElMessage.error('请选择保险期限'); |
|
param.insuranceDeadline = param.insuranceDeadline + param.insuranceDeadlineUnit; |
|
if (!param.applicationMaterial.length) return ElMessage.error('请至少选择一项申请材料'); |
|
if (!param.exemptionFromLiability.length) return ElMessage.error('请至少选择一项责任免除'); |
|
param.applicationMaterial = param.applicationMaterial.join(); |
|
param.exemptionFromLiability = param.exemptionFromLiability.join(); |
|
await addInsuranceProducts(param); |
|
addRecord(param); |
|
ElMessage.success('提交成功!'); |
|
emit('getList', 1); |
|
} finally { |
|
} |
|
}; |
|
onMounted(() => { |
|
getConfig(); |
|
}); |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
@import url(../../../styles/form.scss); |
|
.audit { |
|
@apply py-5 px-4 mb-[30px] bg-[#f9fafc] rounded-[10px]; |
|
.line { |
|
@apply mb-[18px] text-sm leading-[1.6]; |
|
} |
|
.field { |
|
@apply text-sm font-semibold; |
|
} |
|
} |
|
</style>
|
|
|