diff --git a/tcm/src/main/java/com/ccsens/tcm/api/DebugController.java b/tcm/src/main/java/com/ccsens/tcm/api/DebugController.java index ae5014cb..5e9e3c22 100644 --- a/tcm/src/main/java/com/ccsens/tcm/api/DebugController.java +++ b/tcm/src/main/java/com/ccsens/tcm/api/DebugController.java @@ -32,13 +32,5 @@ public class DebugController { return JsonResponse.newInstance().ok("测试"); } - @ApiOperation(value = "/测试",notes = "") - @ApiImplicitParams({ - }) - @RequestMapping(value="aaa",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"}) - public JsonResponse question(HttpServletRequest request) throws Exception { - List reportCodeVoList = importService.getQuestion(); - return JsonResponse.newInstance().ok(reportCodeVoList); - } } diff --git a/tcm/src/main/java/com/ccsens/tcm/api/InpatientController.java b/tcm/src/main/java/com/ccsens/tcm/api/InpatientController.java new file mode 100644 index 00000000..82613157 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/api/InpatientController.java @@ -0,0 +1,41 @@ +package com.ccsens.tcm.api; + +import com.ccsens.tcm.bean.dto.CodeVo; +import com.ccsens.tcm.bean.vo.InpatientVo; +import com.ccsens.tcm.bean.vo.QuestionVo; +import com.ccsens.tcm.service.IInpatientService; +import com.ccsens.util.JsonResponse; +import com.ccsens.util.bean.dto.QueryDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author 逗 + */ +@Slf4j +@Api(tags = "对照组相关接口") +@RestController +@RequestMapping("/inpatient") +public class InpatientController { + @Resource + private IInpatientService inpatientService; + + @ApiOperation(value = "查询所有对照组的信息",notes = "") + @ApiImplicitParams({}) + @RequestMapping(value="/query",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) + public JsonResponse> queryInpatient() throws Exception { + List inpatientInfos = inpatientService.queryInpatient(); + return JsonResponse.newInstance().ok(inpatientInfos); + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/api/PatientController.java b/tcm/src/main/java/com/ccsens/tcm/api/PatientController.java index 8335267a..beb279f6 100644 --- a/tcm/src/main/java/com/ccsens/tcm/api/PatientController.java +++ b/tcm/src/main/java/com/ccsens/tcm/api/PatientController.java @@ -76,4 +76,5 @@ public class PatientController { return JsonResponse.newInstance().ok(selSearchCriteriaList); } + } diff --git a/tcm/src/main/java/com/ccsens/tcm/api/QuestionController.java b/tcm/src/main/java/com/ccsens/tcm/api/QuestionController.java new file mode 100644 index 00000000..42bfeef9 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/api/QuestionController.java @@ -0,0 +1,51 @@ +package com.ccsens.tcm.api; + +import com.ccsens.tcm.bean.dto.CodeVo; +import com.ccsens.tcm.bean.dto.QuestionDto; +import com.ccsens.tcm.bean.vo.QuestionVo; +import com.ccsens.tcm.service.IImportService; +import com.ccsens.util.JsonResponse; +import com.ccsens.util.bean.dto.QueryDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author 逗 + */ +@Slf4j +@Api(tags = "试题相关接口") +@RestController +@RequestMapping("/question") +public class QuestionController { + @Resource + private IImportService importService; + + + @ApiOperation(value = "按code查看题目信息,code为空则查询全部",notes = "") + @ApiImplicitParams({}) + @RequestMapping(value="/queryAll",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) + public JsonResponse question(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { + List reportCodeVoList = importService.getQuestion(params.getParam()); + return JsonResponse.newInstance().ok(reportCodeVoList); + } + +// @ApiOperation(value = "查看试题及患者的答案",notes = "") +// @ApiImplicitParams({}) +// @RequestMapping(value="/query",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"}) +// public JsonResponse> queryQuestionAndAnswer(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { +// List patientCodes = importService.getQuestionAndAnswer(params.getParam()); +// return JsonResponse.newInstance().ok(patientCodes); +// } + +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/dto/CodeVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/dto/CodeVo.java new file mode 100644 index 00000000..f5169e7e --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/dto/CodeVo.java @@ -0,0 +1,19 @@ +package com.ccsens.tcm.bean.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author 逗 + */ +@Data +public class CodeVo { + @Data + @ApiModel("试题类型") + public static class QuestionCode { + @ApiModelProperty("code") + private String code; + } + +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/dto/PatientDto.java b/tcm/src/main/java/com/ccsens/tcm/bean/dto/PatientDto.java index 0e40656b..e3c1e534 100644 --- a/tcm/src/main/java/com/ccsens/tcm/bean/dto/PatientDto.java +++ b/tcm/src/main/java/com/ccsens/tcm/bean/dto/PatientDto.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import sun.awt.ConstrainableGraphics; import javax.validation.constraints.Max; import javax.validation.constraints.Min; diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionDto.java b/tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionDto.java new file mode 100644 index 00000000..d65855a6 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/dto/QuestionDto.java @@ -0,0 +1,20 @@ +package com.ccsens.tcm.bean.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author 逗 + */ +@Data +public class QuestionDto { + @Data + @ApiModel("查询患者答题信息及答案") + public static class QueryQuestionAndAnswer { + @ApiModelProperty("试题code") + private String code; + @ApiModelProperty("第几次录入信息,1代表第0天或180天,2代表第14天或者第365天,3代表第90天") + private int nums; + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/vo/InpatientVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/vo/InpatientVo.java new file mode 100644 index 00000000..0d3977b5 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/bean/vo/InpatientVo.java @@ -0,0 +1,23 @@ +package com.ccsens.tcm.bean.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author 逗 + */ +public class InpatientVo { + @Data + @ApiModel("查询所有对照组信息") + public static class InpatientInfo{ + @ApiModelProperty("对照组id") + private Long id; + @ApiModelProperty("名称") + private String name; + @ApiModelProperty("备注") + private String remarks; + @ApiModelProperty("采集次数") + private int collectionNum; + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java b/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java index cec2dc37..9598aad7 100644 --- a/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java +++ b/tcm/src/main/java/com/ccsens/tcm/bean/vo/QuestionVo.java @@ -1,5 +1,7 @@ package com.ccsens.tcm.bean.vo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @@ -75,4 +77,69 @@ public class QuestionVo { //选择之后关联的题目 private List questionVos; } + + @Data + @ApiModel("患者信息的试题类型") + public static class PatientCode { + @ApiModelProperty("id") + private Long id; + @ApiModelProperty("code") + private String code; + @ApiModelProperty("名称") + private String name; + @ApiModelProperty("是否为必做 0否 1是") + private byte must; + @ApiModelProperty("排序") + private int sort; + @ApiModelProperty("备注") + private String remark; + @ApiModelProperty("第几次记录,默认为0代表第一次记录,14代表第14天记录的信息") + private int reportNums; + @ApiModelProperty("记录类型 0:只记录1次数据,1:记录3次,分别为0,14,90天 ,2:记录两次,分别是180,365") + private byte reportType; + @ApiModelProperty("题目信息") + private List questionList; + @ApiModelProperty("子类型") + private List subCodes; + } + + @Data + @ApiModel("患者的答题信息试题") + public static class PatientQuestion { + @ApiModelProperty("id") + private Long id; + @ApiModelProperty("题目名称") + private String question; + @ApiModelProperty("排序") + private int sort; + @ApiModelProperty("单位例如 g/L") + private String units; + @ApiModelProperty("类型 1单行文本,2多行文本,3单选,4多选,5下拉菜单,6日期,7图片(文件),8单选+其他,9多选+其他,10下拉+其他,11多选+其他+说明,12单选+关联其他内容 13数字类型") + private byte type; + @ApiModelProperty("备注") + private String remark; + @ApiModelProperty("答案") + private String answer; + @ApiModelProperty("选项信息") + private List optionVos; + } + + @Data + @ApiModel("患者的答案") + public static class PatientOption { + @ApiModelProperty("id") + private Long id; + @ApiModelProperty("排序") + private int sort; + @ApiModelProperty("显示值") + private String showValue; + @ApiModelProperty("提交值") + private String submitValue; + @ApiModelProperty("是否被选中 0否 1是") + private byte choose; + @ApiModelProperty("选择之后的操作 0无 1单行文本 2多行文本 3关联其他题目") + private byte afterOperation; + @ApiModelProperty("选择之后关联的题目") + private List questionVos; + } } diff --git a/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionDao.java b/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionDao.java index 0b3de52d..666bc7f8 100644 --- a/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionDao.java +++ b/tcm/src/main/java/com/ccsens/tcm/persist/dao/QuestionDao.java @@ -26,4 +26,11 @@ public interface QuestionDao extends QuestionMapper { * @return code下的题目信息包括选项 */ List queryQuestionByCode(@Param("code") String code); + + /** + * 通过选项id查看选项关联的题目信息 + * @param optionId 选项id + * @return 返回题目id + */ + List queryQuestionByOption(@Param("optionId")Long optionId); } diff --git a/tcm/src/main/java/com/ccsens/tcm/service/IImportService.java b/tcm/src/main/java/com/ccsens/tcm/service/IImportService.java index f2ee9cae..8d00842a 100644 --- a/tcm/src/main/java/com/ccsens/tcm/service/IImportService.java +++ b/tcm/src/main/java/com/ccsens/tcm/service/IImportService.java @@ -1,5 +1,6 @@ package com.ccsens.tcm.service; +import com.ccsens.tcm.bean.dto.CodeVo; import com.ccsens.tcm.bean.vo.QuestionVo; import java.io.File; @@ -29,7 +30,8 @@ public interface IImportService { /** * 查询所有题目 - * @return + * @return 返回题目信息 + * @param param code */ - List getQuestion(); + List getQuestion(CodeVo.QuestionCode param); } diff --git a/tcm/src/main/java/com/ccsens/tcm/service/IInpatientService.java b/tcm/src/main/java/com/ccsens/tcm/service/IInpatientService.java new file mode 100644 index 00000000..4c92491c --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/service/IInpatientService.java @@ -0,0 +1,18 @@ +package com.ccsens.tcm.service; + +import com.ccsens.tcm.bean.vo.InpatientVo; + +import java.util.List; + +/** + * @author 逗 + */ +public interface IInpatientService { + + /** + * 查看所有对照组 + * @return 返回对照组信息 + */ + List queryInpatient(); + +} diff --git a/tcm/src/main/java/com/ccsens/tcm/service/ImportService.java b/tcm/src/main/java/com/ccsens/tcm/service/ImportService.java index 81cd7761..3d705a37 100644 --- a/tcm/src/main/java/com/ccsens/tcm/service/ImportService.java +++ b/tcm/src/main/java/com/ccsens/tcm/service/ImportService.java @@ -2,6 +2,8 @@ package com.ccsens.tcm.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.StrUtil; +import com.ccsens.tcm.bean.dto.CodeVo; import com.ccsens.tcm.bean.po.*; import com.ccsens.tcm.bean.vo.QuestionVo; import com.ccsens.tcm.persist.dao.QuestionDao; @@ -82,6 +84,8 @@ public class ImportService implements IImportService { List optionList = new ArrayList<>(); //关联的选项的id + Long questionId = null; + Long optionQuestionId = null; Long optionId = null; for(Object[] objs : questions) { if (objs == null || objs.length < 4 || StringUtils.isEmpty(objs[2])) { @@ -94,13 +98,14 @@ public class ImportService implements IImportService { switch (type) { case "题目" : Question question = initQuestion(objs, code, sort,null); + questionId = question.getId(); questionList.add(question); break; case "选项" : if (questionList.isEmpty()) { break; } - QuestionOption option = initOption(objs, questionList.get(questionList.size()-1).getId(), sort); + QuestionOption option = initOption(objs, questionId, sort); optionList.add(option); optionId = option.getId(); break; @@ -110,12 +115,13 @@ public class ImportService implements IImportService { } Question relevanceQuestion = initQuestion(objs, code, sort, optionId); questionList.add(relevanceQuestion); + optionQuestionId = relevanceQuestion.getId(); break; case "关联题目的选项" : if (questionList.isEmpty()) { break; } - QuestionOption relevanceOption = initOption(objs, questionList.get(questionList.size()-1).getId(), sort); + QuestionOption relevanceOption = initOption(objs, optionQuestionId, sort); optionList.add(relevanceOption); break; default: @@ -231,29 +237,88 @@ public class ImportService implements IImportService { if(CollectionUtil.isNotEmpty(reportCodeVos)){ reportCodeVos.forEach(reportCodeVo -> { //查询类型下的题目 - - - reportCodeVo.setQuestionVos(questionDao.queryQuestionByCode(reportCodeVo.getCode())); + List questionVos = getQuestionByCode(reportCodeVo.getCode()); + reportCodeVo.setQuestionVos(questionVos); + //查询子类型下的题目 if(CollectionUtil.isNotEmpty(reportCodeVo.getSubReportCodes())){ reportCodeVo.getSubReportCodes().forEach(subReportCode -> { - //查询子类型下的题目 - subReportCode.setQuestionVos(questionDao.queryQuestionByCode(subReportCode.getCode())); + List subCodeQuestionVos = getQuestionByCode(subReportCode.getCode()); + subReportCode.setQuestionVos(subCodeQuestionVos); + }); + } + }); + //移除原有的试题 + redisUtil.lRemoveLast(Constant.Redis.CODE_QUESTION); + //添加最新的试题 + redisUtil.lSet(Constant.Redis.CODE_QUESTION,reportCodeVos); + } + } + + /** + * 根据code查找题目 + */ + private List getQuestionByCode(String code) { + List subCodeQuestionVos = questionDao.queryQuestionByCode(code); + if(CollectionUtil.isNotEmpty(subCodeQuestionVos)){ + subCodeQuestionVos.forEach(question -> { + if(CollectionUtil.isNotEmpty(question.getOptionVos())){ + question.getOptionVos().forEach(option -> { + if(option.getAfterOperation() == Constant.AFTER_OPERATION){ + option.setQuestionVos(queryOptionQuestion(option.getId())); + } + }); + } + }); + } + return subCodeQuestionVos; + } + + /** + * 查看选项下关联的题目 + */ + private List queryOptionQuestion(Long optionId){ + List questionVos = questionDao.queryQuestionByOption(optionId); + if(CollectionUtil.isNotEmpty(questionVos)){ + questionVos.forEach(question -> { + if(CollectionUtil.isNotEmpty(question.getOptionVos())){ + question.getOptionVos().forEach(option -> { + if(option.getAfterOperation() == Constant.AFTER_OPERATION){ + option.setQuestionVos(queryOptionQuestion(option.getId())); + } }); } }); } - //将试题信息更新进redis - redisUtil.lSet(Constant.Redis.CODE_QUESTION,reportCodeVos); + return questionVos; } + /** * 查看类型下的试题信息 + * @param param */ @Override - public List getQuestion() { - Object objects = redisUtil.lGet(Constant.Redis.CODE_QUESTION, 0, -1); - List reportCodeVos = (List)objects; + public List getQuestion(CodeVo.QuestionCode param) { + List reportCode = new ArrayList<>(); - return reportCodeVos; + List objects = redisUtil.lGet(Constant.Redis.CODE_QUESTION, 0, -1); + List reportCodeVos = (List)objects.get(0); + if(CollectionUtil.isNotEmpty(reportCodeVos)){ + if(StrUtil.isEmpty(param.getCode())){ + return reportCodeVos; + } + reportCodeVos.forEach(reportCodeVo -> { + if(reportCodeVo.getCode().equalsIgnoreCase(param.getCode())){ + reportCode.add(reportCodeVo); + }else if(CollectionUtil.isNotEmpty(reportCodeVo.getSubReportCodes())){ + reportCodeVo.getSubReportCodes().forEach(subReport ->{ + if(subReport.getCode().equalsIgnoreCase(param.getCode())){ + reportCode.add(subReport); + } + }); + } + }); + } + return reportCode; } } diff --git a/tcm/src/main/java/com/ccsens/tcm/service/InpatientService.java b/tcm/src/main/java/com/ccsens/tcm/service/InpatientService.java new file mode 100644 index 00000000..3c2d8cd3 --- /dev/null +++ b/tcm/src/main/java/com/ccsens/tcm/service/InpatientService.java @@ -0,0 +1,44 @@ +package com.ccsens.tcm.service; + +import cn.hutool.core.bean.BeanUtil; +import com.ccsens.tcm.bean.po.Inpatient; +import com.ccsens.tcm.bean.po.InpatientExample; +import com.ccsens.tcm.bean.vo.InpatientVo; +import com.ccsens.tcm.persist.mapper.InpatientMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author 逗 + */ +/** + * @author 逗 + */ +@Slf4j +@Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +public class InpatientService implements IInpatientService{ + @Resource + private InpatientMapper inpatientMapper; + + @Override + public List queryInpatient() { + List inpatientInfos = new ArrayList<>(); + + InpatientExample inpatientExample = new InpatientExample(); + inpatientExample.clear(); + List inpatients = inpatientMapper.selectByExample(inpatientExample); + inpatients.forEach(inpatient -> { + InpatientVo.InpatientInfo inpatientInfo = new InpatientVo.InpatientInfo(); + BeanUtil.copyProperties(inpatient,inpatientInfo); + inpatientInfos.add(inpatientInfo); + }); + return inpatientInfos; + } +} diff --git a/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java b/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java index 2b1f7c5d..c9466f2c 100644 --- a/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java +++ b/tcm/src/main/java/com/ccsens/tcm/uitl/Constant.java @@ -21,6 +21,9 @@ public class Constant { /**上传图片访问路径*/ public static final String UPLOAD_URL = "uploads/"; + + /**选择选项后关联其他题目*/ + public final static byte AFTER_OPERATION = 3; /**数字默认值*/ public final static byte NUMBER_DEFAULT = 0; /**排序默认值*/ diff --git a/tcm/src/main/resources/application.yml b/tcm/src/main/resources/application.yml index a47f2a7b..f59084b0 100644 --- a/tcm/src/main/resources/application.yml +++ b/tcm/src/main/resources/application.yml @@ -1,6 +1,5 @@ spring: profiles: - active: dev - include: common, util-dev - + active: test + include: common, util-test diff --git a/tcm/src/main/resources/mapper_dao/QuestionDao.xml b/tcm/src/main/resources/mapper_dao/QuestionDao.xml index eccbb8c2..c9797c70 100644 --- a/tcm/src/main/resources/mapper_dao/QuestionDao.xml +++ b/tcm/src/main/resources/mapper_dao/QuestionDao.xml @@ -74,5 +74,30 @@ and q.`code` = #{code} + + \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/RedisUtil.java b/util/src/main/java/com/ccsens/util/RedisUtil.java index 46975d57..fcbe16d6 100644 --- a/util/src/main/java/com/ccsens/util/RedisUtil.java +++ b/util/src/main/java/com/ccsens/util/RedisUtil.java @@ -1,5 +1,6 @@ package com.ccsens.util; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; @@ -566,6 +567,21 @@ public class RedisUtil { return 0; } } + + /** + * 移除列表的最后一个值 + * @param key 键 + */ + public Object lRemoveLast(String key) { + try { + Object o = redisTemplate.opsForList().leftPop(key); + return o; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + //===============================zset================================= /** * 获取sort set缓存的内容