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

# Conflicts:
#	postdischarge-manage/src/main/java/com/xinelu/manage/service/patientinfo/impl/PatientInfoServiceImpl.java
This commit is contained in:
zhangheng 2026-03-10 14:23:38 +08:00
commit 882d683f53
15 changed files with 414 additions and 29 deletions

View File

@ -6,25 +6,22 @@ spring:
druid: druid:
# 主库数据源 # 主库数据源
master: master:
# url: jdbc:mysql://192.168.16.64:3306/post-discharge?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true url: jdbc:mysql://127.0.0.1:3306/post-discharge-hkey?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
url: jdbc:mysql://127.0.0.1:3306/post-discharge?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
# url: jdbc:mysql://182.92.166.109:8000/post-discharge?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root username: root
password: 1qaz!@#$ password: Hk2y!@#$
# password: Xinyilu@1qaz!@#$1234
# 从库数据源 # 从库数据源
slave: slave:
# 从数据源开关/默认关闭 # 从数据源开关/默认关闭
enabled: false enabled: true
url: url: jdbc:mysql://8.131.93.145:54081/aiob_callback?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: username: root
password: password: 1qaz!@#$
hkhis: hkhis:
# 从数据源开关/默认关闭 # 从数据源开关/默认关闭
enabled: true enabled: true
url: jdbc:mysql://127.0.0.1:3306/post-discharge?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true url: jdbc:mysql://127.0.0.1:3306/post-discharge-hkey?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root username: root
password: sa123456 password: Hk2y!@#$
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
# 初始连接数 # 初始连接数
initialSize: 5 initialSize: 5

View File

@ -292,10 +292,7 @@ aiob:
accessKey: 9a61c68abf134ab9823e39f61f2c2f72 accessKey: 9a61c68abf134ab9823e39f61f2c2f72
secretKey: 4287bfa1d5a34c229aacb5e056c94682 secretKey: 4287bfa1d5a34c229aacb5e056c94682
# 任务执行回调地址--测试 # 任务执行回调地址--测试
callBackUrl: http://8.131.93.145:54086/api/taskCallBack callBackUrl: http://192.168.4.7:19090/api/taskCallBack
# callBackUrl: http://182.92.166.109:19090/api/taskCallBack
# callBackUrl: http://101.200.89.70:19090/api/taskCallBack
# callBackUrl: http://8.131.93.145:54011/api/taskCallBack
xinyilu-database: xinyilu-database:
# 公共机构ID新医路用于宣教库公共库查询 # 公共机构ID新医路用于宣教库公共库查询

View File

@ -0,0 +1,37 @@
package com.xinelu.common.enums;
import lombok.Getter;
/**
* 问卷题目选项类型
*/
@Getter
public enum QuestionSubjectTypeEnum {
/**
* 单选题
*/
MULTIPLE_CHOICE("MULTIPLE_CHOICE"),
/**
* 多选题
*/
MULTIPLE_CHOICE_QUESTIONS("MULTIPLE_CHOICE_QUESTIONS"),
/**
* 填空题
*/
FILL_IN_THE_BLANKS("FILL_IN_THE_BLANKS"),
/**
* 反馈填空题
*/
FEEDBACK_BLANKS_SUBJECT("FEEDBACK_BLANKS_SUBJECT"),
;
final private String info;
QuestionSubjectTypeEnum(String info) {
this.info = info;
}
}

View File

@ -0,0 +1,43 @@
package com.xinelu.manage.domain.aiob;
import java.util.Date;
import lombok.Data;
/**
* @description: 阿里云百度外呼回调对象
* @author: haown
* @create: 2025-12-22 15:11
**/
@Data
public class AIOBCallbackEntity {
/**
* 主键
*/
private Integer id;
/**
* 回调数据类型 0-任务呼叫单通电话回调 1-号码组终态回调 2-任务状态变更回调 3-实时呼叫单通电话回调
*/
private Integer callbackType;
/**
* 回调数据
*/
private String callbackData;
/**
* 已读状态0未读1已读
*/
private Integer readState;
/**
* 创建时间
*/
private Date createDate;
/**
* 修改时间
*/
private Date updateDate;
}

