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:
commit
882d683f53
@ -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
|
||||||
|
|||||||
@ -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(新医路,用于宣教库公共库查询)
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
@ -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) < DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
|
||||||
|
</delete>
|
||||||
|
</mapper>
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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 +"条......");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user