Commit 04d62d09 by zhangxingmin

Merge remote-tracking branch 'origin/test' into dev

# Conflicts:
#	.idea/encodings.xml
parents 8e627906 924266ad
### 通用开发环境 ###
# 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-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
# 基础镜像
FROM openjdk:8
# 维护人
LABEL maintainer="zxm<2060197959@qq.com>"
# 创建目录
RUN mkdir -p /home/app
# 拷贝项目jar - 使用可执行的 fat JAR
COPY target/yd-question-api-1.0-SNAPSHOT-exec.jar /home/app/yd-question-api.jar
# 执行命令启动jar
ENTRYPOINT ["java", "-jar", "/home/app/yd-question-api.jar"]
# 暴露端口
EXPOSE 9777
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.dto.ApiAnswerSessionsDto;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.request.ApiBatchSaveAnswerRequest;
import com.yd.question.feign.request.ApiObjectSaveRequest;
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);
}
@Override
public Result<ApiAnswerSessionsDto> answerSession(String questionnaireBizId, String objectBizId) {
return apiQuestionnairesService.answerSession(questionnaireBizId, objectBizId);
}
/**
* 问卷-业务对象绑定
*
* @return
*/
@Override
public Result objectSave(ApiObjectSaveRequest request) {
return apiQuestionnairesService.objectSave(request);
}
/**
* 问卷-批量复制新增答题会话
* @return
*/
@Override
public Result batchSaveAnswer(ApiBatchSaveAnswerRequest request) {
return apiQuestionnairesService.batchSaveAnswer(request);
}
}
...@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RestController;
/** /**
* <p> * <p>
* 问题表 前端控制器 * 问题分组表 前端控制器
* </p> * </p>
* *
* @author zxm * @author zxm
......
...@@ -5,14 +5,14 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -5,14 +5,14 @@ import org.springframework.web.bind.annotation.RestController;
/** /**
* <p> * <p>
* 问卷表 前端控制器 * 选项和附加问题关联表 前端控制器
* </p> * </p>
* *
* @author zxm * @author zxm
* @since 2025-09-12 * @since 2025-09-16
*/ */
@RestController @RestController
@RequestMapping("/questionnaires") @RequestMapping("/relOptionsAddQuestions")
public class QuestionnairesController { public class RelOptionsAddQuestionsController {
} }
...@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.RestController;
/** /**
* <p> * <p>
* 问问题关联表 前端控制器 * 问题分组和问题关联表 前端控制器
* </p> * </p>
* *
* @author zxm * @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.dto.ApiAnswerSessionsDto;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.request.ApiBatchSaveAnswerRequest;
import com.yd.question.feign.request.ApiObjectSaveRequest;
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);
Result objectSave(ApiObjectSaveRequest request);
Result<ApiAnswerSessionsDto> answerSession(String questionnaireBizId, String objectBizId);
Result batchSaveAnswer(ApiBatchSaveAnswerRequest request);
}
${AnsiColor.GREEN}
_ _ _ __ __ ____ _ _ _ _
| | (_)_ __ | | _\ \ / /__ / ___| |__ __ _| |_ / \ _ __ (_)
| | | | '_ \| |/ /\ \ /\ / / _ \ | | '_ \ / _` | __| / _ \ | '_ \| |
| |___| | | | | < \ V V / __/ |___| | | | (_| | |_ / ___ \| |_) | |
|_____|_|_| |_|_|\_\ \_/\_/ \___|\____|_| |_|\__,_|\__/_/ \_\ .__/|_|
|_|
${AnsiColor.BRIGHT_WHITE}
Spring Boot Version: ${spring-boot.version}
\ No newline at end of file
spring:
profiles:
active: test
# active: '@spring.profiles.active@'
---
spring:
application:
name: yd-email-api
profiles: dev
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空) 4e237601-cea8-414d-b7b9-d7adc8cbcf95
namespace: 22f9d61e-9011-4d45-88cb-24f9857e3eec
# nacos的ip地址和端口 120.79.64.17:10848
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: linkwe-common.yml
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
---
spring:
application:
name: yd-email-api
profiles: test
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: b3b01715-eb85-4242-992a-5aff03d864d4
# nacos的ip地址和端口
server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: yd-common.yml
group: YD_GROUP
refresh: true
extension-configs: # 扩展配置
- data-id: yd-question-api.yml
group: YD_GROUP
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
group: YD_GROUP
---
spring:
profiles: prod
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ewscrm
# nacos的ip地址和端口
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: yd-common.yml
refresh: true
group: YD_GROUP
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
#3.2.1\u4EE5\u4E0A\u4F7F\u7528
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1\u4EE5\u4E0B\u4F7F\u7528\u6216\u8005\u4E0D\u914D\u7F6E
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#\u65E5\u5FD7\u8F93\u51FA\u5230\u63A7\u5236\u53F0
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# \u8BBE\u7F6E p6spy driver \u4EE3\u7406
deregisterdrivers=true
# \u53D6\u6D88JDBC URL\u524D\u7F00
useprefix=true
# \u914D\u7F6E\u8BB0\u5F55 Log \u4F8B\u5916,\u53EF\u53BB\u6389\u7684\u7ED3\u679C\u96C6\u6709error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# \u65E5\u671F\u683C\u5F0F
dateformat=yyyy-MM-dd HH:mm:ss
# \u5B9E\u9645\u9A71\u52A8\u53EF\u591A\u4E2A
#driverlist=org.h2.Driver
# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55
outagedetection=true
# \u6162SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2
outagedetectioninterval=2
...@@ -26,5 +26,9 @@ ...@@ -26,5 +26,9 @@
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId> <artifactId>jackson-annotations</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>
package com.yd.question.feign.client;
import com.yd.common.result.Result;
import com.yd.question.feign.dto.ApiAnswerSessionsDto;
import com.yd.question.feign.fallback.ApiQuestionnairesFeignFallbackFactory;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.request.ApiBatchSaveAnswerRequest;
import com.yd.question.feign.request.ApiObjectSaveRequest;
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",path = "/question/api/questionnaires",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);
/**
* 获取问卷-答题会话接口
* @param questionnaireBizId 问卷唯一业务ID
* @param objectBizId 对象业务ID
* @return
*/
@GetMapping("/answer_session")
Result<ApiAnswerSessionsDto> answerSession(@RequestParam(value = "questionnaireBizId") String questionnaireBizId,
@RequestParam(value = "objectBizId") String objectBizId);
/**
* 问卷-业务对象绑定
* @return
*/
@PostMapping("/object/save")
Result objectSave(@Validated @RequestBody ApiObjectSaveRequest request);
/**
* 问卷-批量复制新增答题会话
* @return
*/
@PostMapping("/batch/save/answer")
Result batchSaveAnswer(@Validated @RequestBody ApiBatchSaveAnswerRequest 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 List<ApiAddQuestionsDto> addQuestionsDtoList;
/**
* 答题会话对象(实际回答的内容)
*/
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.dto.ApiAnswerSessionsDto;
import com.yd.question.feign.request.ApiAnswerSaveRequest;
import com.yd.question.feign.request.ApiBatchSaveAnswerRequest;
import com.yd.question.feign.request.ApiObjectSaveRequest;
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;
}
@Override
public Result<ApiAnswerSessionsDto> answerSession(String questionnaireBizId, String objectBizId) {
return null;
}
@Override
public Result objectSave(ApiObjectSaveRequest request) {
return null;
}
@Override
public Result batchSaveAnswer(ApiBatchSaveAnswerRequest 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.request;
import lombok.Data;
@Data
public class ApiBatchSaveAnswerRequest {
/**
* 答题的对象业务ID(被复制的对象业务ID)
*/
private String oldObjectBizId;
/**
* 答题的对象业务ID(新增的对象业务ID)
*/
private String newObjectBizId;
/**
* 答题选择的问卷唯一业务ID
*/
private String questionnaireBizId;
/**
* 创建人ID(答题用户人ID)
*/
private String creatorId;
}
package com.yd.question.feign.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiObjectSaveRequest {
/**
* 答题的对象业务ID(操作的业务对象,例:预约信息业务唯一ID)
*/
@NotBlank(message = "答题的对象业务ID不能为空")
private String objectBizId;
/**
* 对象名
*/
private String objectName;
/**
* 对象表名
*/
private String objectTableName;
/**
* 答题选择的问卷唯一业务ID
*/
@NotBlank(message = "答题选择的问卷唯一业务ID不能为空")
private String questionnaireBizId;
}
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; package com.yd.question.service.dao;
import com.yd.question.feign.dto.ApiRelQuestionsGroupDto;
import com.yd.question.service.model.Questionnaires; import com.yd.question.service.model.Questionnaires;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* <p> * <p>
...@@ -13,4 +17,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; ...@@ -13,4 +17,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface QuestionnairesMapper extends BaseMapper<Questionnaires> { 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; ...@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/** /**
* <p> * <p>
* 问题表 Mapper 接口 * 问题分组表 Mapper 接口
* </p> * </p>
* *
* @author zxm * @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; ...@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/** /**
* <p> * <p>
* 问问题关联表 Mapper 接口 * 问题分组和问题关联表 Mapper 接口
* </p> * </p>
* *
* @author zxm * @author zxm
...@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; ...@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface RelQuestionsGroupMapper extends BaseMapper<RelQuestionsGroup> { 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 { ...@@ -37,18 +37,6 @@ public class AddQuestions implements Serializable {
private String addQuestionsBizId; private String addQuestionsBizId;
/** /**
* 关联问题唯一业务ID
*/
@TableField("question_biz_id")
private String questionBizId;
/**
* 关联选项唯一业务ID
*/
@TableField("option_biz_id")
private String optionBizId;
/**
* 附加问题类型(字典:单选/多选/文本/日期/数字) * 附加问题类型(字典:单选/多选/文本/日期/数字)
*/ */
@TableField("type") @TableField("type")
......
...@@ -55,13 +55,19 @@ public class AnswerSessions implements Serializable { ...@@ -55,13 +55,19 @@ public class AnswerSessions implements Serializable {
private String questionBizId; private String questionBizId;
/** /**
* 答题问题内容 * 问题的答题内容(问答题) 非json的文本
*/ */
@TableField("question_text") @TableField("question_text")
private String questionText; 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") @TableField("option_json")
private String optionJson; private String optionJson;
......
...@@ -37,12 +37,6 @@ public class Options implements Serializable { ...@@ -37,12 +37,6 @@ public class Options implements Serializable {
private String optionBizId; private String optionBizId;
/** /**
* 关联问题唯一业务ID
*/
@TableField("question_biz_id")
private String questionBizId;
/**
* 选项值 * 选项值
*/ */
@TableField("value") @TableField("value")
......
...@@ -11,7 +11,7 @@ import lombok.Setter; ...@@ -11,7 +11,7 @@ import lombok.Setter;
/** /**
* <p> * <p>
* 问题表 * 问题分组
* </p> * </p>
* *
* @author zxm * @author zxm
......
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; ...@@ -11,7 +11,7 @@ import lombok.Setter;
/** /**
* <p> * <p>
* 问问题关联表 * 问题分组和问题关联表
* </p> * </p>
* *
* @author zxm * @author zxm
...@@ -43,6 +43,12 @@ public class RelQuestionsGroup implements Serializable { ...@@ -43,6 +43,12 @@ public class RelQuestionsGroup implements Serializable {
private String questionBizId; private String questionBizId;
/** /**
* 排序序号
*/
@TableField("sort_order")
private Integer sortOrder;
/**
* 通用备注 * 通用备注
*/ */
@TableField("remark") @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; ...@@ -2,6 +2,9 @@ package com.yd.question.service.service;
import com.yd.question.service.model.AddQuestions; import com.yd.question.service.model.AddQuestions;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.question.service.model.Options;
import java.util.List;
/** /**
* <p> * <p>
...@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IAddQuestionsService extends IService<AddQuestions> { public interface IAddQuestionsService extends IService<AddQuestions> {
List<AddQuestions> queryList(List<String> addQuestionsBizIdList);
} }
package com.yd.question.service.service; package com.yd.question.service.service;
import com.yd.question.service.dto.AnswerSessionsDto;
import com.yd.question.service.model.AnswerSessions; import com.yd.question.service.model.AnswerSessions;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 答题会话表 服务类 * 答题会话表 服务类
...@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IAnswerSessionsService extends IService<AnswerSessions> { 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; ...@@ -2,6 +2,7 @@ package com.yd.question.service.service;
import com.yd.question.service.model.Options; import com.yd.question.service.model.Options;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
...@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IOptionsService extends IService<Options> { public interface IOptionsService extends IService<Options> {
List<Options> queryList(String optionBizId,List<String> optionBizIdList);
} }
package com.yd.question.service.service; package com.yd.question.service.service;
import com.yd.question.feign.dto.ApiRelQuestionsGroupDto;
import com.yd.question.service.model.Questionnaires; import com.yd.question.service.model.Questionnaires;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 问卷表 服务类 * 问卷表 服务类
...@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IQuestionnairesService extends IService<Questionnaires> { 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; ...@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/** /**
* <p> * <p>
* 问题表 服务类 * 问题分组表 服务类
* </p> * </p>
* *
* @author zxm * @author zxm
......
package com.yd.question.service.service; package com.yd.question.service.service;
import com.yd.question.service.dto.RelObjectQuestionnaireDto;
import com.yd.question.service.model.RelObjectQuestionnaire; import com.yd.question.service.model.RelObjectQuestionnaire;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 对象问卷关联表 服务类 * 对象问卷关联表 服务类
...@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IRelObjectQuestionnaireService extends IService<RelObjectQuestionnaire> { 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);
List<RelOptionsAddQuestions> queryList(String questionnaireBizId,
String questionBizId,
List<String> optionBizIdList);
}
...@@ -3,6 +3,8 @@ package com.yd.question.service.service; ...@@ -3,6 +3,8 @@ package com.yd.question.service.service;
import com.yd.question.service.model.RelQuestionnaireQuestions; import com.yd.question.service.model.RelQuestionnaireQuestions;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 问卷问题关联表 服务类 * 问卷问题关联表 服务类
...@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IRelQuestionnaireQuestionsService extends IService<RelQuestionnaireQuestions> { public interface IRelQuestionnaireQuestionsService extends IService<RelQuestionnaireQuestions> {
List<RelQuestionnaireQuestions> queryList(String questionnaireBizId);
} }
...@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/** /**
* <p> * <p>
* 问问题关联表 服务类 * 问题分组和问题关联表 服务类
* </p> * </p>
* *
* @author zxm * @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; 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.model.AddQuestions;
import com.yd.question.service.dao.AddQuestionsMapper; import com.yd.question.service.dao.AddQuestionsMapper;
import com.yd.question.service.model.Options;
import com.yd.question.service.service.IAddQuestionsService; import com.yd.question.service.service.IAddQuestionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/** /**
* <p> * <p>
...@@ -17,4 +23,16 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +23,16 @@ import org.springframework.stereotype.Service;
@Service @Service
public class AddQuestionsServiceImpl extends ServiceImpl<AddQuestionsMapper, AddQuestions> implements IAddQuestionsService { 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; 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.model.AnswerSessions;
import com.yd.question.service.dao.AnswerSessionsMapper; import com.yd.question.service.dao.AnswerSessionsMapper;
import com.yd.question.service.model.Options;
import com.yd.question.service.service.IAnswerSessionsService; import com.yd.question.service.service.IAnswerSessionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/** /**
* <p> * <p>
...@@ -17,4 +24,34 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +24,34 @@ import org.springframework.stereotype.Service;
@Service @Service
public class AnswerSessionsServiceImpl extends ServiceImpl<AnswerSessionsMapper, AnswerSessions> implements IAnswerSessionsService { 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; 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.model.Options;
import com.yd.question.service.dao.OptionsMapper; import com.yd.question.service.dao.OptionsMapper;
import com.yd.question.service.model.RelObjectQuestionnaire;
import com.yd.question.service.service.IOptionsService; import com.yd.question.service.service.IOptionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/** /**
* <p> * <p>
...@@ -17,4 +23,19 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +23,19 @@ import org.springframework.stereotype.Service;
@Service @Service
public class OptionsServiceImpl extends ServiceImpl<OptionsMapper, Options> implements IOptionsService { 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; 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.model.Questionnaires;
import com.yd.question.service.dao.QuestionnairesMapper; import com.yd.question.service.dao.QuestionnairesMapper;
import com.yd.question.service.service.IQuestionnairesService; import com.yd.question.service.service.IQuestionnairesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* <p> * <p>
* 问卷表 服务实现类 * 问卷表 服务实现类
...@@ -17,4 +22,25 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +22,25 @@ import org.springframework.stereotype.Service;
@Service @Service
public class QuestionnairesServiceImpl extends ServiceImpl<QuestionnairesMapper, Questionnaires> implements IQuestionnairesService { 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; ...@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
/** /**
* <p> * <p>
* 问题表 服务实现类 * 问题分组表 服务实现类
* </p> * </p>
* *
* @author zxm * @author zxm
......
package com.yd.question.service.service.impl; 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.model.RelObjectQuestionnaire;
import com.yd.question.service.dao.RelObjectQuestionnaireMapper; import com.yd.question.service.dao.RelObjectQuestionnaireMapper;
import com.yd.question.service.service.IRelObjectQuestionnaireService; import com.yd.question.service.service.IRelObjectQuestionnaireService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/** /**
* <p> * <p>
...@@ -17,4 +25,17 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +25,17 @@ import org.springframework.stereotype.Service;
@Service @Service
public class RelObjectQuestionnaireServiceImpl extends ServiceImpl<RelObjectQuestionnaireMapper, RelObjectQuestionnaire> implements IRelObjectQuestionnaireService { 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 org.springframework.util.CollectionUtils;
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;
}
@Override
public List<RelOptionsAddQuestions> queryList(String questionnaireBizId,
String questionBizId,
List<String> optionBizIdList) {
List<RelOptionsAddQuestions> list = baseMapper.selectList(new LambdaQueryWrapper<RelOptionsAddQuestions>()
.eq(StringUtils.isNotBlank(questionnaireBizId),RelOptionsAddQuestions::getQuestionnaireBizId,questionnaireBizId)
.eq(StringUtils.isNotBlank(questionBizId),RelOptionsAddQuestions::getQuestionBizId,questionBizId)
.in(!CollectionUtils.isEmpty(optionBizIdList),RelOptionsAddQuestions::getOptionBizId,optionBizIdList)
);
return list;
}
}
package com.yd.question.service.service.impl; 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.RelQuestionnaireQuestions;
import com.yd.question.service.dao.RelQuestionnaireQuestionsMapper; import com.yd.question.service.dao.RelQuestionnaireQuestionsMapper;
import com.yd.question.service.service.IRelQuestionnaireQuestionsService; import com.yd.question.service.service.IRelQuestionnaireQuestionsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/** /**
* <p> * <p>
...@@ -17,4 +24,17 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +24,17 @@ import org.springframework.stereotype.Service;
@Service @Service
public class RelQuestionnaireQuestionsServiceImpl extends ServiceImpl<RelQuestionnaireQuestionsMapper, RelQuestionnaireQuestions> implements IRelQuestionnaireQuestionsService { 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; ...@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
/** /**
* <p> * <p>
* 问问题关联表 服务实现类 * 问题分组和问题关联表 服务实现类
* </p> * </p>
* *
* @author zxm * @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 { ...@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
}) })
.strategyConfig(builder -> { .strategyConfig(builder -> {
builder.addInclude( builder.addInclude(
"rel_object_questionnaire","answer_sessions" "rel_questions_options","rel_options_add_questions"
// "questionnaires","rel_questionnaire_questions", // "questionnaires","rel_questionnaire_questions",
// "questions_group","rel_questions_group", // "questions_group","rel_questions_group",
// "questions","options","add_questions", // "questions","options","add_questions",
......
...@@ -2,4 +2,22 @@ ...@@ -2,4 +2,22 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!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 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 asc
</select>
</mapper> </mapper>
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!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> </mapper>
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!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> </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