View File

@ -0,0 +1,22 @@
package com.xinelu.manage.mapper.aiob;
import com.xinelu.common.annotation.DataSource;
import com.xinelu.common.enums.DataSourceType;
import com.xinelu.manage.domain.aiob.AIOBCallbackEntity;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
* @description 阿里云服务器百度外呼回调Mapper接口
* @Author haown
* @Date 2025-12-23 15:45
*/
@DataSource(DataSourceType.SLAVE)
public interface AIOBCallbackMapper {
List<AIOBCallbackEntity> getList(AIOBCallbackEntity query);
Integer updateReadState(@Param("readState")Integer readState, @Param("id")Integer id);
Integer deleteData();
}

View File

@ -2,6 +2,7 @@ package com.xinelu.manage.mapper.questionsubject;
import com.xinelu.manage.domain.questionsubject.QuestionSubject; import com.xinelu.manage.domain.questionsubject.QuestionSubject;
import com.xinelu.manage.vo.questionsubject.QuestionSubjectVO; import com.xinelu.manage.vo.questionsubject.QuestionSubjectVO;
import com.xinelu.manage.vo.statistics.QuestionnaireTaskStatisticsVo;
import java.util.List; import java.util.List;
@ -84,4 +85,12 @@ public interface QuestionSubjectMapper {
* @return 结果 * @return 结果
*/ */
int deleteSubjectByQuestionInfoId(Long questionInfoId); int deleteSubjectByQuestionInfoId(Long questionInfoId);
/**
* 原问卷选项信息
*
* @param questionnaireId 问卷id
* @return QuestionnaireTaskStatisticsVo
*/
List<QuestionnaireTaskStatisticsVo> selectQuestionnaireByQuestionnaireId(Long questionnaireId);
} }

View File

@ -0,0 +1,18 @@
package com.xinelu.manage.service.aiob;
import com.xinelu.manage.domain.aiob.AIOBCallbackEntity;
import java.util.List;
/**
* @description: 阿里云服务器百度外呼回调Service接口
* @author: haown
* @create: 2025-12-23 15:22
**/
public interface IAIOBCallbackService {
List<AIOBCallbackEntity> getList(AIOBCallbackEntity query);
Integer updateReadState(Integer readState, Integer id);
Integer deleteData();
}

View File

@ -0,0 +1,31 @@
package com.xinelu.manage.service.aiob.impl;
import com.xinelu.manage.domain.aiob.AIOBCallbackEntity;
import com.xinelu.manage.mapper.aiob.AIOBCallbackMapper;
import com.xinelu.manage.service.aiob.IAIOBCallbackService;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* @description: 阿里云服务器百度外呼回调Service实现
* @author: haown
* @create: 2025-12-23 15:30
**/
@Service
public class AIOBCallbackServiceImpl implements IAIOBCallbackService {
@Resource
private AIOBCallbackMapper aiobCallbackMapper;
@Override
public List<AIOBCallbackEntity> getList(AIOBCallbackEntity query) {
return aiobCallbackMapper.getList(query);
}
@Override public Integer updateReadState(Integer readState, Integer id) {
return aiobCallbackMapper.updateReadState(readState, id);
}
@Override public Integer deleteData() {
return aiobCallbackMapper.deleteData();
}
}

View File

