Commit 6087962d by zhangxingmin

Update .gitignore and stop tracking ignored files

parent a3b8af65
### 通用开发环境 ###
# IDE 配置
.idea/
.vscode/
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# 编辑器临时文件
*~
~$*
*.tmp
*.bak
*.swp
### 操作系统文件 ###
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
.Spotlight-V100
.Trashes
# Windows
Thumbs.db
ehthumbs.db
[Dd]esktop.ini
$RECYCLE.BIN/
# Linux
.directory
.trash-*
### 编程语言相关 ###
# Java
*.class
*.jar
*.war
*.ear
*.log
target/
build/
out/
bin/
# Python
__pycache__/
*.pyc
*.pyo
*.pyd
*.pyc
env/
venv/
.python-version
# Node.js
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnp/
.pnp.js
# C/C++
*.o
*.ko
*.obj
*.exe
*.dll
*.so
*.dylib
# Rust
/target/
**/*.rs.bk
### 构建系统 ###
# Maven
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
# Gradle
.gradle/
build/
!gradle/wrapper/gradle-wrapper.jar
# Android
*.apk
*.ap_
*.dex
*.class
gen/
bin/
### 日志文件 ###
*.log
logs/
*.logs
### 测试文件 ###
coverage/
.nyc_output/
test-results/
### 系统文件 ###
*.cab
*.msi
*.msix
*.msm
*.msp
### 文档文件 ###
*.pdf
*.doc
*.docx
*.xls
*.xlsx
*.ppt
*.pptx
### 压缩文件 ###
*.zip
*.tar.gz
*.7z
*.rar
*.gz
### 自定义规则 ###
# 项目特定文件
.env
config.local.yml
secrets.ini
# 临时文件
temp/
tmp/
dump.rdb
# 大文件
*.large
*.h5
*.dat
# 排除特定文件
**/pom.properties
**/inputFiles.lst
**/createdFiles.lst
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../:\soft\ideaproject\v2\yd-question\.idea/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="yd-question-service" />
<module name="yd-question-feign" />
<module name="yd-question-api" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/yd-question-api/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-question-api/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-question-feign/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-question-feign/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-question-service/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-question-service/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="yd-releases" />
<option name="name" value="yd-releases" />
<option name="url" value="http://139.224.145.34:8081/repository/yd-maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="http://139.224.145.34:8081/repository/yd-maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="yd-snapshots" />
<option name="name" value="yd-snapshots" />
<option name="url" value="http://139.224.145.34:8081/repository/yd-maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
package com.yd.question.api.controller;
import com.yd.common.result.Result;
import com.yd.question.api.service.ApiQuestionnairesService;
import com.yd.question.feign.client.ApiQuestionnairesFeignClient;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.response.ApiAnswerSaveResponse;
import com.yd.question.feign.response.ApiQuestionnairesDetailResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 问卷信息
*
* @author zxm
* @since 2025-09-12
*/
@RestController
@RequestMapping("/questionnaires")
@Validated
public class ApiQuestionnairesController implements ApiQuestionnairesFeignClient {
@Autowired
private ApiQuestionnairesService apiQuestionnairesService;
/**
* 获取问卷详细信息-单个问卷详细详细
* @param questionnaireBizId 问卷唯一业务ID
* @param objectBizId 对象业务ID
* @return
*/
@Override
public Result<ApiQuestionnairesDetailResponse> detail(String questionnaireBizId, String objectBizId) {
return apiQuestionnairesService.detail(questionnaireBizId,objectBizId);
}
/**
* 问卷-答题提交接口
* @return
*/
@Override
public Result<ApiAnswerSaveResponse> answerSave(ApiAnswerSaveRequest request) {
return apiQuestionnairesService.answerSave(request);
}
}
......@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 问题表 前端控制器
* 问题分组表 前端控制器
* </p>
*
* @author zxm
......
......@@ -5,14 +5,14 @@ import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 问卷表 前端控制器
* 选项和附加问题关联表 前端控制器
* </p>
*
* @author zxm
* @since 2025-09-12
* @since 2025-09-16
*/
@RestController
@RequestMapping("/questionnaires")
public class QuestionnairesController {
@RequestMapping("/relOptionsAddQuestions")
public class RelOptionsAddQuestionsController {
}
......@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 问问题关联表 前端控制器
* 问题分组和问题关联表 前端控制器
* </p>
*
* @author zxm
......
package com.yd.question.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 问题选项关联表 前端控制器
* </p>
*
* @author zxm
* @since 2025-09-16
*/
@RestController
@RequestMapping("/relQuestionsOptions")
public class RelQuestionsOptionsController {
}
package com.yd.question.api.service;
import com.yd.common.result.Result;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.response.ApiAnswerSaveResponse;
import com.yd.question.feign.response.ApiQuestionnairesDetailResponse;
public interface ApiQuestionnairesService {
Result<ApiQuestionnairesDetailResponse> detail(String questionnaireBizId, String objectBizId);
Result<ApiAnswerSaveResponse> answerSave(ApiAnswerSaveRequest request);
}
package com.yd.question.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.question.api.service.ApiQuestionnairesService;
import com.yd.question.feign.dto.*;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.response.ApiAnswerSaveResponse;
import com.yd.question.feign.response.ApiQuestionnairesDetailResponse;
import com.yd.question.service.dto.AnswerSessionsDto;
import com.yd.question.service.dto.RelObjectQuestionnaireDto;
import com.yd.question.service.model.*;
import com.yd.question.service.service.*;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiQuestionnairesServiceImpl implements ApiQuestionnairesService {
@Autowired
private IQuestionnairesService iQuestionnairesService;
@Autowired
private IRelObjectQuestionnaireService iRelObjectQuestionnaireService;
@Autowired
private IOptionsService iOptionsService;
@Autowired
private IRelQuestionsOptionsService iRelQuestionsOptionsService;
@Autowired
private IRelOptionsAddQuestionsService iRelOptionsAddQuestionsService;
@Autowired
private IAddQuestionsService iAddQuestionsService;
@Autowired
private IAnswerSessionsService iAnswerSessionsService;
/**
* 获取问卷详细信息-单个问卷详细详细
* @param questionnaireBizId 问卷唯一业务ID
* @param objectBizId 对象业务ID
* @return
*/
@Override
public Result<ApiQuestionnairesDetailResponse> detail(String questionnaireBizId, String objectBizId) {
List<RelObjectQuestionnaire> list = iRelObjectQuestionnaireService.queryList(RelObjectQuestionnaireDto.builder()
.objectBizId(objectBizId)
.build());
if (CollectionUtils.isEmpty(list)) {
throw new BusinessException("对象问卷关系不存在");
}
RelObjectQuestionnaire relObjectQuestionnaire = list.get(0);
questionnaireBizId = relObjectQuestionnaire.getQuestionnaireBizId();
//校验问卷信息是否存在
Result<Questionnaires> result = checkQuestionnairesIsExist(questionnaireBizId);
Questionnaires questionnaires = result.getData();
ApiQuestionnairesDetailResponse response = new ApiQuestionnairesDetailResponse();
//问卷基础信息
ApiQuestionnairesDto questionnairesDto = new ApiQuestionnairesDto();
BeanUtils.copyProperties(questionnaires,questionnairesDto);
response.setQuestionnairesDto(questionnairesDto);
//一二级分类分组的问题列表信息
//根据问卷业务id查询:问卷问题关联表、分组问题关联表、问题表。三张表关联数据
List<ApiRelQuestionsGroupDto> relList = iQuestionnairesService.relList(questionnaireBizId);
//根据问卷绑定的问题列表的分类情况展示对应不同的分层结构
response = selectList(response,relList,questionnaireBizId,objectBizId);
return Result.success(response);
}
/**
* 根据问卷绑定的问题列表的分类情况展示对应不同的分层结构
* @param relList
* @param questionnaireBizId
* @param objectBizId
* @return
*/
public ApiQuestionnairesDetailResponse selectList(
ApiQuestionnairesDetailResponse response,
List<ApiRelQuestionsGroupDto> relList,
String questionnaireBizId,
String objectBizId) {
if (!CollectionUtils.isEmpty(relList)){
//第一级分类并且第二级分类都不能为空的列表size必须和relList一样
List<ApiRelQuestionsGroupDto> filterList = relList.stream().filter(d -> StringUtil.isNotBlank(d.getFirstCategory())
&& StringUtil.isNotBlank(d.getSecondCategory())).collect(Collectors.toList());
if (filterList.size() == relList.size()) {
//一二级分类分组的问题列表信息
List<ApiFirstAndSecondCategoryDto> firstAndSecondCategoryDtoList = getApiFirstAndSecondCategoryDtoList(relList,questionnaireBizId,objectBizId);
response.setFirstAndSecondCategoryDtoList(firstAndSecondCategoryDtoList);
return response;
}
//第一级分类不为空并且第二级分类为空的列表size必须和relList一样
List<ApiRelQuestionsGroupDto> filterList1 = relList.stream().filter(d -> StringUtil.isNotBlank(d.getFirstCategory())
&& StringUtil.isBlank(d.getSecondCategory())).collect(Collectors.toList());
if (filterList1.size() == relList.size()) {
//一级分类分组的问题列表信息
List<ApiFirstCategoryDto> firstCategoryDtoList = getFirstCategoryDtoList(relList,questionnaireBizId,objectBizId);
response.setFirstCategoryDtoList(firstCategoryDtoList);
return response;
}
//第一级分类并且第二级分类都为空的列表size必须和relList一样
List<ApiRelQuestionsGroupDto> filterList2 = relList.stream().filter(d -> StringUtil.isNotBlank(d.getFirstCategory())
&& StringUtil.isBlank(d.getSecondCategory())).collect(Collectors.toList());
if (filterList2.size() == relList.size()) {
//一级分类分组的问题列表信息
List<ApiQuestionsDto> apiQuestionsDtoList = questionsDtoList(relList,questionnaireBizId,objectBizId);
response.setQuestionsDtoList(apiQuestionsDtoList);
return response;
}
}
return response;
}
/**
* 一级分类分组的问题列表信息
* @param relList
* @param questionnaireBizId
* @param objectBizId
* @return
*/
public List<ApiFirstCategoryDto> getFirstCategoryDtoList(List<ApiRelQuestionsGroupDto> relList,
String questionnaireBizId,
String objectBizId) {
//进行多级分组并转换为目标结构
List<ApiFirstCategoryDto> firstCategoryDtoList = relList.stream()
// 过滤掉firstCategory为null的记录
.filter(dto -> dto.getFirstCategory() != null)
// 按一级分类分组
.collect(Collectors.groupingBy(
ApiRelQuestionsGroupDto::getFirstCategory,
Collectors.toList()
))
.entrySet().stream()
.map(entry -> {
// 创建一级分类DTO
ApiFirstCategoryDto firstCategoryDto = new ApiFirstCategoryDto();
firstCategoryDto.setFirstCategory(entry.getKey());
// 设置问题列表
List<ApiRelQuestionsGroupDto> questionsDtoList = entry.getValue();
if (!CollectionUtils.isEmpty(questionsDtoList)) {
//设置问题列表
firstCategoryDto.setQuestionsDtoList(questionsDtoList(questionsDtoList,questionnaireBizId,objectBizId));
}
return firstCategoryDto;
})
.collect(Collectors.toList());
return firstCategoryDtoList;
}
/**
* 一二级分类分组的问题列表信息
* @param relList 根据问卷业务id查询:问卷问题关联表、分组问题关联表、问题表。三张表关联数据
* @param questionnaireBizId
* @param objectBizId
* @return
*/
public List<ApiFirstAndSecondCategoryDto> getApiFirstAndSecondCategoryDtoList(List<ApiRelQuestionsGroupDto> relList,
String questionnaireBizId,
String objectBizId) {
//进行多级分组并转换为目标结构
List<ApiFirstAndSecondCategoryDto> firstAndSecondCategoryDtoList = relList.stream()
// 过滤掉firstCategory为null的记录
.filter(dto -> dto.getFirstCategory() != null)
// 按一级分类分组
.collect(Collectors.groupingBy(
ApiRelQuestionsGroupDto::getFirstCategory,
Collectors.toList()
))
.entrySet().stream()
.map(entry -> {
// 创建一级分类DTO
ApiFirstAndSecondCategoryDto firstCategoryDto = new ApiFirstAndSecondCategoryDto();
firstCategoryDto.setFirstCategory(entry.getKey());
// 对当前一级分类下的数据进行二级分类分组
Map<String, List<ApiRelQuestionsGroupDto>> secondCategoryMap = entry.getValue().stream()
// 过滤掉secondCategory为null的记录
.filter(dto -> dto.getSecondCategory() != null)
.collect(Collectors.groupingBy(ApiRelQuestionsGroupDto::getSecondCategory));
// 转换为二级分类DTO列表
List<ApiSecondCategoryDto> secondCategoryDtoList = secondCategoryMap.entrySet().stream()
.map(secondEntry -> {
ApiSecondCategoryDto secondCategoryDto = new ApiSecondCategoryDto();
secondCategoryDto.setSecondCategory(secondEntry.getKey());
// 设置问题列表
List<ApiRelQuestionsGroupDto> questionsDtoList = secondEntry.getValue();
if (!CollectionUtils.isEmpty(questionsDtoList)) {
//设置问题列表
secondCategoryDto.setQuestionsDtoList(questionsDtoList(questionsDtoList,questionnaireBizId,objectBizId));
}
return secondCategoryDto;
})
.collect(Collectors.toList());
// 设置二级分类列表到一级分类DTO
firstCategoryDto.setSecondCategoryDtoList(secondCategoryDtoList);
return firstCategoryDto;
})
.collect(Collectors.toList());
return firstAndSecondCategoryDtoList;
}
/**
* 获取问题列表
* @param questionsDtoList
* @param questionnaireBizId
* @param objectBizId
* @return
*/
public List<ApiQuestionsDto> questionsDtoList(List<ApiRelQuestionsGroupDto> questionsDtoList,
String questionnaireBizId,
String objectBizId) {
List<ApiQuestionsDto> apiQuestionsDtoList = new ArrayList<>();
if (!CollectionUtils.isEmpty(questionsDtoList)) {
apiQuestionsDtoList = questionsDtoList.stream().map(d -> {
ApiQuestionsDto apiQuestionsDto = new ApiQuestionsDto();
BeanUtils.copyProperties(d,apiQuestionsDto);
apiQuestionsDto.setId(d.getQuestionId());
//问题的选项列表信息
apiQuestionsDto.setOptionsDtoList(optionsDtoList(questionnaireBizId,d.getQuestionBizId()));
//答题会话对象(实际回答的内容)
apiQuestionsDto.setAnswerSessionsDto(answerSessionsDto(objectBizId,questionnaireBizId,d.getQuestionBizId()));
return apiQuestionsDto;
}).collect(Collectors.toList());
}
return apiQuestionsDtoList;
}
/**
* 获取问题的选项列表信息
* @param questionnaireBizId 问卷唯一业务ID
* @param questionBizId 问题唯一业务ID
* @return
*/
public List<ApiOptionsDto> optionsDtoList(String questionnaireBizId,String questionBizId) {
List<ApiOptionsDto> apiOptionsDtoList = new ArrayList<>();
//查询问题选项关系
List<RelQuestionsOptions> relQuestionsOptionsList = iRelQuestionsOptionsService.queryList(questionnaireBizId,questionBizId);
if (!CollectionUtils.isEmpty(relQuestionsOptionsList)) {
//选项id列表
List<String> optionBizIdList = relQuestionsOptionsList
.stream()
.map(RelQuestionsOptions::getOptionBizId)
.collect(Collectors.toList());
//根据选项id列表查询选项对象列表
List<Options> optionsList = iOptionsService.queryList("",optionBizIdList);
if (!CollectionUtils.isEmpty(optionsList)) {
apiOptionsDtoList = optionsList.stream().map(d -> {
ApiOptionsDto apiOptionsDto = new ApiOptionsDto();
BeanUtils.copyProperties(d,apiOptionsDto);
//选项附加问题列表
apiOptionsDto.setAddQuestionsDtoList(addQuestionsDtoList(questionnaireBizId,questionBizId,d.getOptionBizId()));
return apiOptionsDto;
}).collect(Collectors.toList());
}
}
return apiOptionsDtoList;
}
/**
* 选项附加问题列表
* @param questionnaireBizId
* @param questionBizId
* @param optionBizId
* @return
*/
public List<ApiAddQuestionsDto> addQuestionsDtoList(String questionnaireBizId,
String questionBizId,
String optionBizId) {
List<ApiAddQuestionsDto> apiAddQuestionsDtoList = new ArrayList<>();
List<RelOptionsAddQuestions> relOptionsAddQuestionsList = iRelOptionsAddQuestionsService.queryList(questionnaireBizId,questionBizId,optionBizId);
if (!CollectionUtils.isEmpty(relOptionsAddQuestionsList)) {
List<String> addQuestionsBizIdList = relOptionsAddQuestionsList.stream()
.map(RelOptionsAddQuestions::getAddQuestionsBizId)
.collect(Collectors.toList());
List<AddQuestions> addQuestionsList = iAddQuestionsService.queryList(addQuestionsBizIdList);
if (!CollectionUtils.isEmpty(addQuestionsList)) {
apiAddQuestionsDtoList = addQuestionsList.stream().map(d -> {
ApiAddQuestionsDto apiAddQuestionsDto = new ApiAddQuestionsDto();
BeanUtils.copyProperties(d,apiAddQuestionsDto);
return apiAddQuestionsDto;
}).collect(Collectors.toList());
}
}
return apiAddQuestionsDtoList;
}
/**
* 查询当前问题回答的内容对象
* @param objectBizId 答题的对象业务ID
* @param questionnaireBizId 答题选择的问卷唯一业务ID
* @param questionBizId 答题选择的问题唯一业务ID
* @return
*/
public ApiAnswerSessionsDto answerSessionsDto(String objectBizId,
String questionnaireBizId,
String questionBizId){
ApiAnswerSessionsDto apiAnswerSessionsDto = null;
//获取登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
//查询回答列表
List<AnswerSessions> answerSessionsList = iAnswerSessionsService.queryList(AnswerSessionsDto
.builder()
.questionnaireBizId(questionnaireBizId)
.objectBizId(objectBizId)
.questionBizId(questionBizId)
.creatorId(authUserDto.getUserBizId())
.build());
if (!CollectionUtils.isEmpty(answerSessionsList)) {
//获取回答对象
AnswerSessions answerSessions = answerSessionsList.get(0);
apiAnswerSessionsDto = new ApiAnswerSessionsDto();
BeanUtils.copyProperties(answerSessions,apiAnswerSessionsDto);
apiAnswerSessionsDto.setOptionJsonDtoList(apiAnswerSessionsDto.getOptionJsonDtoList());
apiAnswerSessionsDto.setQuestionTextJsonDtoList(apiAnswerSessionsDto.getQuestionTextJsonDtoList());
}
return apiAnswerSessionsDto;
}
/**
* 问卷-答题提交接口
* @return
*/
@Override
public Result<ApiAnswerSaveResponse> answerSave(ApiAnswerSaveRequest request) {
if (CollectionUtils.isEmpty(request.getAnswerSessionsDtoList())) {
//答题会话对象不能为空
throw new BusinessException("答题会话对象集合不能为空!");
}
//校验问卷信息是否存在
Result<Questionnaires> result = checkQuestionnairesIsExist(request.getQuestionnaireBizId());
Questionnaires questionnaires = result.getData();
//获取登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
//先删后增加答题会话记录
iAnswerSessionsService.del(AnswerSessionsDto
.builder()
.creatorId(authUserDto.getUserBizId())
.objectBizId(request.getObjectBizId())
.questionnaireBizId(request.getQuestionnaireBizId())
.build());
//增加
if (!CollectionUtils.isEmpty(request.getAnswerSessionsDtoList())) {
List<AnswerSessions> saveList = request.getAnswerSessionsDtoList().stream().map(dto -> {
AnswerSessions answerSessions = new AnswerSessions();
BeanUtils.copyProperties(dto,answerSessions);
//答题选择的选项json
answerSessions.setOptionJson(JSON.toJSONString(dto.getOptionJsonDtoList()));
//问题的答题内容(问答题)json
answerSessions.setQuestionTextJson(JSON.toJSONString(dto.getQuestionTextJsonDtoList()));
//创建人ID
answerSessions.setCreatorId(authUserDto.getUserBizId());
answerSessions.setObjectBizId(request.getObjectBizId());
answerSessions.setQuestionnaireBizId(request.getQuestionnaireBizId());
//答题会话业务ID
answerSessions.setSessionId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_ANSWER_SESSIONS.getCode()));
//答题状态 1-已完成
answerSessions.setStatus(1);
return answerSessions;
}).collect(Collectors.toList());
iAnswerSessionsService.saveOrUpdateBatch(saveList);
}
return Result.success();
}
/**
* 校验问卷信息是否存在
* @param questionnaireBizId
* @return
*/
public Result<Questionnaires> checkQuestionnairesIsExist(String questionnaireBizId) {
Questionnaires questionnaires = iQuestionnairesService.queryOne(questionnaireBizId);
if (Objects.isNull(questionnaires)) {
//数据不存在
throw new BusinessException("问卷信息不存在!");
}
return Result.success(questionnaires);
}
}
......@@ -26,5 +26,9 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.question.feign.client;
import com.yd.common.result.Result;
import com.yd.question.feign.fallback.ApiQuestionnairesFeignFallbackFactory;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.response.ApiAnswerSaveResponse;
import com.yd.question.feign.response.ApiQuestionnairesDetailResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 问题基础服务-问卷信息Feign客户端
*/
@FeignClient(name = "yd-question-api", fallbackFactory = ApiQuestionnairesFeignFallbackFactory.class)
public interface ApiQuestionnairesFeignClient {
/**
* 获取问卷详细信息-单个问卷详细详细
* @param questionnaireBizId 问卷唯一业务ID
* @param objectBizId 对象业务ID
* @return
*/
@GetMapping("/detail")
Result<ApiQuestionnairesDetailResponse> detail(@RequestParam(value = "questionnaireBizId") String questionnaireBizId,
@RequestParam(value = "objectBizId") String objectBizId);
/**
* 问卷-答题提交接口
* @return
*/
@PostMapping("/answer/save")
Result<ApiAnswerSaveResponse> answerSave(@Validated @RequestBody ApiAnswerSaveRequest request);
}
package com.yd.question.feign.dto;
import lombok.Data;
/**
* 选项附加问题DTO
*/
@Data
public class ApiAddQuestionsDto {
/**
* 选项附加问题表主键id
*/
private Long id;
/**
* 附加问题唯一业务ID
*/
private String addQuestionsBizId;
/**
* 附加问题类型(字典:单选/多选/文本/日期/数字)
*/
private String type;
/**
* 附加问题内容
*/
private String text;
/**
* 是否必填 0-否 1-是
*/
private Integer isRequired;
/**
* 附加问题排序序号
*/
private Integer sortOrder;
/**
* 状态(0:停用 1:启用)
*/
private Integer status;
}
package com.yd.question.feign.dto;
import lombok.Data;
@Data
public class ApiAddQuestionsJsonDto {
/**
* 附加问题唯一业务ID
*/
private String addQuestionsBizId;
/**
* 附加问题内容
*/
private String content;
}
package com.yd.question.feign.dto;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.IOException;
import java.util.List;
/**
* 答题会话表DTO(实际回答的内容)
*/
@Data
public class ApiAnswerSessionsDto {
/**
* 答题会话表主键id
*/
private Long id;
/**
* 答题会话唯一业务ID
*/
private String sessionId;
/**
* 答题的对象业务ID
*/
private String objectBizId;
/**
* 答题选择的问卷唯一业务ID
*/
private String questionnaireBizId;
/**
* 答题选择的问题唯一业务ID
*/
@NotBlank(message = "答题选择的问题唯一业务ID不能为空")
private String questionBizId;
/**
* 问题的答题内容(问答题) 非json的文本
*/
private String questionText;
/**
* 问题的答题内容(问答题)JSON串 例:[{"title": "病况1","content": "111"},{"title": "病况2","content": "222"}]
*/
private String questionTextJson;
/**
* 问题的答题内容(问答题)List集合
*/
private List<ApiQuestionTextJsonDto> questionTextJsonDtoList;
/**
* 答题选择的选项json串(包含附加问题答题内容), 例:[{"option_biz_id": "option_1001","content": "是",[{"add_questions_biz_id": "add_1001","content": "5年"}]},]
*/
private String optionJson;
/**
* 答题选择的选项 List集合
*/
private List<ApiOptionJsonDto> optionJsonDtoList;
/**
* 答题状态(0:草稿 1:已完成 2:未完成)
*/
private Integer status;
private static final ObjectMapper objectMapper = new ObjectMapper();
/**
* 将questionTextJson转换为List<ApiQuestionTextJsonDto>
*/
public List<ApiQuestionTextJsonDto> getQuestionTextJsonDtoList() {
if (questionTextJsonDtoList == null && questionTextJson != null) {
try {
questionTextJsonDtoList = objectMapper.readValue(
questionTextJson,
new TypeReference<List<ApiQuestionTextJsonDto>>(){}
);
} catch (IOException e) {
throw new RuntimeException("Failed to parse questionTextJson", e);
}
}
return questionTextJsonDtoList;
}
/**
* 将optionJson转换为List<ApiOptionJsonDto>
*/
public List<ApiOptionJsonDto> getOptionJsonDtoList() {
if (optionJsonDtoList == null && optionJson != null) {
try {
optionJsonDtoList = objectMapper.readValue(
optionJson,
new TypeReference<List<ApiOptionJsonDto>>(){}
);
} catch (IOException e) {
throw new RuntimeException("Failed to parse optionJson", e);
}
}
return optionJsonDtoList;
}
}
package com.yd.question.feign.dto;
import lombok.Data;
import java.util.List;
/**
* 一二级分类分组的问题列表信息
*/
@Data
public class ApiFirstAndSecondCategoryDto {
/**
* 一级分类字典(字典:投保人、受保人等)
*/
private String firstCategory;
/**
* 一级分类字典名称(字典:投保人、受保人等)
*/
private String firstCategoryName;
/**
* 排序序号
*/
private Integer sortOrder;
/**
* 二级分类分组,问题列表信息
*/
private List<ApiSecondCategoryDto> secondCategoryDtoList;
}
package com.yd.question.feign.dto;
import lombok.Data;
import java.util.List;
/**
* 一级分类分组的问题列表信息
*/
@Data
public class ApiFirstCategoryDto {
/**
* 一级分类字典(字典:投保人、受保人等)
*/
private String firstCategory;
/**
* 一级分类字典名称(字典:投保人、受保人等)
*/
private String firstCategoryName;
/**
* 排序序号
*/
private Integer sortOrder;
/**
* 问题列表
*/
private List<ApiQuestionsDto> questionsDtoList;
}
package com.yd.question.feign.dto;
import lombok.Data;
import java.util.List;
@Data
public class ApiOptionJsonDto {
/**
* 选项唯一业务ID
*/
private String optionBizId;
/**
* 回答的内容
*/
private String content;
/**
* 选项->回答的附加问题内容列表
*/
private List<ApiAddQuestionsJsonDto> addQuestionsJsonDtoList;
}
package com.yd.question.feign.dto;
import lombok.Data;
import java.util.List;
/**
* 选项DTO
*/
@Data
public class ApiOptionsDto {
/**
* 选项表主键id
*/
private Long id;
/**
* 选项唯一业务ID
*/
private String optionBizId;
/**
* 选项值
*/
private String value;
/**
* 选项显示文本
*/
private String text;
/**
* 选项排序序号
*/
private Integer sortOrder;
/**
* 状态(0:停用 1:启用)
*/
private Integer status;
/**
* 当前选项是否有附加问题 0-否 1-是
*/
private Integer isAdd;
/**
* 选项附加问题列表
*/
private List<ApiAddQuestionsDto> addQuestionsDtoList;
}
package com.yd.question.feign.dto;
import lombok.Data;
/**
* 问题的答题内容(问答题)List集合的DTO
*/
@Data
public class ApiQuestionTextJsonDto {
/**
* 回答的内容标题
*/
private String title;
/**
* 回答的内容
*/
private String content;
}
package com.yd.question.feign.dto;
import lombok.Data;
/**
* 问卷基础信息DTO
*/
@Data
public class ApiQuestionnairesDto {
/**
* 问卷主键id
*/
private Long id;
/**
* 问卷唯一业务ID
*/
private String questionnaireBizId;
/**
* 问卷名称
*/
private String name;
/**
* 问卷描述
*/
private String description;
/**
* 问卷版本
*/
private String version;
/**
* 状态(0:停用 1:启用)
*/
private Integer status;
}
package com.yd.question.feign.dto;
import lombok.Data;
import java.util.List;
/**
* 问题DTO
*/
@Data
public class ApiQuestionsDto {
/**
* 问题表主键id
*/
private Long id;
/**
* 问题唯一业务ID
*/
private String questionBizId;
/**
* 问题内容
*/
private String text;
/**
* 问题类型(字典:单选/多选/文本/日期/数字)
*/
private String type;
/**
* 一级分类(字典:投保人、受保人等)
*/
private String firstCategory;
/**
* 一级分类字典名称(字典:投保人、受保人等)
*/
private String firstCategoryName;
/**
* 二级分类(/病况/通用信息/医保卡使用/女性适用(下次生日年龄为12岁以上)/其他补充说明等)(字典)
*/
private String secondCategory;
/**
* 二级分类字典名称(/病况/通用信息/医保卡使用/女性适用(下次生日年龄为12岁以上)/其他补充说明等)(字典)
*/
private String secondCategoryName;
/**
* 是否必答 0-否 1-是
*/
private Integer isRequired;
/**
* 状态(0:停用 1:启用)
*/
private Integer status;
/**
* 排序序号
*/
private Integer sortOrder;
/**
* 问题的选项列表信息
*/
private List<ApiOptionsDto> optionsDtoList;
/**
* 答题会话对象(实际回答的内容)
*/
private ApiAnswerSessionsDto answerSessionsDto;
}
package com.yd.question.feign.dto;
import lombok.Data;
@Data
public class ApiRelQuestionsGroupDto {
//========以下是问卷问题关联表信息=========
/**
* 问卷问题关联表主键id
*/
private Long relQuestionnaireQuestionsId;
/**
* 问卷唯一业务ID
*/
private String questionnaireBizId;
/**
* 问题分组唯一业务ID
*/
private String groupBizId;
/**
* 问题唯一业务ID
*/
private String questionBizId;
/**
* 问题或者组在问卷中的顺序
*/
private Integer relQuestionnaireQuestionsSortOrder;
//========以下是问题分组和问题关联表信息=========
/**
* 问题分组和问题关联表主键id
*/
private Long relQuestionsGroupId;
/**
* 问题在组内的排序序号
*/
private Integer relQuestionsGroupSortOrder;
//========以下是问题表信息=========
/**
* 问题表主键id
*/
private Long questionId;
/**
* 问题内容
*/
private String text;
/**
* 问题类型(字典:单选/多选/文本/日期/数字)
*/
private String type;
/**
* 一级分类(字典:投保人、受保人等)
*/
private String firstCategory;
/**
* 二级分类(/病况/通用信息/医保卡使用/女性适用(下次生日年龄为12岁以上)/其他补充说明等)(字典)
*/
private String secondCategory;
/**
* 是否必答 0-否 1-是
*/
private Integer isRequired;
/**
* 状态(0:停用 1:启用)
*/
private Integer status;
}
package com.yd.question.feign.dto;
import lombok.Data;
import java.util.List;
/**
* 二级分类分组,问题列表信息
*/
@Data
public class ApiSecondCategoryDto {
/**
* 二级分类字典(/病况/通用信息/医保卡使用/女性适用(下次生日年龄为12岁以上)/其他补充说明等)(字典)
*/
private String secondCategory;
/**
* 二级分类字典名称(/病况/通用信息/医保卡使用/女性适用(下次生日年龄为12岁以上)/其他补充说明等)(字典)
*/
private String secondCategoryName;
/**
* 排序序号
*/
private Integer sortOrder;
/**
* 问题列表
*/
private List<ApiQuestionsDto> questionsDtoList;
}
package com.yd.question.feign.fallback;
import com.yd.common.result.Result;
import com.yd.question.feign.client.ApiQuestionnairesFeignClient;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.response.ApiAnswerSaveResponse;
import com.yd.question.feign.response.ApiQuestionnairesDetailResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* 问题基础服务-问卷信息Feign降级处理
*/
@Slf4j
@Component
public class ApiQuestionnairesFeignFallbackFactory implements FallbackFactory<ApiQuestionnairesFeignClient> {
@Override
public ApiQuestionnairesFeignClient create(Throwable cause) {
return new ApiQuestionnairesFeignClient() {
@Override
public Result<ApiQuestionnairesDetailResponse> detail(String questionnaireBizId, String objectBizId) {
return null;
}
@Override
public Result<ApiAnswerSaveResponse> answerSave(ApiAnswerSaveRequest request) {
return null;
}
};
}
}
package com.yd.question.feign.request;
import com.yd.question.feign.dto.ApiAnswerSessionsDto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
public class ApiAnswerSaveRequest {
/**
* 答题的对象业务ID(操作的业务对象,例:预约信息业务唯一ID)
*/
@NotBlank(message = "答题的对象业务ID不能为空")
private String objectBizId;
/**
* 答题选择的问卷唯一业务ID
*/
@NotBlank(message = "答题选择的问卷唯一业务ID不能为空")
private String questionnaireBizId;
/**
* 答题会话对象(实际回答问题的内容)集合,对象即ApiAnswerSessionsDto,一个对象一个问卷问题
*/
private List<ApiAnswerSessionsDto> answerSessionsDtoList;
}
package com.yd.question.feign.response;
import lombok.Data;
@Data
public class ApiAnswerSaveResponse {
}
package com.yd.question.feign.response;
import com.yd.question.feign.dto.ApiFirstCategoryDto;
import com.yd.question.feign.dto.ApiQuestionnairesDto;
import com.yd.question.feign.dto.ApiFirstAndSecondCategoryDto;
import com.yd.question.feign.dto.ApiQuestionsDto;
import lombok.Data;
import java.util.List;
/**
* 问卷详细信息出参
*/
@Data
public class ApiQuestionnairesDetailResponse {
/**
* 问卷基础信息DTO
*/
private ApiQuestionnairesDto questionnairesDto;
/**
* 一二级分类分组的问题列表信息
*/
private List<ApiFirstAndSecondCategoryDto> firstAndSecondCategoryDtoList;
/**
* 一级分类分组的问题列表信息
*/
private List<ApiFirstCategoryDto> firstCategoryDtoList;
/**
* 分类平铺,问题列表信息(分类平铺层级结构问题列表)
*/
private List<ApiQuestionsDto> questionsDtoList;
/**
* 选择哪个List做为展示,1-firstAndSecondCategoryDtoList(一二级分类分组的问题列表信息) 2-firstCategoryDtoList(一级分类分组的问题列表信息) 3-questionsDtoList(分类平铺,问题列表信息(分类平铺层级结构问题列表))
*/
private Integer selectListFlag;
}
package com.yd.question.service.dao;
import com.yd.question.feign.dto.ApiRelQuestionsGroupDto;
import com.yd.question.service.model.Questionnaires;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
......@@ -13,4 +17,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface QuestionnairesMapper extends BaseMapper<Questionnaires> {
/**
* 根据问卷业务id查询:问卷问题关联表、分组问题关联表、问题表。三张表关联数据
* @param questionnaireBizId
* @return
*/
List<ApiRelQuestionsGroupDto> relList(@Param("questionnaireBizId") String questionnaireBizId);
}
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 问题表 Mapper 接口
* 问题分组表 Mapper 接口
* </p>
*
* @author zxm
......
package com.yd.question.service.dao;
import com.yd.question.service.model.RelOptionsAddQuestions;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 选项和附加问题关联表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-09-16
*/
public interface RelOptionsAddQuestionsMapper extends BaseMapper<RelOptionsAddQuestions> {
}
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 问问题关联表 Mapper 接口
* 问题分组和问题关联表 Mapper 接口
* </p>
*
* @author zxm
......@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface RelQuestionsGroupMapper extends BaseMapper<RelQuestionsGroup> {
}
package com.yd.question.service.dao;
import com.yd.question.service.model.RelQuestionsOptions;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 问题选项关联表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-09-16
*/
public interface RelQuestionsOptionsMapper extends BaseMapper<RelQuestionsOptions> {
}
package com.yd.question.service.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AnswerSessionsDto {
/**
* 答题的对象业务ID
*/
private String objectBizId;
/**
* 答题选择的问卷唯一业务ID
*/
private String questionnaireBizId;
/**
* 答题选择的问题唯一业务ID
*/
private String questionBizId;
/**
* 创建人ID
*/
private String creatorId;
}
package com.yd.question.service.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RelObjectQuestionnaireDto {
/**
* 对象业务ID
*/
private String objectBizId;
/**
* 问卷唯一业务ID
*/
private String questionnaireBizId;
}
......@@ -37,18 +37,6 @@ public class AddQuestions implements Serializable {
private String addQuestionsBizId;
/**
* 关联问题唯一业务ID
*/
@TableField("question_biz_id")
private String questionBizId;
/**
* 关联选项唯一业务ID
*/
@TableField("option_biz_id")
private String optionBizId;
/**
* 附加问题类型(字典:单选/多选/文本/日期/数字)
*/
@TableField("type")
......
......@@ -55,13 +55,19 @@ public class AnswerSessions implements Serializable {
private String questionBizId;
/**
* 答题问题内容
* 问题的答题内容(问答题) 非json的文本
*/
@TableField("question_text")
private String questionText;
/**
* 答题选择的选项json(包含附加问题答题内容), 例:[{"option_biz_id": "option_1001","text": "是",[{"add_questions_biz_id": "add_1001","text": "5年"}]},]
* 问题的答题内容(问答题)JSON例:[{"title": "病况1","content": "111"},{"title": "病况2","content": "222"}]
*/
@TableField("question_text_json")
private String questionTextJson;
/**
* 答题选择的选项json(包含附加问题答题内容), 例:[{"option_biz_id": "option_1001","content": "是",[{"add_questions_biz_id": "add_1001","content": "5年"}]},]
*/
@TableField("option_json")
private String optionJson;
......
......@@ -37,12 +37,6 @@ public class Options implements Serializable {
private String optionBizId;
/**
* 关联问题唯一业务ID
*/
@TableField("question_biz_id")
private String questionBizId;
/**
* 选项值
*/
@TableField("value")
......
......@@ -11,7 +11,7 @@ import lombok.Setter;
/**
* <p>
* 问题表
* 问题分组
* </p>
*
* @author zxm
......
......@@ -26,7 +26,7 @@ public class RelObjectQuestionnaire implements Serializable {
/**
* 主键id
*/
Options
@TableId(value = "id", type = IdType.AUTO)
private Long id;
......
package com.yd.question.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 选项和附加问题关联表
* </p>
*
* @author zxm
* @since 2025-09-16
*/
@Getter
@Setter
@TableName("rel_options_add_questions")
public class RelOptionsAddQuestions implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 问卷唯一业务ID
*/
@TableField("questionnaire_biz_id")
private String questionnaireBizId;
/**
* 问题唯一业务ID
*/
@TableField("question_biz_id")
private String questionBizId;
/**
* 选项唯一业务ID
*/
@TableField("option_biz_id")
private String optionBizId;
/**
* 附加问题唯一业务ID
*/
@TableField("add_questions_biz_id")
private String addQuestionsBizId;
/**
* 排序
*/
@TableField("sort_order")
private Integer sortOrder;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
......@@ -11,7 +11,7 @@ import lombok.Setter;
/**
* <p>
* 问问题关联表
* 问题分组和问题关联表
* </p>
*
* @author zxm
......@@ -43,6 +43,12 @@ public class RelQuestionsGroup implements Serializable {
private String questionBizId;
/**
* 排序序号
*/
@TableField("sort_order")
private Integer sortOrder;
/**
* 通用备注
*/
@TableField("remark")
......
package com.yd.question.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 问题选项关联表
* </p>
*
* @author zxm
* @since 2025-09-16
*/
@Getter
@Setter
@TableName("rel_questions_options")
public class RelQuestionsOptions implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 问卷唯一业务ID
*/
@TableField("questionnaire_biz_id")
private String questionnaireBizId;
/**
* 问题唯一业务ID
*/
@TableField("question_biz_id")
private String questionBizId;
/**
* 选项唯一业务ID
*/
@TableField("option_biz_id")
private String optionBizId;
/**
* 排序
*/
@TableField("sort_order")
private Integer sortOrder;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
......@@ -2,6 +2,9 @@ package com.yd.question.service.service;
import com.yd.question.service.model.AddQuestions;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.question.service.model.Options;
import java.util.List;
/**
* <p>
......@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IAddQuestionsService extends IService<AddQuestions> {
List<AddQuestions> queryList(List<String> addQuestionsBizIdList);
}
package com.yd.question.service.service;
import com.yd.question.service.dto.AnswerSessionsDto;
import com.yd.question.service.model.AnswerSessions;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 答题会话表 服务类
......@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IAnswerSessionsService extends IService<AnswerSessions> {
List<AnswerSessions> queryList(AnswerSessionsDto dto);
Boolean del(AnswerSessionsDto dto);
}
......@@ -2,6 +2,7 @@ package com.yd.question.service.service;
import com.yd.question.service.model.Options;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
......@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IOptionsService extends IService<Options> {
List<Options> queryList(String optionBizId,List<String> optionBizIdList);
}
package com.yd.question.service.service;
import com.yd.question.feign.dto.ApiRelQuestionsGroupDto;
import com.yd.question.service.model.Questionnaires;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 问卷表 服务类
......@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IQuestionnairesService extends IService<Questionnaires> {
Questionnaires queryOne(String questionnaireBizId);
List<ApiRelQuestionsGroupDto> relList(String questionnaireBizId);
}
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 问题表 服务类
* 问题分组表 服务类
* </p>
*
* @author zxm
......
package com.yd.question.service.service;
import com.yd.question.service.dto.RelObjectQuestionnaireDto;
import com.yd.question.service.model.RelObjectQuestionnaire;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 对象问卷关联表 服务类
......@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IRelObjectQuestionnaireService extends IService<RelObjectQuestionnaire> {
List<RelObjectQuestionnaire> queryList(RelObjectQuestionnaireDto dto);
}
package com.yd.question.service.service;
import com.yd.question.service.model.RelOptionsAddQuestions;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.question.service.model.RelQuestionsOptions;
import java.util.List;
/**
* <p>
* 选项和附加问题关联表 服务类
* </p>
*
* @author zxm
* @since 2025-09-16
*/
public interface IRelOptionsAddQuestionsService extends IService<RelOptionsAddQuestions> {
List<RelOptionsAddQuestions> queryList(String questionnaireBizId,
String questionBizId,
String optionBizId);
}
......@@ -3,6 +3,8 @@ package com.yd.question.service.service;
import com.yd.question.service.model.RelQuestionnaireQuestions;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 问卷问题关联表 服务类
......@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IRelQuestionnaireQuestionsService extends IService<RelQuestionnaireQuestions> {
List<RelQuestionnaireQuestions> queryList(String questionnaireBizId);
}
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 问问题关联表 服务类
* 问题分组和问题关联表 服务类
* </p>
*
* @author zxm
......
package com.yd.question.service.service;
import com.yd.question.service.model.RelQuestionsOptions;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 问题选项关联表 服务类
* </p>
*
* @author zxm
* @since 2025-09-16
*/
public interface IRelQuestionsOptionsService extends IService<RelQuestionsOptions> {
List<RelQuestionsOptions> queryList(String questionnaireBizId,String questionBizId);
}
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.model.AddQuestions;
import com.yd.question.service.dao.AddQuestionsMapper;
import com.yd.question.service.model.Options;
import com.yd.question.service.service.IAddQuestionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* <p>
......@@ -17,4 +23,16 @@ import org.springframework.stereotype.Service;
@Service
public class AddQuestionsServiceImpl extends ServiceImpl<AddQuestionsMapper, AddQuestions> implements IAddQuestionsService {
/**
* 查询列表
* @param addQuestionsBizIdList
* @return
*/
@Override
public List<AddQuestions> queryList(List<String> addQuestionsBizIdList) {
List<AddQuestions> list = baseMapper.selectList(new LambdaQueryWrapper<AddQuestions>()
.in(!CollectionUtils.isEmpty(addQuestionsBizIdList),AddQuestions::getAddQuestionsBizId,addQuestionsBizIdList)
);
return list;
}
}
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.dto.AnswerSessionsDto;
import com.yd.question.service.model.AnswerSessions;
import com.yd.question.service.dao.AnswerSessionsMapper;
import com.yd.question.service.model.Options;
import com.yd.question.service.service.IAnswerSessionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* <p>
......@@ -17,4 +24,34 @@ import org.springframework.stereotype.Service;
@Service
public class AnswerSessionsServiceImpl extends ServiceImpl<AnswerSessionsMapper, AnswerSessions> implements IAnswerSessionsService {
/**
* 查询列表
* @param dto
* @return
*/
@Override
public List<AnswerSessions> queryList(AnswerSessionsDto dto) {
List<AnswerSessions> list = baseMapper.selectList(new LambdaQueryWrapper<AnswerSessions>()
.eq(StringUtils.isNotBlank(dto.getCreatorId()),AnswerSessions::getCreatorId,dto.getCreatorId())
.eq(StringUtils.isNotBlank(dto.getObjectBizId()),AnswerSessions::getObjectBizId,dto.getObjectBizId())
.eq(StringUtils.isNotBlank(dto.getQuestionnaireBizId()),AnswerSessions::getQuestionnaireBizId,dto.getQuestionnaireBizId())
.eq(StringUtils.isNotBlank(dto.getQuestionBizId()),AnswerSessions::getQuestionBizId,dto.getQuestionBizId())
);
return list;
}
/**
* 根据条件删除
* @param dto
* @return
*/
@Override
public Boolean del(AnswerSessionsDto dto) {
return this.remove(new LambdaQueryWrapper<AnswerSessions>()
.eq(StringUtils.isNotBlank(dto.getCreatorId()),AnswerSessions::getCreatorId,dto.getCreatorId())
.eq(StringUtils.isNotBlank(dto.getObjectBizId()),AnswerSessions::getObjectBizId,dto.getObjectBizId())
.eq(StringUtils.isNotBlank(dto.getQuestionnaireBizId()),AnswerSessions::getQuestionnaireBizId,dto.getQuestionnaireBizId())
);
}
}
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.model.Options;
import com.yd.question.service.dao.OptionsMapper;
import com.yd.question.service.model.RelObjectQuestionnaire;
import com.yd.question.service.service.IOptionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* <p>
......@@ -17,4 +23,19 @@ import org.springframework.stereotype.Service;
@Service
public class OptionsServiceImpl extends ServiceImpl<OptionsMapper, Options> implements IOptionsService {
/**
* 根据问题业务id查询选项列表
* @param optionBizId
* @param optionBizIdList
* @return
*/
@Override
public List<Options> queryList(String optionBizId,List<String> optionBizIdList) {
List<Options> list = baseMapper.selectList(new LambdaQueryWrapper<Options>()
.eq(StringUtils.isNotBlank(optionBizId),Options::getOptionBizId,optionBizId)
.in(!CollectionUtils.isEmpty(optionBizIdList),Options::getOptionBizId,optionBizIdList)
);
return list;
}
}
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.feign.dto.ApiRelQuestionsGroupDto;
import com.yd.question.service.model.Questionnaires;
import com.yd.question.service.dao.QuestionnairesMapper;
import com.yd.question.service.service.IQuestionnairesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 问卷表 服务实现类
......@@ -17,4 +22,25 @@ import org.springframework.stereotype.Service;
@Service
public class QuestionnairesServiceImpl extends ServiceImpl<QuestionnairesMapper, Questionnaires> implements IQuestionnairesService {
/**
* 查询单个对象
* @param questionnaireBizId
* @return
*/
@Override
public Questionnaires queryOne(String questionnaireBizId) {
return this.getOne(new LambdaQueryWrapper<Questionnaires>()
.eq(Questionnaires::getQuestionnaireBizId,questionnaireBizId)
);
}
/**
* 根据问卷业务id查询:问卷问题关联表、分组问题关联表、问题表。三张表关联数据
* @param questionnaireBizId
* @return
*/
@Override
public List<ApiRelQuestionsGroupDto> relList(String questionnaireBizId){
return baseMapper.relList(questionnaireBizId);
}
}
......@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
/**
* <p>
* 问题表 服务实现类
* 问题分组表 服务实现类
* </p>
*
* @author zxm
......
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.dto.RelObjectQuestionnaireDto;
import com.yd.question.service.model.RelObjectQuestionnaire;
import com.yd.question.service.dao.RelObjectQuestionnaireMapper;
import com.yd.question.service.service.IRelObjectQuestionnaireService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.user.service.model.SysProject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/**
* <p>
......@@ -17,4 +25,17 @@ import org.springframework.stereotype.Service;
@Service
public class RelObjectQuestionnaireServiceImpl extends ServiceImpl<RelObjectQuestionnaireMapper, RelObjectQuestionnaire> implements IRelObjectQuestionnaireService {
/**
* 查询列表
* @param dto
* @return
*/
@Override
public List<RelObjectQuestionnaire> queryList(RelObjectQuestionnaireDto dto) {
List<RelObjectQuestionnaire> list = baseMapper.selectList(new LambdaQueryWrapper<RelObjectQuestionnaire>()
.eq(StringUtils.isNotBlank(dto.getObjectBizId()),RelObjectQuestionnaire::getObjectBizId,dto.getObjectBizId())
.eq(StringUtils.isNotBlank(dto.getQuestionnaireBizId()),RelObjectQuestionnaire::getQuestionnaireBizId,dto.getQuestionnaireBizId())
);
return list;
}
}
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.model.RelOptionsAddQuestions;
import com.yd.question.service.dao.RelOptionsAddQuestionsMapper;
import com.yd.question.service.model.RelQuestionsOptions;
import com.yd.question.service.service.IRelOptionsAddQuestionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 选项和附加问题关联表 服务实现类
* </p>
*
* @author zxm
* @since 2025-09-16
*/
@Service
public class RelOptionsAddQuestionsServiceImpl extends ServiceImpl<RelOptionsAddQuestionsMapper, RelOptionsAddQuestions> implements IRelOptionsAddQuestionsService {
/**
* 查询列表
* @param questionnaireBizId
* @param questionBizId
* @param optionBizId
* @return
*/
@Override
public List<RelOptionsAddQuestions> queryList(String questionnaireBizId,
String questionBizId,
String optionBizId) {
List<RelOptionsAddQuestions> list = baseMapper.selectList(new LambdaQueryWrapper<RelOptionsAddQuestions>()
.eq(StringUtils.isNotBlank(questionnaireBizId),RelOptionsAddQuestions::getQuestionnaireBizId,questionnaireBizId)
.eq(StringUtils.isNotBlank(questionBizId),RelOptionsAddQuestions::getQuestionBizId,questionBizId)
.eq(StringUtils.isNotBlank(optionBizId),RelOptionsAddQuestions::getOptionBizId,optionBizId)
);
return list;
}
}
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.model.RelQuestionnaireQuestions;
import com.yd.question.service.dao.RelQuestionnaireQuestionsMapper;
import com.yd.question.service.service.IRelQuestionnaireQuestionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.user.service.model.SysProject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/**
* <p>
......@@ -17,4 +24,17 @@ import org.springframework.stereotype.Service;
@Service
public class RelQuestionnaireQuestionsServiceImpl extends ServiceImpl<RelQuestionnaireQuestionsMapper, RelQuestionnaireQuestions> implements IRelQuestionnaireQuestionsService {
/**
* 查询列表
* @param questionnaireBizId
* @return
*/
@Override
public List<RelQuestionnaireQuestions> queryList(String questionnaireBizId) {
List<RelQuestionnaireQuestions> list = baseMapper.selectList(new LambdaQueryWrapper<RelQuestionnaireQuestions>()
.eq(StringUtils.isNotBlank(questionnaireBizId),RelQuestionnaireQuestions::getQuestionnaireBizId,questionnaireBizId)
);
return list;
}
}
......@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
/**
* <p>
* 问问题关联表 服务实现类
* 问题分组和问题关联表 服务实现类
* </p>
*
* @author zxm
......
package com.yd.question.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.question.service.model.RelQuestionnaireQuestions;
import com.yd.question.service.model.RelQuestionsOptions;
import com.yd.question.service.dao.RelQuestionsOptionsMapper;
import com.yd.question.service.service.IRelQuestionsOptionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 问题选项关联表 服务实现类
* </p>
*
* @author zxm
* @since 2025-09-16
*/
@Service
public class RelQuestionsOptionsServiceImpl extends ServiceImpl<RelQuestionsOptionsMapper, RelQuestionsOptions> implements IRelQuestionsOptionsService {
/**
* 查询列表
* @param questionnaireBizId 问卷唯一业务ID
* @param questionBizId 问题唯一业务ID
* @return
*/
@Override
public List<RelQuestionsOptions> queryList(String questionnaireBizId, String questionBizId) {
List<RelQuestionsOptions> list = baseMapper.selectList(new LambdaQueryWrapper<RelQuestionsOptions>()
.eq(StringUtils.isNotBlank(questionnaireBizId),RelQuestionsOptions::getQuestionnaireBizId,questionnaireBizId)
.eq(StringUtils.isNotBlank(questionBizId),RelQuestionsOptions::getQuestionBizId,questionBizId)
);
return list;
}
}
package com.yd.question.service.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CategoryGroupingExample {
// 假设这是您已经定义好的DTO类
static class ApiRelQuestionsGroupDto {
private String firstCategory;
private String secondCategory;
private String text;
// 构造方法、getter和setter
public ApiRelQuestionsGroupDto(String firstCategory, String secondCategory, String text) {
this.firstCategory = firstCategory;
this.secondCategory = secondCategory;
this.text = text;
}
public String getFirstCategory() { return firstCategory; }
public String getSecondCategory() { return secondCategory; }
public String getText() { return text; }
}
// 二级分类DTO
static class ApiSecondCategoryDto {
private String secondCategory;
private String secondCategoryName;
private Integer sortOrder;
private List<ApiRelQuestionsGroupDto> questionList;
// getter和setter
public String getSecondCategory() { return secondCategory; }
public void setSecondCategory(String secondCategory) { this.secondCategory = secondCategory; }
public String getSecondCategoryName() { return secondCategoryName; }
public void setSecondCategoryName(String secondCategoryName) { this.secondCategoryName = secondCategoryName; }
public Integer getSortOrder() { return sortOrder; }
public void setSortOrder(Integer sortOrder) { this.sortOrder = sortOrder; }
public List<ApiRelQuestionsGroupDto> getQuestionList() { return questionList; }
public void setQuestionList(List<ApiRelQuestionsGroupDto> questionList) { this.questionList = questionList; }
}
// 一级分类DTO
static class ApiFirstAndSecondCategoryDto {
private String firstCategory;
private String firstCategoryName;
private Integer sortOrder;
private List<ApiSecondCategoryDto> secondCategoryDtoList;
// getter和setter
public String getFirstCategory() { return firstCategory; }
public void setFirstCategory(String firstCategory) { this.firstCategory = firstCategory; }
public String getFirstCategoryName() { return firstCategoryName; }
public void setFirstCategoryName(String firstCategoryName) { this.firstCategoryName = firstCategoryName; }
public Integer getSortOrder() { return sortOrder; }
public void setSortOrder(Integer sortOrder) { this.sortOrder = sortOrder; }
public List<ApiSecondCategoryDto> getSecondCategoryDtoList() { return secondCategoryDtoList; }
public void setSecondCategoryDtoList(List<ApiSecondCategoryDto> secondCategoryDtoList) { this.secondCategoryDtoList = secondCategoryDtoList; }
}
public static void main(String[] args) {
// 创建测试数据
List<ApiRelQuestionsGroupDto> list = new ArrayList<>();
list.add(new ApiRelQuestionsGroupDto("投保人", "基本信息", "姓名"));
list.add(new ApiRelQuestionsGroupDto("投保人", "基本信息", "年龄"));
list.add(new ApiRelQuestionsGroupDto("投保人", "健康信息", "是否有病史"));
list.add(new ApiRelQuestionsGroupDto("受保人", "基本信息", "姓名"));
list.add(new ApiRelQuestionsGroupDto("受保人", "健康信息", "是否有病史"));
list.add(new ApiRelQuestionsGroupDto("受保人", "健康信息", "是否有过敏"));
// 使用Java 8 Stream API进行多级分组并转换为目标结构
List<ApiFirstAndSecondCategoryDto> firstAndSecondCategoryDtoList = list.stream()
// 过滤掉firstCategory为null的记录
.filter(dto -> dto.getFirstCategory() != null)
// 按一级分类分组
.collect(Collectors.groupingBy(
ApiRelQuestionsGroupDto::getFirstCategory,
Collectors.toList()
))
.entrySet().stream()
.map(entry -> {
// 创建一级分类DTO
ApiFirstAndSecondCategoryDto firstCategoryDto = new ApiFirstAndSecondCategoryDto();
firstCategoryDto.setFirstCategory(entry.getKey());
// 设置一级分类名称(这里简单模拟)
firstCategoryDto.setFirstCategoryName(entry.getKey() + "名称");
// 设置排序序号(这里简单模拟)
if("投保人".equals(entry.getKey())) {
firstCategoryDto.setSortOrder(1);
} else {
firstCategoryDto.setSortOrder(2);
}
// 对当前一级分类下的数据进行二级分类分组
Map<String, List<ApiRelQuestionsGroupDto>> secondCategoryMap = entry.getValue().stream()
// 过滤掉secondCategory为null的记录
.filter(dto -> dto.getSecondCategory() != null)
.collect(Collectors.groupingBy(ApiRelQuestionsGroupDto::getSecondCategory));
// 转换为二级分类DTO列表
List<ApiSecondCategoryDto> secondCategoryDtoList = secondCategoryMap.entrySet().stream()
.map(secondEntry -> {
ApiSecondCategoryDto secondCategoryDto = new ApiSecondCategoryDto();
secondCategoryDto.setSecondCategory(secondEntry.getKey());
// 设置二级分类名称(这里简单模拟)
secondCategoryDto.setSecondCategoryName(secondEntry.getKey() + "名称");
// 设置二级分类排序序号(这里简单模拟)
if("基本信息".equals(secondEntry.getKey())) {
secondCategoryDto.setSortOrder(1);
} else {
secondCategoryDto.setSortOrder(2);
}
// 设置问题列表
secondCategoryDto.setQuestionList(secondEntry.getValue());
return secondCategoryDto;
})
.collect(Collectors.toList());
// 设置二级分类列表到一级分类DTO
firstCategoryDto.setSecondCategoryDtoList(secondCategoryDtoList);
return firstCategoryDto;
})
.collect(Collectors.toList());
// 打印结果
System.out.println("分组结果:");
for (ApiFirstAndSecondCategoryDto firstCategory : firstAndSecondCategoryDtoList) {
System.out.println("一级分类: " + firstCategory.getFirstCategory() +
" (" + firstCategory.getFirstCategoryName() + "), 排序: " + firstCategory.getSortOrder());
for (ApiSecondCategoryDto secondCategory : firstCategory.getSecondCategoryDtoList()) {
System.out.println(" 二级分类: " + secondCategory.getSecondCategory() +
" (" + secondCategory.getSecondCategoryName() + "), 排序: " + secondCategory.getSortOrder());
for (ApiRelQuestionsGroupDto question : secondCategory.getQuestionList()) {
System.out.println(" 问题: " + question.getText());
}
}
System.out.println();
}
}
}
......@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
})
.strategyConfig(builder -> {
builder.addInclude(
"rel_object_questionnaire","answer_sessions"
"rel_questions_options","rel_options_add_questions"
// "questionnaires","rel_questionnaire_questions",
// "questions_group","rel_questions_group",
// "questions","options","add_questions",
......
......@@ -2,4 +2,22 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.QuestionnairesMapper">
<select id="relList" resultType="com.yd.question.feign.dto.ApiRelQuestionsGroupDto">
select
rqq.id as relQuestionnaireQuestionsId,rqq.questionnaire_biz_id,
rqq.group_biz_id,rqq.question_biz_id,rqq.sort_order as relQuestionnaireQuestionsSortOrder,
rqg.id as relQuestionsGroupId,rqg.sort_order as relQuestionsGroupSortOrder,
q.id as questionId,q.text,q.type,q.first_category,q.second_category,q.is_required,q.status
from
rel_questionnaire_questions rqq
left join rel_questions_group rqg on rqq.group_biz_id = rqg.group_biz_id and rqq.is_deleted = 0
left join questions q on q.question_biz_id = COALESCE(rqg.question_biz_id, rqq.question_biz_id) and rqq.is_deleted = 0
<where>
and rqq.questionnaire_biz_id = #{questionnaireBizId}
and rqq.is_deleted = 0
</where>
order by rqq.sort_order,rqg.sort_order asc
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.AddAnswersMapper">
<mapper namespace="com.yd.question.service.dao.RelOptionsAddQuestionsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.AddQuestionsMapper">
<mapper namespace="com.yd.question.service.dao.RelQuestionsOptionsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.AnswerSessionsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.AnswersMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.OptionsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.QuestionnairesMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.QuestionsGroupMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.QuestionsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.RelQuestionnaireQuestionsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.question.service.dao.RelQuestionsGroupMapper">
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment