提交代码

This commit is contained in:
Superdandan 2024-09-07 23:37:14 +08:00
parent ee23da58dd
commit 2d3036ca6c
3 changed files with 121 additions and 31 deletions

View File

@ -6,7 +6,7 @@
<GradleProjectSettings>
<option name="distributionType" value="LOCAL" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="C:/develop/gradle-8.8" />
<option name="gradleHome" value="$PROJECT_DIR$/../../develop/gradle-8.5-bin/gradle-8.5" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />

View File

@ -1,13 +1,128 @@
package org.echo.questionnaire
import kotlin.math.abs
class Questionnaire(
val title: String, // 问卷的标题
val description: String, // 问卷的描述或说明
val questions: List<SurveyQuestion>, // 问卷中的所有问题
val surveySample: SurveySample //调查样本的背景信息
val questions: List<SurveyQuestion>,
val sample: SurveyBackgroundSample// 问卷中的所有问题
)
open class Question(
val questionId: String,
val title: String,
val content: String,
val optionList: List<QuestionOption>,
val questionType: QuestionType, // 表示问题类型:单选、多选、开放式等
val order: Int, // 表示问题顺序
val isRequired: Boolean = true // 是否必答,默认为必答
) {
fun getOptionList(): List<QuestionOption> {
return optionList
}
}
class QuestionGroup(
val groupName: String,
val surveyQuestionList: List<SurveyQuestion>,
var answeredQuestions: MutableMap<SurveyQuestion, QuestionOption> = mutableMapOf() // 已回答的问题及其分数
) {
// 当组内的问题被回答时,更新其他问题的依赖关系
fun updateDependenciesOnAnswer(answeredQuestion: SurveyQuestion, selectedOption: QuestionOption) {
// 将已回答的问题和选项添加到记录中
answeredQuestions[answeredQuestion] = selectedOption
// 遍历组内未回答的问题,并为每个未回答问题的选项更新依赖关系
surveyQuestionList
.filter { it != answeredQuestion && !answeredQuestions.containsKey(it) } // 过滤未回答的问题
.flatMap { it.getQuestion().getOptionList() } // 将每个问题的选项展开成一个列表
.forEach { option ->
// 创建一个新的 OptionDependency根据已回答的选项影响当前选项
val dependency = OptionDependency(
sourceOption = selectedOption,
targetOption = option,
condition = { _ ->
// 定义条件sourceOption 和 targetOption 必须同一问题组,且影响关系基于 markOrder 差值
true
},
effect = { targetOpt ->
val orderDifference = abs(selectedOption.markOrder - targetOpt.markOrder)
when (orderDifference) {
0 -> 1.0 // 相同 markOrder权重最大
1 -> 0.7 // 相邻 markOrder权重较高
2 -> 0.4 // 相差2权重中等
else -> 0.1 // 更远的,权重最低
}
}
)
// 将新的依赖关系添加到选项的 dependencies 列表中
option.dependencies += dependency
}
}
}
class QuestionOption(
val label: String,
val content: String,
val mark: String,
val markOrder: Int,
val score: Int? = null, // 可选的分数字段
var dependencies: MutableList<OptionDependency> = mutableListOf() // 与其他选项的依赖关系
) {
// 计算依赖关系对权重的影响
fun calculateWeightWithDependencies(): Double {
var baseWeight = 1.0 // 基础权重
dependencies.forEach { dependency ->
if (dependency.condition(dependency.sourceOption)) {
baseWeight += dependency.effect(dependency.sourceOption)
}
}
return baseWeight.coerceAtLeast(0.0) // 确保权重不小于0
}
}
class OptionDependency(
val sourceOption: QuestionOption, // 依赖的来源选项
val targetOption: QuestionOption, // 目标选项,受影响的选项
val condition: (QuestionOption) -> Boolean, // 判断条件,当 sourceOption 满足某个条件时影响 targetOption
val effect: (QuestionOption) -> Double // 定义当条件满足时对目标选项的权重影响
)
enum class QuestionType {
SINGLE_CHOICE, // 单选
MULTIPLE_CHOICE, // 多选
OPEN_ENDED // 开放式问题
}
enum class Gender {
MALE, FEMALE
}
class SurveyQuestion(
val title: String,
val content: String,
val question: Question,
) {
fun getQuestion(): Question {
return this.question
}
}
class SurveyBackgroundSample(
val surveyRespondent: SurveyRespondent,
val surveyBackgroundList: List<SurveyBackground>
)
class SurveyRespondent(
val name: String,
val age: Int,
val gender: Gender
)
class SurveyBackground(
val title: String,
val backgroundQuestion: Question
)

View File

@ -1,25 +0,0 @@
package org.echo.questionnaire
class SurveySample(val surveyBackgroundSet: Set<SurveyBackgroundOption>) {
}
class SurveySampleBackground(
//关联的背景选题
val surveyBackground: SurveyBackground,
//选项
val chooseOption: SurveyBackgroundOption
)
class SurveyBackground(
val backgroundFactor: String,
val option: Set<SurveyBackgroundOption> = mutableSetOf()
) {
}
class SurveyBackgroundOption(
val optionName: String,
val optionMark: String,
val optionDes: String
)