@ -345,10 +345,10 @@ public class PatientInfoServiceImpl implements IPatientInfoService {
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public AjaxResult patientUpload(List<PatientInfoImport> list, Integer isDistinct, String fileName, String importName) { public AjaxResult patientUpload(List<PatientInfoImport> list, Integer isDistinct, String fileName ,String importName) {
int number; int number;
String importPersonTime = sysConfigService.selectConfigByKey("import_person_time"); String importPersonTime = sysConfigService.selectConfigByKey("import_person_time");
if (org.apache.commons.lang3.StringUtils.isBlank(importPersonTime)) { if (org.apache.commons.lang3.StringUtils.isBlank(importPersonTime) || importPersonTime.equals("")) {
number = 1000; number = 1000;
} }
number = Integer.parseInt(importPersonTime); number = Integer.parseInt(importPersonTime);

View File

@ -4,6 +4,7 @@ import com.xinelu.common.core.domain.AjaxResult;
import com.xinelu.common.core.domain.entity.SysUser; import com.xinelu.common.core.domain.entity.SysUser;
import com.xinelu.common.enums.NodeTypeEnum; import com.xinelu.common.enums.NodeTypeEnum;
import com.xinelu.common.enums.PhoneDialMethodEnum; import com.xinelu.common.enums.PhoneDialMethodEnum;
import com.xinelu.common.enums.QuestionSubjectTypeEnum;
import com.xinelu.common.enums.QuestionTypeEnum; import com.xinelu.common.enums.QuestionTypeEnum;
import com.xinelu.common.utils.StringUtils; import com.xinelu.common.utils.StringUtils;
import com.xinelu.manage.domain.agency.Agency; import com.xinelu.manage.domain.agency.Agency;
@ -14,6 +15,7 @@ import com.xinelu.manage.dto.statistics.QuestionnaireTaskStatisticsDto;
import com.xinelu.manage.mapper.department.DepartmentMapper; import com.xinelu.manage.mapper.department.DepartmentMapper;
import com.xinelu.manage.mapper.patientvisitrecord.PatientVisitRecordMapper; import com.xinelu.manage.mapper.patientvisitrecord.PatientVisitRecordMapper;
import com.xinelu.manage.mapper.phonedialrecord.PhoneDialRecordMapper; import com.xinelu.manage.mapper.phonedialrecord.PhoneDialRecordMapper;
import com.xinelu.manage.mapper.questionsubject.QuestionSubjectMapper;
import com.xinelu.manage.mapper.shortmessagesendrecord.ShortMessageSendRecordMapper; import com.xinelu.manage.mapper.shortmessagesendrecord.ShortMessageSendRecordMapper;
import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper; import com.xinelu.manage.mapper.signpatientmanageroutenode.SignPatientManageRouteNodeMapper;
import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper; import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper;
@ -70,6 +72,8 @@ public class StatisticsServiceImpl implements IStatisticsService {
private DepartmentMapper departmentMapper; private DepartmentMapper departmentMapper;
@Resource @Resource
private SysUserMapper sysUserMapper; private SysUserMapper sysUserMapper;
@Resource
private QuestionSubjectMapper questionSubjectMapper;
/** /**
* @description 随访成功率统计 * @description 随访成功率统计
@ -317,23 +321,76 @@ public class StatisticsServiceImpl implements IStatisticsService {
*/ */
@Override @Override
public AjaxResult questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto) { public AjaxResult questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto) {
List<QuestionnaireTaskStatisticsVo> output = new ArrayList<>();
//查询原问卷信息
List<QuestionnaireTaskStatisticsVo> subjectAndOptionVos = questionSubjectMapper.selectQuestionnaireByQuestionnaireId(questionnaireTaskStatisticsDto.getQuestionInfoId());
//空数据组装返回
if (CollectionUtils.isEmpty(subjectAndOptionVos)) {
return AjaxResult.success();
}
//查询问卷任务 //查询问卷任务
List<QuestionnaireTaskStatisticsVo> questionnaireTaskStatisticsVos = signPatientManageRouteNodeMapper.questionnaireTaskStatistics(questionnaireTaskStatisticsDto); List<QuestionnaireTaskStatisticsVo> questionnaireTaskStatisticsVos = signPatientManageRouteNodeMapper.questionnaireTaskStatistics(questionnaireTaskStatisticsDto);
//遍历计算比例 //空数据返回原问卷信息
if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVos)){ List<Long> total = null;
for (QuestionnaireTaskStatisticsVo questionnaireTaskStatisticsVo : questionnaireTaskStatisticsVos) { if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVos)) {
//除数不能为空或0 questionnaireTaskStatisticsVos = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getQuestionSubjectOptionId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos()) && Objects.nonNull(questionnaireTaskStatisticsVo.getTotal()) && questionnaireTaskStatisticsVo.getTotal() != 0){ total = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull).map(QuestionnaireTaskStatisticsVo::getManageRouteNodeId).distinct().collect(Collectors.toList());
questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos() }
.forEach(item -> item.setChoiceProportion( //遍历计算
new BigDecimal(item.getChoiceNumber()) List<QuestionnaireTaskOptionStatisticsVo> optionStatisticsVos = new ArrayList<>();
.divide(new BigDecimal(questionnaireTaskStatisticsVo.getTotal()),2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")))); if (questionnaireTaskStatisticsVos.size() > 0 && total != null && total.size() > 0) {
} else if (CollectionUtils.isNotEmpty(questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos()) && (Objects.isNull(questionnaireTaskStatisticsVo.getTotal()) || questionnaireTaskStatisticsVo.getTotal() == 0)){ for (QuestionnaireTaskStatisticsVo subjectAndOptionVo : subjectAndOptionVos) {
questionnaireTaskStatisticsVo.getQuestionnaireTaskOptionStatisticsVos().forEach(item -> item.setChoiceProportion(BigDecimal.ZERO)); QuestionnaireTaskOptionStatisticsVo optionStatisticsVo = new QuestionnaireTaskOptionStatisticsVo();
//根据 题目序号选项已选择过滤
List<QuestionnaireTaskStatisticsVo> choice = questionnaireTaskStatisticsVos.stream().filter(Objects::nonNull)
.filter(item -> Objects.nonNull(item.getQuestionNumber()) && item.getQuestionNumber().equals(subjectAndOptionVo.getQuestionNumber())
&& Objects.equals(item.getQuestionSubjectOptionId(), subjectAndOptionVo.getQuestionSubjectOptionId())
&& item.getOptionChooseSign() == 0)
.collect(Collectors.toList());
if (choice.size() > 0) {
subjectAndOptionVo.setChoiceProportion(new BigDecimal(choice.size()).divide(new BigDecimal(total.size()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));
optionStatisticsVo.setChoiceNumber((long) choice.size());
} else {
subjectAndOptionVo.setChoiceProportion(BigDecimal.ZERO);
optionStatisticsVo.setChoiceNumber(0L);
} }
optionStatisticsVo.setQuestionSubjectOptionId(subjectAndOptionVo.getQuestionSubjectOptionId());
optionStatisticsVo.setQuestionInfoId(questionnaireTaskStatisticsDto.getQuestionInfoId());
optionStatisticsVo.setOptionName(subjectAndOptionVo.getOptionName());
optionStatisticsVo.setQuestionNumber(subjectAndOptionVo.getQuestionNumber());
optionStatisticsVo.setChoiceProportion(subjectAndOptionVo.getChoiceProportion());
optionStatisticsVos.add(optionStatisticsVo);
}
} else {
//如果没数据返回问卷模板
for (QuestionnaireTaskStatisticsVo subjectAndOptionVo : subjectAndOptionVos) {
QuestionnaireTaskOptionStatisticsVo optionStatisticsVo = new QuestionnaireTaskOptionStatisticsVo();
optionStatisticsVo.setQuestionInfoId(questionnaireTaskStatisticsDto.getQuestionInfoId());
optionStatisticsVo.setQuestionSubjectOptionId(subjectAndOptionVo.getQuestionSubjectOptionId());
optionStatisticsVo.setOptionName(subjectAndOptionVo.getOptionName());
optionStatisticsVo.setQuestionNumber(subjectAndOptionVo.getQuestionNumber());
optionStatisticsVo.setChoiceProportion(BigDecimal.ZERO);
optionStatisticsVo.setChoiceNumber(0L);
optionStatisticsVos.add(optionStatisticsVo);
} }
} }
return AjaxResult.success(questionnaireTaskStatisticsVos); //根据题号组装数据类型
List<BigDecimal> questionNumberList = subjectAndOptionVos.stream().filter(Objects::nonNull)
.filter(item -> item.getQuestionType().equals(QuestionSubjectTypeEnum.MULTIPLE_CHOICE.getInfo()) || item.getQuestionType().equals(QuestionSubjectTypeEnum.MULTIPLE_CHOICE_QUESTIONS.getInfo()))
.map(QuestionnaireTaskStatisticsVo::getQuestionNumber).distinct().collect(Collectors.toList());
for (BigDecimal questionNumber : questionNumberList) {
QuestionnaireTaskStatisticsVo questionnaireTaskStatisticsVo = new QuestionnaireTaskStatisticsVo();
List<QuestionnaireTaskOptionStatisticsVo> collect = optionStatisticsVos.stream().filter(Objects::nonNull).filter(item -> questionNumber.equals(item.getQuestionNumber())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(collect)) {
questionnaireTaskStatisticsVo.setQuestionnaireName(collect.get(0).getQuestionnaireName());
questionnaireTaskStatisticsVo.setCreateTime(collect.get(0).getCreateTime());
questionnaireTaskStatisticsVo.setQuestionName(collect.get(0).getQuestionName());
questionnaireTaskStatisticsVo.setQuestionNumber(collect.get(0).getQuestionNumber());
questionnaireTaskStatisticsVo.setQuestionnaireTaskOptionStatisticsVos(collect);
output.add(questionnaireTaskStatisticsVo);
}
}
return AjaxResult.success(output);
} }
/** /**

View File

@ -1,9 +1,11 @@
package com.xinelu.manage.vo.statistics; package com.xinelu.manage.vo.statistics;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
/** /**
* @description: 问卷任务统计选项返回值 * @description: 问卷任务统计选项返回值
@ -75,4 +77,20 @@ public class QuestionnaireTaskOptionStatisticsVo {
* 选择比例 * 选择比例
*/ */
private BigDecimal choiceProportion; private BigDecimal choiceProportion;
/**
* 题目序号
*/
private BigDecimal questionNumber;
/**
* 问卷标题(上层数据使用)
*/
private String questionnaireName;
/**
* 创建时间(上层数据使用)
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
} }

View File

@ -22,6 +22,12 @@ public class QuestionnaireTaskStatisticsVo {
@ApiModelProperty(value = "问卷提交结果信息表id") @ApiModelProperty(value = "问卷提交结果信息表id")
private Long questionSubmitResultId; private Long questionSubmitResultId;
/**
* 问卷选项id
*/
@ApiModelProperty(value = "问卷选项id")
private Long questionSubmitId;
/** /**
* 问卷表id * 问卷表id
*/ */
@ -48,6 +54,36 @@ public class QuestionnaireTaskStatisticsVo {
@ApiModelProperty(value = "题目名称") @ApiModelProperty(value = "题目名称")
private String questionName; private String questionName;
/**
* 问卷选项提交结果信息表id
*/
@ApiModelProperty(value = "问卷选项提交结果信息表id")
private Long patientQuestionOptionResult;
/**
* 问卷选项信息表id
*/
@ApiModelProperty(value = "问卷选项信息表id")
private Long questionSubjectOptionId;
/**
* 问卷选项名称
*/
@ApiModelProperty(value = "问卷选项名称")
private String optionName;
/**
* 问卷选项排序
*/
@ApiModelProperty(value = "问卷选项排序")
private Long optionSort;
/**
* 问卷选项是否选择
*/
@ApiModelProperty(value = "问卷选项是否选择")
private Integer optionChooseSign;
/** /**
* 填写问卷总数 * 填写问卷总数
*/ */
@ -69,4 +105,14 @@ public class QuestionnaireTaskStatisticsVo {
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime; private LocalDateTime createTime;
/**
* 填写问卷总数
*/
private Long manageRouteNodeId;
/**
* 选择比例
*/
private BigDecimal choiceProportion;
} }

