【FEAT】新增问卷测评部分逻辑

(cherry picked from commit eb15794b9a)
This commit is contained in:
勾通
2025-10-13 09:34:55 +08:00
parent 0ded892703
commit 958c8f8b01
8 changed files with 1020 additions and 17 deletions

View File

@@ -411,4 +411,12 @@ export function riskLevelCheck(data) {
method: 'post',
data
})
}
}
export function saveEvalateAnswer(data) {
return request({
url: getUrl('/sale/order/saveOrUpdateAssessInfo ', 1),
method: 'post',
data
})
}

View 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>

View File

@@ -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

View File

@@ -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
}
}
]

View File

@@ -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: '保险产品适当性评估问卷'
}
}
]

View File

@@ -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: {

View 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>

View 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>