94 lines
3.0 KiB
Vue
94 lines
3.0 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="h-full flex flex-col">
|
|||
|
|
<view class="flex-shrink-0 px-10 pt-5 text-base font-semibold text-center truncate">{{ surery.name }}</view>
|
|||
|
|
<view v-if="surery.description"
|
|||
|
|
class="flex-shrink-0 px-10 mt-10 text-sm leading-normal text-gray line-clamp-2 text-center">
|
|||
|
|
{{ surery.description }}
|
|||
|
|
</view>
|
|||
|
|
<view class="flex items-center text-gray text-sm px-10 mt-10">
|
|||
|
|
<view v-if="surery.enableScore">
|
|||
|
|
当前得分:<text class="text-primary text-base font-semibold min-w-5 inline-block">{{ allScore }}
|
|||
|
|
</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="ml-auto">
|
|||
|
|
客户:<text class="text-black text-base font-semibold min-w-5 inline-block">{{ customerName }} </text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="flex-grow relative">
|
|||
|
|
<scroll-view :scroll-y="true" class="absolute inset-0">
|
|||
|
|
<view v-for="(quesiton, index) in list" :key="quesiton.id">
|
|||
|
|
<view v-if="quesiton" class="my-4 text-base px-10 leading-normal">
|
|||
|
|
<text v-if="quesiton.require" class="text-base text-red-500">*</text> {{ index + 1 }}、{{ quesiton.title }}
|
|||
|
|
</view>
|
|||
|
|
<view class="px-10">
|
|||
|
|
<template v-if="quesiton.type === 'radio'">
|
|||
|
|
<view v-for="(opt, idx) in quesiton.options" :key="opt.value" class="flex py-15 border-b"
|
|||
|
|
:class="idx === 0 ? 'border-t' : ''">
|
|||
|
|
<view class="flex-grow pl-4 text-gray leading-normal"
|
|||
|
|
:class="quesiton.value && quesiton.value === opt.value ? 'text-primary' : ''">
|
|||
|
|
{{ opt.label }}
|
|||
|
|
<text v-if="surery.enableScore && opt.score >= 0">
|
|||
|
|
( {{ opt.score }}分)
|
|||
|
|
</text>
|
|||
|
|
</view>
|
|||
|
|
<uni-icons v-if="quesiton.value && quesiton.value === opt.value" class="ml-1 text-primary flex-shrink-0"
|
|||
|
|
color=" " type="checkbox-filled" size="24"></uni-icons>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
<view v-else-if="quesiton.type === 'input'"
|
|||
|
|
class="my-4 p-10 text-base leading-normal border rounded">
|
|||
|
|
{{ quesiton.value || '' }}
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</scroll-view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
<script>
|
|||
|
|
export default {
|
|||
|
|
name: 'Question',
|
|||
|
|
props: {
|
|||
|
|
customerName: { type: String, default: '' },
|
|||
|
|
list: { type: Array, default: () => ([]) },
|
|||
|
|
surery: { type: Object, default: () => ({}) }
|
|||
|
|
},
|
|||
|
|
computed: {
|
|||
|
|
allScore() {
|
|||
|
|
return this.list.reduce((score, item) => {
|
|||
|
|
if (item.type === 'radio') {
|
|||
|
|
const opt = item.options.find(i => i.value && i.value === item.value && item.value)
|
|||
|
|
if (opt && opt.score >= 0) {
|
|||
|
|
score = Math.floor(score * 100 + opt.score * 100) / 100
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return score
|
|||
|
|
}, 0)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.min-w-5 {
|
|||
|
|
min-width: 40rpx
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.pt-5 {
|
|||
|
|
padding-top: 40rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.my-4 {
|
|||
|
|
margin-top: 32rpx;
|
|||
|
|
margin-bottom: 32rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.border-t {
|
|||
|
|
border-top: 1px solid #eee;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.pl-4 {
|
|||
|
|
padding-left: 30rpx;
|
|||
|
|
}
|
|||
|
|
</style>
|