View File

@ -0,0 +1,37 @@
<?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.xinelu.manage.mapper.aiob.AIOBCallbackMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.xinelu.manage.domain.aiob.AIOBCallbackEntity">
<id column="id" property="id" />
<result column="callback_type" property="callbackType" />
<result column="callback_data" property="callbackData" />
<result column="read_state" property="readState" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, callback_type, callback_data, read_state, create_date, update_date
</sql>
<select id="getList" parameterType="AIOBCallbackEntity" resultMap="BaseResultMap">
select id, callback_type, callback_data, read_state, create_date, update_date from aiob_callback_data
<where>
<if test="readState != null">
and read_state = #{readState}
</if>
</where>
</select>
<update id="updateReadState">
update aiob_callback_data set read_state = #{readState}, update_date = sysdate()
where id = #{id}
</update>
<delete id="deleteData">
delete from aiob_callback_data where read_state = 1 and DATE(create_date) &lt; DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
</delete>
</mapper>

View File

@ -369,4 +369,20 @@
from question_subject from question_subject
where question_info_id = #{questionInfoId} where question_info_id = #{questionInfoId}
</delete> </delete>
<select id="selectQuestionnaireByQuestionnaireId"
resultType="com.xinelu.manage.vo.statistics.QuestionnaireTaskStatisticsVo">
select qs.question_info_id,
qs.id questionSubjectId,
qs.question_number,
qs.question_type,
qs.question_name,
qso.id questionSubjectOptionId,
qso.option_name,
qso.option_sort
from question_subject qs
LEFT JOIN question_subject_option qso ON qso.questionnaire_subject_id = qs.id
where qs.question_info_id = #{questionnaireId}
order by qs.question_number ASC, qso.id ASC
</select>
</mapper> </mapper>

