mirror of
http://112.124.100.131/GFRS/ebiz-h5.git
synced 2025-12-06 16:36:44 +08:00
@@ -412,3 +412,11 @@ export function riskLevelCheck(data) {
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function saveEvalateAnswer(data) {
|
||||
return request({
|
||||
url: getUrl('/sale/order/saveOrUpdateAssessInfo ', 1),
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
159
src/components/common/PopupQuesResult.vue
Normal file
159
src/components/common/PopupQuesResult.vue
Normal file
@@ -0,0 +1,159 @@
|
||||
<template>
|
||||
<div class="popup-ques-result">
|
||||
<van-popup
|
||||
v-model="showResultPopup"
|
||||
position="bottom"
|
||||
class="result-popup"
|
||||
@click-overlay = "clickOverlay('overlay')"
|
||||
>
|
||||
<div class="result-popup-title">
|
||||
<span>您的风险能力测评结果</span>
|
||||
<van-icon name="cross" @click="clickOverlay('icon')"/>
|
||||
</div>
|
||||
<div class="result-popup-content">
|
||||
<div class='content'>尊敬的{{appntInfo.name}}{{appntInfo.sex=='0'?'先生':'女士'}}:</div>
|
||||
<div class='content'>根据您填写的评估问卷,本公司对您的保险需求及财务支付水平进行了综合评估,结果反馈如下:</div>
|
||||
<div class='content'>您适合购买的产品类型为:
|
||||
<span class='product-type'>{{resultRiskType}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<div v-for="(item,idx) in productLevel" :key="idx" class="itemLevel">
|
||||
{{ item }}
|
||||
</div>
|
||||
</div>
|
||||
<div class='tips'>特别提示:</div>
|
||||
<div class='tips'> 本次评估结果及匹配意见供您决策参考,并不代表本公司对上述产品的风险及收益作出实质性判断或者保证。若您提供的信息发生任何重大变化,建议您对所购买的产品及时进行重新审视,以确保您的购买决定与您可承受的风险程度等实际情况一致。</div>
|
||||
<div class='tips'>建议您充分考察该产品的特征,自行做出投保决定,请您确保您的决定是独立、自主、真实的。</div>
|
||||
</div>
|
||||
<!-- 未测评过底部按钮 -->
|
||||
<div class="bottom-btn bg-white flex" v-if="showNoTested">
|
||||
<van-button type="danger" square size="large" plain v-no-more-click="1000" @click="reTest">重新测评</van-button>
|
||||
<van-button type="danger" square size="large" v-no-more-click="1000" @click="toInsure">我已知晓,继续投保</van-button>
|
||||
</div>
|
||||
|
||||
<!-- 已测评过底部按钮 -->
|
||||
<div class="bottom-btn bg-white flex" v-if="showHasTested">
|
||||
<van-button type="danger" square size="large" plain v-no-more-click="1000" @click="goBack">上一步</van-button>
|
||||
<van-button type="danger" square size="large" class="btn" v-no-more-click="1000" @click="goNext">已知晓,继续投保</van-button>
|
||||
<van-button type="danger" square size="large" v-no-more-click="1000" @click="reStart">重新评估</van-button>
|
||||
</div>
|
||||
|
||||
</van-popup>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'PopupQuesResult',
|
||||
props: {
|
||||
showResultPopup: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
showNoTested: { //未测评过
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
showHasTested: { //已测评过
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
appntInfo:{
|
||||
type: Object,
|
||||
default: () => {}
|
||||
},
|
||||
resultRiskType:{
|
||||
type:String,
|
||||
default:''
|
||||
},
|
||||
assessResultDescList:{
|
||||
type:Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
//showNoTested: false
|
||||
productLevel:[
|
||||
'P1分类:保险期限为一年期及以下的人身保险产品,包括人寿保险、健康保险、意外伤害保险等',
|
||||
'P2分类:保险期限为一年期以上的普通型人身保险,包括人寿保险、年金保险、健康保险、意外伤害保险等',
|
||||
'P3分类:专属商业养老保险、分红型人身保险、万能型人身保险,其他符合本级特征描述的人身保险产品,包括人寿保险、年金保险等',
|
||||
'P4分类:投资连结型人身保险、变额年金保险,其他符合本级特征描述的人身保险产品,包括人寿保险、年金保险等',
|
||||
'P5分类:符合本级特征描述的人身保险产品']
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
clickOverlay(extra){
|
||||
this.$emit('clickOverlayHandler',extra)
|
||||
},
|
||||
|
||||
//1.未测评过弹窗按钮
|
||||
//1.1 重新测评
|
||||
reTest(){
|
||||
this.$emit('reTestHandler')
|
||||
},
|
||||
//1.2 我已知晓,继续投保
|
||||
toInsure(){
|
||||
this.$emit('toInsureHandler')
|
||||
},
|
||||
|
||||
//2.已测评过弹窗按钮
|
||||
//2.1 上一步
|
||||
goBack(){
|
||||
this.$emit('goBackHandler')
|
||||
},
|
||||
//2.2 下一步
|
||||
goNext(){
|
||||
this.$emit('goNextHandler')
|
||||
},
|
||||
//2.3 重新评估
|
||||
reStart(){
|
||||
this.$emit('reStartHandler')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.popup-ques-result{
|
||||
.result-popup{
|
||||
|
||||
.result-popup-title{
|
||||
padding:10px 10px 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.result-popup-content{
|
||||
padding:10px 10px 60px;
|
||||
box-sizing:border-box;
|
||||
.content{
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 5px;
|
||||
.product-type{
|
||||
color: #ee0a24;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.tips{
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
}
|
||||
.result-popup-btn{
|
||||
|
||||
}
|
||||
.btn{
|
||||
//flex:1.5;
|
||||
}
|
||||
.itemLevel{
|
||||
font-size: 10px;
|
||||
color:#999;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
10
src/main.js
10
src/main.js
@@ -38,7 +38,11 @@ import {
|
||||
PullRefresh,
|
||||
List,
|
||||
Image as VanImage,
|
||||
Sticky
|
||||
Sticky,
|
||||
Radio,
|
||||
RadioGroup,
|
||||
Checkbox,
|
||||
CheckboxGroup
|
||||
} from 'vant'
|
||||
Vue.use(Cell)
|
||||
Vue.use(CellGroup)
|
||||
@@ -66,6 +70,10 @@ Vue.use(List)
|
||||
Vue.use(VanImage)
|
||||
Vue.use(Sticky)
|
||||
Vue.use(animated)
|
||||
Vue.use(Radio)
|
||||
Vue.use(RadioGroup)
|
||||
Vue.use(Checkbox)
|
||||
Vue.use(CheckboxGroup)
|
||||
|
||||
Vue.prototype.$assetsUrl = config.assetsUrl
|
||||
Vue.prototype.$assetsUpUrl = config.assetsUpUrl
|
||||
|
||||
@@ -5,6 +5,7 @@ const addRiskList = () => import('@/views/ebiz/common/AddRiskList')
|
||||
const calculatePremium = () => import('@/views/ebiz/common/CalculatePremium')
|
||||
const defalut = () => import('@/views/ebiz/common/Defalut')
|
||||
const companyIntroduce = () => import('@/views/ebiz/common/CompanyIntroduce')
|
||||
const evaluateResult = () => import('@/views/ebiz/common/EvaluateResult')
|
||||
|
||||
export default [
|
||||
{
|
||||
@@ -66,5 +67,14 @@ export default [
|
||||
title: '关于国富',
|
||||
index: 1
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/common/evaluateResult',
|
||||
name: 'EvaluateResult',
|
||||
component: evaluateResult,
|
||||
meta: {
|
||||
title: '评估结果',
|
||||
index: 1
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -39,6 +39,7 @@ const shortPeriodProduct = () => import('@/views/ebiz/sale/shortPeriodProduct')
|
||||
const commitmentSelfProtect = () => import('@/views/ebiz/sale/commitmentSelfProtect')
|
||||
const readDocuments = () => import('@/views/ebiz/sale/readDocuments')
|
||||
const signDocuments = () => import('@/views/ebiz/sale/signDocuments')
|
||||
const questionEvaluate = () => import('@/views/ebiz/sale/questionEvaluate')
|
||||
|
||||
let riskName = localStorage.riskName
|
||||
console.log('sale/riskName==', riskName)
|
||||
@@ -347,5 +348,13 @@ export default [
|
||||
meta: {
|
||||
title: '签名页面'
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/sale/questionEvaluate',
|
||||
name: 'questionEvaluate',
|
||||
component: questionEvaluate,
|
||||
meta: {
|
||||
title: '保险产品适当性评估问卷'
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -419,6 +419,18 @@
|
||||
</div>
|
||||
</div>
|
||||
</van-dialog>
|
||||
|
||||
<PopupQuesResult
|
||||
@goBackHandler="goBack"
|
||||
@goNextHandler="goNext"
|
||||
@reStartHandler="reStart"
|
||||
@clickOverlayHandler="clickOverlay"
|
||||
:showResultPopup="showResultPopup"
|
||||
:showHasTested = "showHasTested"
|
||||
:resultRiskType = 'resultRiskType'
|
||||
:appntInfo="saleInsuredInfo"
|
||||
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
@@ -430,6 +442,7 @@ import { getAgentInfo } from '@/api/ebiz/my/my.js'
|
||||
import occupationList from '@/components/ebiz/occipation/data/occupation'
|
||||
import utilsAge from '@/assets/js/utils/age'
|
||||
import riskRules from './risk-rules'
|
||||
import PopupQuesResult from '@/components/common/PopupQuesResult'
|
||||
|
||||
//险种GFRS_M0016的责任的验证规则
|
||||
//默认 最低基本保险金额min 10000 整数倍要求mutiple 1000
|
||||
@@ -572,7 +585,8 @@ export default {
|
||||
[Checkbox.name]: Checkbox,
|
||||
[Dialog.name]: Dialog,
|
||||
[Radio.name]: Radio,
|
||||
[RadioGroup.name]: RadioGroup
|
||||
[RadioGroup.name]: RadioGroup,
|
||||
[PopupQuesResult.name]: PopupQuesResult
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -620,7 +634,20 @@ export default {
|
||||
isCrossChannel: '0', //是否交叉渠道 1-是 0-否
|
||||
trialResultsShow: false, //核保试算结果
|
||||
riskAmntList: [], //累计寿险风险保额(元)、累计重大疾病风险保额(元)、累计意外伤害风险保额(元)、意外住院津贴日额(元)、一般住院津贴日额(元)、特定疾病住院津贴日额(元)
|
||||
verifyResultList: [] //核保试算返回数据结构
|
||||
verifyResultList: [], //核保试算返回数据结构
|
||||
|
||||
showResultPopup:false, //测评弹窗弹窗
|
||||
showHasTested:false, //已经测评过
|
||||
assessFlag:"", //是否需要填写适应性问卷
|
||||
resultRiskType:'', //评估结果
|
||||
/**
|
||||
* 是否需要填写适应性问卷
|
||||
* 0需要填写
|
||||
* 1不需要填写,不满足条件,投保人年龄大于等于60周岁 投保万能险和分红险,无需在线评估
|
||||
* 2不需要填写,超过次数限制弹提示,继续后续投保流程
|
||||
* 3不需要填写,已有有效期的问卷,需展示结论
|
||||
* 5不需要填写,不满足条件,仅需一年期以上产品需要设置此评估问卷,一年期及以下产品无需设置此评估问卷
|
||||
*/
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@@ -733,7 +760,7 @@ export default {
|
||||
// this.cvalidateStr = this.cvalidateFlag?this.activeType == 'KMH'?'2021-01-01':this.activeType == 'SQY'?'2021-06-01':'':''
|
||||
//GFRS-2552【需求】关于金掌桂投保流程增设指定生效日按钮的申请
|
||||
const orderNo = this.$route.query.orderNo
|
||||
let detailPromise = this.isFrom === 'proposal' ? localStorage.proposalMedical : await getOrderDetail({ orderNo })
|
||||
let detailPromise = this.isFrom === 'proposal' ? localStorage.proposalMedical : await getOrderDetail({ orderNo,userAssessLogic:true })
|
||||
let collect = (data, code) => {
|
||||
data.forEach((item) => {
|
||||
if (item.code == code) {
|
||||
@@ -751,6 +778,8 @@ export default {
|
||||
//活动生效日期
|
||||
this.cvalidateStr = detailPromise.orderDTO.orderInfoDTO.cvaliDate
|
||||
this.activeType = detailPromise.orderDTO.orderInfoDTO.activeType
|
||||
this.assessFlag = detailPromise.orderDTO.orderInfoDTO.assessFlag
|
||||
this.resultRiskType = detailPromise.orderDTO.orderInfoDTO.resultRiskType
|
||||
}
|
||||
this.cvalidateFlag = this.activeType && this.isFrom != 'proposal'
|
||||
//构建提交数据、渲染险种
|
||||
@@ -3358,18 +3387,37 @@ export default {
|
||||
} else if (this.$route.query.proposalOrderNo) {
|
||||
thismyurl = '?proposalOrderNo=' + this.$route.query.proposalOrderNo
|
||||
}
|
||||
this.$jump({
|
||||
flag: 'goBack',
|
||||
extra: {
|
||||
refresh: '1',
|
||||
index: '-2'
|
||||
},
|
||||
routerInfo: {
|
||||
type: 2,
|
||||
index: -2,
|
||||
path: '/common/selectedProduct' + thismyurl
|
||||
}
|
||||
})
|
||||
console.log('this.assessFlag',this.assessFlag)
|
||||
if(this.assessFlag === '0'){ //需要填写问卷
|
||||
localStorage.setItem('evalateFrom', 'toEvaluate') //通过该字段确定跳回几层
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
url: location.origin + '/#' + `/sale/questionEvaluate?orderNo=${this.$route.query.orderNo}`
|
||||
},
|
||||
routerInfo: {
|
||||
path:`/sale/questionEvaluate?orderNo=${this.$route.query.orderNo}`
|
||||
}
|
||||
})
|
||||
}else if( this.assessFlag === '2'){ //2.不需要填写,超过次数限制弹提示,继续后续投保流程
|
||||
return this.$toast('已超过评估次数限制,无法重新评估')
|
||||
}else if( this.assessFlag === '3'){ //3.不需要填写,已有有效期的问卷,需展示结论
|
||||
localStorage.setItem('evalateFrom', 'toResult')
|
||||
this.showResultPopup = true
|
||||
this.showHasTested = true
|
||||
}
|
||||
// this.$jump({
|
||||
// flag: 'goBack',
|
||||
// extra: {
|
||||
// refresh: '1',
|
||||
// index: '-2'
|
||||
// },
|
||||
// routerInfo: {
|
||||
// type: 2,
|
||||
// index: -2,
|
||||
// path: '/common/selectedProduct' + thismyurl
|
||||
// }
|
||||
// })
|
||||
} else if (localStorage.isFrom == 'proposal') {
|
||||
let proposalOrderNo = this.$CacheUtils.getLocItem('proposalNo') || ''
|
||||
if (resultData.content.id) {
|
||||
@@ -3452,6 +3500,55 @@ export default {
|
||||
this.$toast.fail('请输入正确的预计转入保费')
|
||||
return false
|
||||
}
|
||||
},
|
||||
|
||||
//关闭测评结果弹窗遮罩层
|
||||
clickOverlay(extra){
|
||||
if(exrta==='overlay')return
|
||||
this.goBack()
|
||||
},
|
||||
|
||||
//上一步
|
||||
goBack(){
|
||||
this.$jump({
|
||||
flag: 'goBack',
|
||||
extra: {
|
||||
refresh: '1',
|
||||
index: '-2'
|
||||
},
|
||||
routerInfo: {
|
||||
type: 2,
|
||||
index: -2,
|
||||
path: '/common/selectedProduct/?orderNo=' + this.$route.query.orderNo
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
//我已知晓,继续投保
|
||||
goNext(){
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
url: location.origin + `/#/common/evaluateResult?orderNo=${this.$route.query.orderNo}`
|
||||
},
|
||||
routerInfo: {
|
||||
path: `/common/evaluateResult?orderNo=${this.$route.query.orderNo}`
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
//重新测评
|
||||
reStart(){
|
||||
this.showResultPopup = false
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
url: location.origin + `/#/sale/questionEvaluate?orderNo=${this.$route.query.orderNo}`
|
||||
},
|
||||
routerInfo: {
|
||||
path: `/sale/questionEvaluate?orderNo=${this.$route.query.orderNo}`
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
||||
198
src/views/ebiz/common/EvaluateResult.vue
Normal file
198
src/views/ebiz/common/EvaluateResult.vue
Normal file
@@ -0,0 +1,198 @@
|
||||
<template>
|
||||
<div class="fit-wrapper">
|
||||
<div v-if="assessResult == '1'" class="fit-container">
|
||||
<img src="@/assets/images/ebiz/refresh.png" alt="">
|
||||
<div class="pt20 pb20 pr10 pl20">
|
||||
<span>{{ evalDesc }}</span>
|
||||
<span class="red fw400">根据以上与适当性问卷匹配结果,我司建议您终止投保,关注该产品的特征及风险,审慎作出投保决策。 如您坚持投保,请您确认和签署《投保风险警示确认书》。</span>
|
||||
</div>
|
||||
<div class="footer-btn bottom-btn bg-white flex">
|
||||
<van-button type="danger" size="large" plain square class="btn" @click="exitProcess" v-no-more-click="1000">终止投保</van-button>
|
||||
<van-button type="danger" size="large" square class="btn" @click="showRisks = true" v-no-more-click="1000">已知晓上述提示,本人仍继续投保</van-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="assessResult === '0'" class="fit-container">
|
||||
<img src="@/assets/images/ebiz/refresh.png" alt="">
|
||||
<div class="pt20 pb20 pr10 pl20">{{evalDesc}}</div>
|
||||
<div class="bottom-btn bg-white flex">
|
||||
<van-button type="danger" size="large" square class="btn" v-no-more-click="1000" @click="onConfirm">确认</van-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<van-dialog
|
||||
v-model="showRisks"
|
||||
title="投保风险警示确认书"
|
||||
confirmButtonText="知晓并同意警示书,继续投保"
|
||||
@confirm="onConfirm"
|
||||
class="riskDialog"
|
||||
>
|
||||
<span>
|
||||
本人声明已了解及完全清楚产品责任、风险情况、保险利益不确定及不及时交纳保险费的风险,经审慎考虑后,仍坚持购买该产品,并愿意承担由此可能产生的损失和其他后果。购买该产品的决定,系本人独立、自主、真实的意思表示。
|
||||
</span>
|
||||
</van-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getOrderDetail, saveEvalateAnswer } from '@/api/ebiz/sale/sale'
|
||||
export default {
|
||||
name: 'EvaluateResult',
|
||||
data(){
|
||||
return {
|
||||
assessResult:null, //适应性问卷评估结果 0通过 1不通过
|
||||
showPopUp:true,
|
||||
showRisks:false,
|
||||
assessResultDescList:[],
|
||||
evalDesc:'',//测评结果描述
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
this.$jump({
|
||||
flag: 'navigation',
|
||||
extra: {
|
||||
title: '评估结果'
|
||||
},
|
||||
})
|
||||
if (localStorage.isFrom == 'sale') {
|
||||
setTimeout(() => {
|
||||
EWebBridge.webCallAppInJs('webview_left_button', {
|
||||
img: this.$assetsUrl + 'images/del-close-btn@3x.png',
|
||||
intercept: '1' //是否拦截原生返回事件 1是 其他否
|
||||
})
|
||||
}, 100)
|
||||
}
|
||||
window.appCallBack = this.appCallBack
|
||||
document.body.style.backgroundColor = '#fff'
|
||||
this.$route.query.assessResult && (this.assessResult = this.$route.query.assessResult)
|
||||
getOrderDetail({ orderNo: this.$route.query.orderNo,userAssessLogic:true }).then(res => {
|
||||
if (res.result == 0) {
|
||||
this.assessResultDescList = res.orderDTO.orderInfoDTO.assessResultDescMap
|
||||
this.assessResult = res.orderDTO.orderInfoDTO.assessResult
|
||||
if(Object.keys(this.assessResultDescList).includes('pass')&&this.assessResult==='0'){
|
||||
this.evalDesc = this.assessResultDescList['pass']
|
||||
}else{
|
||||
this.handlerAssessResultDesc()
|
||||
}
|
||||
console.log('this.assessResultDescList',this.assessResultDescList)
|
||||
} else {
|
||||
this.$toast(res.resultMessage)
|
||||
}
|
||||
})
|
||||
},
|
||||
methods:{
|
||||
|
||||
handlerAssessResultDesc(){
|
||||
// 获取所有以1开头的属性键
|
||||
let numStr = ['1','2','3','4']
|
||||
let evalDesc = ''
|
||||
numStr.forEach(num=>{
|
||||
let keysStartWith = Object.keys(this.assessResultDescList).filter(key => key.startsWith(num));
|
||||
// 获取这些键对应的所有元素值组成的数组
|
||||
let filterValue = keysStartWith.map(key => {
|
||||
return JSON.parse(this.assessResultDescList[key]);
|
||||
});
|
||||
console.log('filterValue',filterValue)
|
||||
if(filterValue.length==1){
|
||||
evalDesc += filterValue[0].join('')
|
||||
}else if(filterValue.length>1){
|
||||
evalDesc += filterValue.map(item => item[0]).join(',') + filterValue[0][1]
|
||||
}else return
|
||||
})
|
||||
this.evalDesc = evalDesc
|
||||
},
|
||||
|
||||
//终止投保
|
||||
exitProcess(){
|
||||
this.$dialog.confirm(
|
||||
{
|
||||
className: 'dialog-delete',
|
||||
title: '提示',
|
||||
message: '退出流程可能会丢失部分数据,是否确认退出?',
|
||||
cancelButtonColor: '#E9332E',
|
||||
confirmButtonColor: '#FFFFFF'
|
||||
})
|
||||
.then(() => {
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
title: '电子投保单列表',
|
||||
forbidSwipeBack: 1, //当前页面禁止右滑返回
|
||||
url: location.origin + `/#/sale/list`
|
||||
},
|
||||
routerInfo: {
|
||||
path: `/sale/list`,
|
||||
type: '1'
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
return
|
||||
})
|
||||
},
|
||||
//继续投保
|
||||
onConfirm(){
|
||||
let index = localStorage.getItem('evalateFrom') == 'toEvaluate' ? '-4' : '-3'
|
||||
console.log('onConfirm')
|
||||
this.$jump({
|
||||
flag: 'goBack',
|
||||
extra: {
|
||||
refresh: '1',
|
||||
index,
|
||||
},
|
||||
routerInfo: {
|
||||
type: 2,
|
||||
index,
|
||||
path: '/common/selectedProduct'+'/?orderNo=' + this.$route.query.orderNo
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.fit-wrapper{
|
||||
width:100%;
|
||||
height:100vh;
|
||||
display:flex;
|
||||
.fit-container{
|
||||
width:100%;
|
||||
display:flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
img{
|
||||
margin-bottom:20px;
|
||||
width:100px;
|
||||
height:100px;
|
||||
}
|
||||
}
|
||||
.footer-btn{
|
||||
position:fixed;
|
||||
bottom:0;
|
||||
width:100%;
|
||||
display:flex;
|
||||
justify-content:space-between;
|
||||
align-items:center;
|
||||
.van-button:first-child{
|
||||
flex:1;
|
||||
}
|
||||
.van-button:last-child{
|
||||
flex:2;
|
||||
}
|
||||
}
|
||||
/deep/ .riskDialog{
|
||||
.van-dialog__header{
|
||||
padding:20px 0;
|
||||
font-size:16px;
|
||||
}
|
||||
.van-dialog__content{
|
||||
padding:0 20px;
|
||||
margin-bottom:10px;
|
||||
font-size:14px;
|
||||
}
|
||||
.van-dialog__confirm{
|
||||
font-size:16px;
|
||||
color:#5ca7de;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
514
src/views/ebiz/sale/questionEvaluate.vue
Normal file
514
src/views/ebiz/sale/questionEvaluate.vue
Normal file
@@ -0,0 +1,514 @@
|
||||
<template>
|
||||
<div class="question-container">
|
||||
<div class="question-header bg-white pt20 pb20 pr10 pl10" >
|
||||
<h5 class="fs14">投保人信息</h5>
|
||||
<div class="fs14">
|
||||
<van-cell-group>
|
||||
<van-field v-model="saleInsuredInfo.name" label="姓名" readonly required/>
|
||||
<van-field v-model="saleInsuredInfo.idType" label="证件类型" readonly required/>
|
||||
<van-field v-model="saleInsuredInfo.idNo" label="证件号码" readonly required/>
|
||||
<van-field v-model="saleInsuredInfo.mobile" label="联系方式" readonly required/>
|
||||
<van-field v-model="saleInsuredInfo.occupationName" label="职业" readonly required/>
|
||||
</van-cell-group>
|
||||
</div>
|
||||
<div class="fs16" >
|
||||
<h5> {{questionInfo.questionHeadDesc}}</h5>
|
||||
<h5>{{questionInfo.question1Desc}}</h5>
|
||||
<h5>{{questionInfo.question2Desc}}</h5>
|
||||
<h5>{{questionInfo.question3Desc}}</h5>
|
||||
<h5>{{questionInfo.questionTailDesc}}</h5>
|
||||
</div>
|
||||
<div class="question-detail">
|
||||
<div v-for="(item,idx) in questionList">
|
||||
<!-- 单选框 -->
|
||||
<div v-if="item.type=='radio'">
|
||||
<p style="margin:2vh 0">{{ item.title }}</p>
|
||||
<van-radio-group class="mb10" v-model="answerList[idx]" @change="handlerRadio($event,item,idx)">
|
||||
<van-radio
|
||||
class="mb5"
|
||||
v-for="(itemRadio,idxRadio) in item.options"
|
||||
:name="itemRadio.option"
|
||||
:key="idxRadio"
|
||||
>{{itemRadio.item}}
|
||||
</van-radio>
|
||||
</van-radio-group>
|
||||
</div>
|
||||
|
||||
<!-- 多选框 -->
|
||||
<div v-if="item.type=='checkbox'">
|
||||
<p style="margin:2vh 0">{{ item.title }}</p>
|
||||
<van-checkbox-group v-model="answerList[idx]" shape="square" @change="handlerCheckbox($event,item,idx)">
|
||||
<van-checkbox
|
||||
class="mb5"
|
||||
v-for="(itemCheckbox,idxCheckbox) in item.options"
|
||||
:name="itemCheckbox.option"
|
||||
:key="idxCheckbox"
|
||||
>
|
||||
|
||||
{{itemCheckbox.item}}
|
||||
<div class="question-detail-checkbox" v-if="showPurpose&&idxCheckbox==1" @click.stop>
|
||||
<p class="c-link mt10 mb10 fs12">除本次投保外,您是否已为被保险人投保过类似损失补偿型保险产品(如百万医疗险等以报销住院费用为保障的产品)且保单目前仍在有效中?</p>
|
||||
<van-radio-group v-model="CheckBoxExtraRadio" class="extraRadio flex pb10 fs10" direction="horizontal" @click.stop>
|
||||
<van-radio
|
||||
:name="part.option"
|
||||
@click.stop v-for="(part,partIdx) in itemCheckbox.parts[0].options"
|
||||
>
|
||||
{{part.item}}
|
||||
</van-radio>
|
||||
</van-radio-group>
|
||||
|
||||
<van-field class="extraInput" label-width="0" v-model="CheckBoxExtraDesc" placeholder="请说明险种名称、保额:" v-if="CheckBoxExtraRadio === 'Y'" @click.stop/>
|
||||
</div>
|
||||
</van-checkbox>
|
||||
</van-checkbox-group>
|
||||
|
||||
</div>
|
||||
<!-- 输入框 -->
|
||||
<div v-if="item.type=='input'" class="mb10">
|
||||
<p class="budget-text">
|
||||
<template v-for="(segment, index) in item.title.split(/\$<input>\$/)" >
|
||||
<!-- 显示文本片段 -->
|
||||
{{ segment }}
|
||||
<!-- 除了最后一个片段外,每个文本片段后都添加输入框 -->
|
||||
<input
|
||||
v-if="index < item.title.split(/\$<input>\$/).length - 1"
|
||||
type="number"
|
||||
@input="handlerInput($event,item,idx,index)"
|
||||
step="0.01"
|
||||
min="0"
|
||||
class="budget-input"
|
||||
>
|
||||
</template>
|
||||
<div class="fs12 c-gray-base">请填写1-10000之间的整数</div>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="question-btn bottom-btn bg-white">
|
||||
<van-button type="danger" size="large" class="bottom-btn" @click="submitAnswer" v-no-more-click="1000">提交</van-button>
|
||||
</div>
|
||||
<PopupQuesResult
|
||||
@reTestHandler="reTest"
|
||||
@toInsureHandler="toInsure"
|
||||
@clickOverlayHandler="clickOverlay"
|
||||
:resultRiskType = "resultRiskType"
|
||||
:showResultPopup="showResultPopup"
|
||||
:showHasTested = "showHasTested"
|
||||
:showNoTested="showNoTested"
|
||||
:appntInfo="saleInsuredInfo"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getOrderDetail, saveEvalateAnswer } from '@/api/ebiz/sale/sale'
|
||||
import PopupQuesResult from '@/components/common/PopupQuesResult'
|
||||
export default {
|
||||
name: 'Question',
|
||||
components: {
|
||||
PopupQuesResult
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
saleInsuredInfo:{},
|
||||
showPurpose:false,
|
||||
showResultPopup:false,
|
||||
showHasTested:false,
|
||||
showNoTested:false,
|
||||
answerList:[],
|
||||
resultRiskType:null,
|
||||
assessResult:null,
|
||||
questionInfo:{},
|
||||
questionList:[],
|
||||
assessQuestionnaireDtoList:[],
|
||||
CheckBoxExtraRadio:'',
|
||||
CheckBoxExtraDesc:'',
|
||||
disabled:true
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
answerList: {
|
||||
handler(newVal) {
|
||||
if(newVal) {
|
||||
console.log('answerList', newVal)
|
||||
if(newVal.length == this.questionList.length){
|
||||
// 检查每一项是否有空值
|
||||
// 使用every方法检查是否所有项都已填写
|
||||
// 问题在于every方法的逻辑反了,应该在有值时返回false(不禁用按钮)
|
||||
// 在没有值时返回true(禁用按钮)
|
||||
this.disabled = !Array.from(newVal).every(item => {
|
||||
console.log('item', item, !item)
|
||||
// 检查每一项是否有值
|
||||
if (!item || (Array.isArray(item) && item.length === 0)) {
|
||||
console.log('进入了', item, !item)
|
||||
return false // 如果没有值,返回false,表示不满足条件
|
||||
}
|
||||
|
||||
// 如果是数组,检查数组中是否所有元素都有值
|
||||
if (Array.isArray(item)) {
|
||||
return item.every(subItem => subItem && subItem.trim() !== '')
|
||||
}
|
||||
|
||||
return true // 有值,返回true,表示满足条件
|
||||
});
|
||||
console.log('disabled', this.disabled);
|
||||
}else{ //如果长度不够,则认为没有填写完整,禁用掉提交按钮
|
||||
this.disabled = false
|
||||
}
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
}
|
||||
},
|
||||
created(){
|
||||
this.init()
|
||||
},
|
||||
mounted(){
|
||||
this.$jump({
|
||||
flag: 'navigation',
|
||||
extra: {
|
||||
title: '保险产品适当性评估问卷'
|
||||
},
|
||||
})
|
||||
localStorage.setItem('evalateFrom', 'toEvaluate')
|
||||
if (localStorage.isFrom == 'sale') {
|
||||
setTimeout(() => {
|
||||
EWebBridge.webCallAppInJs('webview_left_button', {
|
||||
img: this.$assetsUrl + 'images/del-close-btn@3x.png',
|
||||
intercept: '1' //是否拦截原生返回事件 1是 其他否
|
||||
})
|
||||
}, 100)
|
||||
}
|
||||
window.appCallBack = this.appCallBack
|
||||
document.body.style.backgroundColor = '#fff'
|
||||
const orderNo = this.$route.query.orderNo
|
||||
getOrderDetail({ orderNo: this.$route.query.orderNo,userAssessLogic:true }).then(res => {
|
||||
if (res.result == 0) {
|
||||
this.questionInfo = res.orderDTO.orderInfoDTO.assessQuestionnaireDto
|
||||
this.questionList = res.orderDTO.orderInfoDTO.assessQuestionnaireDto.questionList
|
||||
} else {
|
||||
this.$toast(res.resultMessage)
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
appCallBack(data) {
|
||||
if (data.trigger == 'left_button_click' && localStorage.isFrom == 'sale') {
|
||||
return this.$dialog
|
||||
.confirm({
|
||||
className: 'dialog-delete',
|
||||
title: '提示',
|
||||
message: '退出流程可能会丢失部分数据,是否确认退出?',
|
||||
cancelButtonColor: '#E9332E',
|
||||
confirmButtonColor: '#FFFFFF'
|
||||
})
|
||||
.then(() => {
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
title: '电子投保单列表',
|
||||
forbidSwipeBack: 1, //当前页面禁止右滑返回
|
||||
url: location.origin + `/#/sale/list`
|
||||
},
|
||||
routerInfo: {
|
||||
path: `/sale/list`,
|
||||
type: '1'
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
return
|
||||
})
|
||||
}else if (data.trigger == 'right_button_click' && localStorage.isFrom == 'proposal') {
|
||||
return this.$dialog
|
||||
.confirm({
|
||||
className: 'dialog-delete',
|
||||
title: '提示',
|
||||
message: '退出流程可能会丢失部分数据,是否确认退出?',
|
||||
cancelButtonColor: '#E9332E',
|
||||
confirmButtonColor: '#FFFFFF'
|
||||
})
|
||||
.then(() => {
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
title: '建议书列表',
|
||||
forbidSwipeBack: 1, //当前页面禁止右滑返回
|
||||
url: location.origin + `/#/proposal/list`
|
||||
},
|
||||
routerInfo: {
|
||||
path: `/proposal/list`,
|
||||
type: '1'
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
return
|
||||
})
|
||||
}
|
||||
},
|
||||
//单选框处理数据
|
||||
handlerRadio(e,item, idx) {
|
||||
console.log('单选框选择',e,item,idx)
|
||||
this.$set(this.assessQuestionnaireDtoList,idx,{
|
||||
orderNo:this.$route.query.orderNo,
|
||||
questionNo:item.questionNo,
|
||||
questionContent:item.title,
|
||||
choose:e,
|
||||
chooseContent:this.filterRadioElement('content',e,item),
|
||||
subOption:null,
|
||||
subOptionContent:null,
|
||||
score:this.filterRadioElement('score',e,item),
|
||||
chooseDesc:null,
|
||||
})
|
||||
// this.assessQuestionnaireDtoList[idx]={
|
||||
// orderNo:this.$route.query.orderNo,
|
||||
// questionNo:item.questionNo,
|
||||
// questionContent:item.title,
|
||||
// choose:e,
|
||||
// chooseContent:this.filterRadioElement('content',e,item),
|
||||
// subOption:null,
|
||||
// subOptionContent:null,
|
||||
// score:this.filterRadioElement('score',e,item),
|
||||
// chooseDesc:null,
|
||||
// }
|
||||
console.log('answerList',this.answerList)
|
||||
console.log('this.assessQuestionnaireDtoList',this.assessQuestionnaireDtoList)
|
||||
},
|
||||
|
||||
//单选框筛选出分数和每项
|
||||
filterRadioElement(el,e,item){
|
||||
if(el=='content'){
|
||||
return item.options.find(item=>item.option==e).item.substring(2)
|
||||
}else if(el=='score'){
|
||||
return parseInt(item.options.find(item=>item.option==e).score)
|
||||
}
|
||||
},
|
||||
|
||||
//输入框处理组装数据
|
||||
handlerInput(e,item,idx,index){
|
||||
if(!Array.from(this.answerList)[idx] || this.answerList[idx].length==0){
|
||||
this.answerList[idx] = []
|
||||
}
|
||||
let chooseDesc = ''
|
||||
if(idx== 3){
|
||||
if(index==0){
|
||||
this.$set(this.answerList[idx], 0, e.target.value)
|
||||
}else{
|
||||
this.$set(this.answerList[idx], 1, e.target.value)
|
||||
}
|
||||
chooseDesc = this.answerList[idx].join(',')
|
||||
}else if(idx== 4){
|
||||
this.$set(this.answerList[idx], 0, e.target.value)
|
||||
chooseDesc=this.answerList[idx][0]
|
||||
}
|
||||
this.$set(this.assessQuestionnaireDtoList,idx,{
|
||||
orderNo:this.$route.query.orderNo,
|
||||
questionNo:item.questionNo,
|
||||
questionContent:item.title,
|
||||
choose:null,
|
||||
chooseContent:null,
|
||||
subOption:null,
|
||||
subOptionContent:null,
|
||||
score:null,
|
||||
chooseDesc,
|
||||
})
|
||||
//this.$set(this.answerList,idx,e.target.value)
|
||||
// this.assessQuestionnaireDtoList[idx]={
|
||||
// orderNo:this.$route.query.orderNo,
|
||||
// questionNo:item.questionNo,
|
||||
// questionContent:item.title,
|
||||
// choose:null,
|
||||
// chooseContent:null,
|
||||
// subOption:null,
|
||||
// subOptionContent:null,
|
||||
// score:null,
|
||||
// chooseDesc,
|
||||
// }
|
||||
console.log('输入框',e,item,idx,index)
|
||||
console.log('answerList',this.answerList)
|
||||
console.log('this.assessQuestionnaireDtoList',this.assessQuestionnaireDtoList)
|
||||
},
|
||||
|
||||
handlerCheckbox(e,item, idx) {
|
||||
if(e.includes('B')){
|
||||
this.showPurpose = true
|
||||
}else{
|
||||
this.showPurpose = false
|
||||
}
|
||||
console.log('多选框选择:', e,item, idx,this.answerList[idx])
|
||||
this.$set(this.assessQuestionnaireDtoList,idx,{
|
||||
orderNo:this.$route.query.orderNo,
|
||||
questionNo:item.questionNo,
|
||||
questionContent:item.title,
|
||||
choose:this.filterCheckBoxElement('letter',e,item),
|
||||
chooseContent:this.filterCheckBoxElement('content',e,item),
|
||||
subOption:e.includes('B')?this.CheckBoxExtraRadio:null,
|
||||
subOptionContent:this.CheckBoxExtraRadio=="Y"?this.CheckBoxExtraDesc:null,
|
||||
score:this.filterCheckBoxElement('score',e,item),
|
||||
chooseDesc:null,
|
||||
})
|
||||
// this.assessQuestionnaireDtoList[idx]={
|
||||
// orderNo:this.$route.query.orderNo,
|
||||
// questionNo:item.questionNo,
|
||||
// questionContent:item.title,
|
||||
// choose:this.filterCheckBoxElement('letter',e,item),
|
||||
// chooseContent:this.filterCheckBoxElement('content',e,item),
|
||||
// subOption:e.includes('B')?this.CheckBoxExtraRadio:null,
|
||||
// subOptionContent:this.CheckBoxExtraRadio=="Y"?this.CheckBoxExtraDesc:null,
|
||||
// score:this.filterCheckBoxElement('score',e,item),
|
||||
// chooseDesc:null,
|
||||
// }
|
||||
console.log('answerList',this.answerList)
|
||||
console.log('this.assessQuestionnaireDtoList',this.assessQuestionnaireDtoList)
|
||||
},
|
||||
filterCheckBoxElement(el,e,item){
|
||||
let filterEl = item.options.filter(cur=>e.includes(cur.option))
|
||||
console.log('filterEl',filterEl)
|
||||
if(el=='letter'){
|
||||
let letter = filterEl.map(item=>item.option).join(',')
|
||||
//let letter = filterEl.reduce((total,value)=>total+value.option,',')
|
||||
console.log('letter',letter)
|
||||
return letter
|
||||
}else if(el=='content'){
|
||||
let content = filterEl.map(value=>value.item.substring(2)).join(';')
|
||||
//let content = filterEl.reduce((total,value)=>total+value.item+';','').substring(2)
|
||||
console.log('content',content)
|
||||
return content
|
||||
//this.answerList[idx]
|
||||
}else{
|
||||
let score = filterEl.reduce((total,value)=>total+parseInt(value.score),0)
|
||||
console.log('score',score)
|
||||
return score
|
||||
}
|
||||
},
|
||||
init(){
|
||||
console.log('1231')
|
||||
if (this.$CacheUtils.getLocItem('saleInsuredInfo')) {
|
||||
this.saleInsuredInfo = JSON.parse(this.$CacheUtils.getLocItem('saleInsuredInfo'))
|
||||
console.log('this.saleInsuredInfo',this.saleInsuredInfo)
|
||||
}
|
||||
},
|
||||
validatePositiveInteger(value) {
|
||||
const regex = /^(?:[1-9]\d{0,3}|[1-9]\d{0,3}(?:,\d{3})*)$/;
|
||||
return regex.test(value) && value <= 10000;
|
||||
},
|
||||
|
||||
clickOverlay(){
|
||||
this.showResultPopup = false
|
||||
},
|
||||
submitAnswer(){
|
||||
if(this.answerList.length !=this.questionList.length){
|
||||
return this.$toast('请填写完整信息')
|
||||
|
||||
}else{
|
||||
if(Array.from(this.answerList).some(item=>!item)){
|
||||
return this.$toast('请填写完整信息')
|
||||
}else{
|
||||
if(Array.from(this.answerList[3]).length!=2||(Array.from(this.answerList[3]).some(item=>!item))){
|
||||
return this.$toast('请填写完整信息')
|
||||
}else if(Array.from(this.answerList[1]).includes('B')&&(!this.CheckBoxExtraRadio||this.CheckBoxExtraRadio=="Y"&&!this.CheckBoxExtraDesc))
|
||||
{
|
||||
return this.$toast('请填写完整信息')
|
||||
}
|
||||
}
|
||||
}
|
||||
let regex = /^([1-9]\d{0,3}|10000)$/;
|
||||
if(Array.from(this.answerList[3]).some(item=>{return !regex.test(item)})
|
||||
|| !regex.test(this.answerList[4][0])){
|
||||
return this.$toast('请填写1-10000之间的整数')
|
||||
}
|
||||
this.getEvaluateResult()
|
||||
},
|
||||
|
||||
//调用后端接口获取测评结果
|
||||
getEvaluateResult(){
|
||||
this.$toast.loading({
|
||||
duration: 0, // 持续展示 toast
|
||||
forbidClick: true, // 禁用背景点击
|
||||
loadingType: 'spinner',
|
||||
message: '加载中……'
|
||||
})
|
||||
this.$toast.clear()
|
||||
saveEvalateAnswer({assessQuestionnaireDtoList:this.assessQuestionnaireDtoList})
|
||||
.then(res =>{
|
||||
this.$toast.clear()
|
||||
if(res.result== '0'){
|
||||
this.resultRiskType = res.content
|
||||
this.showResultPopup = true
|
||||
this.showNoTested = true
|
||||
}else{
|
||||
this.$toast(res.resultMessage)
|
||||
}
|
||||
}).catch(err =>{
|
||||
this.$toast.clear()
|
||||
console.log('err',err)
|
||||
})
|
||||
|
||||
},
|
||||
//未测评过,测评成功后重新测评
|
||||
reTest(){
|
||||
console.log('重新测评')
|
||||
window.location.reload()
|
||||
},
|
||||
|
||||
//继续投保,跳转至评估结果页
|
||||
toInsure(){
|
||||
this.showResultPopup = false
|
||||
this.$jump({
|
||||
flag: 'h5',
|
||||
extra: {
|
||||
url: location.origin +`/#/common/evaluateResult?orderNo=${this.$route.query.orderNo}`
|
||||
},
|
||||
routerInfo: {
|
||||
path: `/common/evaluateResult?orderNo=${this.$route.query.orderNo}`
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.question-container {
|
||||
width: 100%;
|
||||
padding-bottom:50px;
|
||||
/deep/.question-detail{
|
||||
margin-top:10px;
|
||||
.van-checkbox{
|
||||
align-items: flex-start;
|
||||
}
|
||||
// .question-detail-checkbox{
|
||||
// padding: 10px;
|
||||
// }
|
||||
}
|
||||
.question-header{
|
||||
// height:calc(100vh - 40px);
|
||||
//padding-bottom:20px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.question-btn{
|
||||
height:50px;
|
||||
}
|
||||
|
||||
/deep/ .extraRadio{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
/deep/ .extraInput{
|
||||
padding-left: 0;
|
||||
margin-bottom:10px;
|
||||
}
|
||||
.budget-text{
|
||||
input{
|
||||
width:100px;
|
||||
height:20px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
Reference in New Issue
Block a user