View File

@ -0,0 +1,57 @@
package com.xinelu.quartz.task;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.exceptions.ClientException;
import com.xinelu.manage.domain.aiob.AIOBCallbackEntity;
import com.xinelu.manage.dto.aiob.TaskCallbackDataDto;
import com.xinelu.manage.service.aiob.IAIOBCallbackService;
import com.xinelu.manage.service.aiob.IAIOBService;
import java.util.List;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/**
* @description: 获取百度外呼回调数据
* @author: haown
* @create: 2025-12-23 15:12
**/
@Slf4j
@Component("GetAiobCallbackDataTask")
public class GetAiobCallbackDataTask {
@Resource
private IAIOBService aiobService;
@Resource
private IAIOBCallbackService aiobCallbackService;
public void syncCallbackData() {
log.info("开始执行同步百度外呼回调数据定时任务......");
AIOBCallbackEntity aiobCallbackEntity = new AIOBCallbackEntity();
aiobCallbackEntity.setReadState(0);
List<AIOBCallbackEntity> callbackEntityList = aiobCallbackService.getList(aiobCallbackEntity);
if (!CollectionUtils.isEmpty(callbackEntityList)) {
// 回调数据解析
callbackEntityList.forEach(callbackEntity -> {
// JSONString TaskCallbackDataDto
TaskCallbackDataDto taskCallbackDataDto = JSON.parseObject(callbackEntity.getCallbackData(), TaskCallbackDataDto.class);
try {
// 执行回调
aiobService.taskCallBack(callbackEntity.getCallbackType(), taskCallbackDataDto);
// 修改阿里云服务器回调数据已读状态
aiobCallbackService.updateReadState(1, callbackEntity.getId());
} catch (ClientException e) {
throw new RuntimeException(e);
}
});
}
log.info("完成同步百度外呼回调数据定时任务......");
}
public void clearCallbackData() {
log.info("开始执行清除过期的百度外呼回调数据定时任务......");
// 清除一个月前的数据
int count = aiobCallbackService.deleteData();
log.info("完成清除过期的百度外呼回调数据定时任务,共清除" + count +"条......");
}
}