diff --git a/src/main/java/com/example/caseData/controller/CaseExchangeController.java b/src/main/java/com/example/caseData/controller/CaseExchangeController.java index 02c07b1..9dd9fb9 100644 --- a/src/main/java/com/example/caseData/controller/CaseExchangeController.java +++ b/src/main/java/com/example/caseData/controller/CaseExchangeController.java @@ -5,11 +5,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.caseData.common.Response; import com.example.caseData.dao.*; +import com.example.caseData.dto.T; import com.example.caseData.dto.caseClinicalArticle.CaseClinicalArticleDto; import com.example.caseData.dto.caseExchange.CaseExchangeDto; import com.example.caseData.dto.caseExchangeVote.CaseExchangeVoteDto; import com.example.caseData.dto.caseExchangeVoteOption.CaseExchangeVoteOptionDto; +import com.example.caseData.exception.BusinessException; import com.example.caseData.model.*; +import com.example.caseData.request.CaseClinicalArticleRequest.addClinicalArticleComment; +import com.example.caseData.request.caseExchangeRequest.addCaseExchange; import com.example.caseData.request.caseExchangeRequest.getCaseExchangeSearchPage; import com.example.caseData.service.CaseExchangeService; import com.example.caseData.utils.Replace; @@ -44,6 +48,9 @@ public class CaseExchangeController { @Resource private CaseExchangeVoteDao caseExchangeVoteDao; + @Resource + private CaseExchangeLabelDao caseExchangeLabelDao; + @Resource private CaseExchangeVoteOptionDao caseExchangeVoteOptionDao; @@ -187,6 +194,14 @@ public class CaseExchangeController { caseExchange.setCaseExchangeVote(caseExchangeVote); } + // 获取标签数据 + LambdaQueryWrapper caseExchangeLabelQueryWrapper = new LambdaQueryWrapper<>(); + caseExchangeLabelQueryWrapper.eq(CaseExchangeLabelModel::getExchangeId, caseExchange.getExchangeId()); + List caseExchangeLabels = caseExchangeLabelDao.selectList(caseExchangeLabelQueryWrapper); + if (caseExchangeLabels != null && !caseExchangeLabels.isEmpty()) { + caseExchange.setCaseExchangeLabel(caseExchangeLabels); + } + // 处理返回值 CaseExchangeDto g = CaseExchangeDto.GetDto(caseExchange); @@ -305,5 +320,29 @@ public class CaseExchangeController { return Response.success(g); } + /** + * 病例交流-新增 + */ + @PostMapping("/exchange") + public Response AddCaseExchange( + @Validated() + @RequestBody addCaseExchange request + ) { + String userId = (String) httpServletRequest.getAttribute("userId"); + if (userId == null) { + return Response.error("操作失败"); + } + + try { + boolean res = caseExchangeService.AddCaseExchange(userId,request); + if (!res){ + return Response.error("操作失败"); + } + } catch (BusinessException e) { + return Response.error(e.getMessage()); + } + + return Response.success(); + } } diff --git a/src/main/java/com/example/caseData/dao/CaseExchangeLabelDao.java b/src/main/java/com/example/caseData/dao/CaseExchangeLabelDao.java index 0b2fa47..6ddcd66 100644 --- a/src/main/java/com/example/caseData/dao/CaseExchangeLabelDao.java +++ b/src/main/java/com/example/caseData/dao/CaseExchangeLabelDao.java @@ -1,9 +1,10 @@ package com.example.caseData.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.caseData.model.CaseExchangeLabelModel; import com.example.caseData.model.CaseExchangeModel; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface CaseExchangeLabelDao extends BaseMapper { +public interface CaseExchangeLabelDao extends BaseMapper { } diff --git a/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java b/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java index 0246966..ad76908 100644 --- a/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java +++ b/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java @@ -8,10 +8,30 @@ import com.example.caseData.model.CaseExchangeModel; import com.example.caseData.model.StatsCaseExchangeUserModel; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; import java.util.Map; @Mapper public interface StatsCaseExchangeUserDao extends BaseMapper { + /** + * Inc 自增 + * @param articleId 文章 ID + * @param field 字段名称 + * @param numeral 增加的数值 + * @return 更新的行数 + */ + @Update("UPDATE stats_case_exchange_user SET ${field} = ${field} + #{numeral} WHERE stats_id = #{statsId}") + int inc(@Param("statsId") Long articleId, @Param("field") String field, @Param("numeral") int numeral); + /** + * Dec 自减 + * + * @param articleId 文章 ID + * @param field 字段名称 + * @param numeral 减少的数值 + * @return 更新的行数 + */ + @Update("UPDATE stats_case_exchange_user SET ${field} = ${field} - #{numeral} WHERE stats_id = #{statsId}") + int dec(@Param("statsId") Long articleId, @Param("field") String field, @Param("numeral") int numeral); } diff --git a/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java b/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java index c8cccdb..e8e7448 100644 --- a/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java +++ b/src/main/java/com/example/caseData/dto/caseExchange/CaseExchangeDto.java @@ -2,6 +2,7 @@ package com.example.caseData.dto.caseExchange; import cn.hutool.core.bean.BeanUtil; import com.example.caseData.dto.caseClinicalArticleAuthor.CaseClinicalArticleAuthorDto; +import com.example.caseData.dto.caseExchangeLabel.CaseExchangeLabelDto; import com.example.caseData.dto.caseExchangeVote.CaseExchangeVoteDto; import com.example.caseData.dto.caseExchangeVoteOption.CaseExchangeVoteOptionDto; import com.example.caseData.model.CaseExchangeModel; @@ -111,6 +112,12 @@ public class CaseExchangeDto { @JsonProperty("case_exchange_vote") private CaseExchangeVoteDto caseExchangeVote; + /** + * 标签数据 + */ + @JsonProperty("case_exchange_label") + private List caseExchangeLabel; + /** * 列表 */ @@ -137,6 +144,11 @@ public class CaseExchangeDto { dto.setCaseExchangeVote(listDto); } + if (model.getCaseExchangeLabel() != null) { + List listDto = CaseExchangeLabelDto.GetListDto(model.getCaseExchangeLabel()); + dto.setCaseExchangeLabel(listDto); + } + return dto; }) .collect(Collectors.toList()); @@ -163,6 +175,12 @@ public class CaseExchangeDto { dto.setCaseExchangeVote(listDto); } + // 标签 + if (model.getCaseExchangeLabel() != null) { + List listDto = CaseExchangeLabelDto.GetListDto(model.getCaseExchangeLabel()); + dto.setCaseExchangeLabel(listDto); + } + return dto; } diff --git a/src/main/java/com/example/caseData/dto/caseExchangeLabel/CaseExchangeLabelDto.java b/src/main/java/com/example/caseData/dto/caseExchangeLabel/CaseExchangeLabelDto.java new file mode 100644 index 0000000..c4f987d --- /dev/null +++ b/src/main/java/com/example/caseData/dto/caseExchangeLabel/CaseExchangeLabelDto.java @@ -0,0 +1,98 @@ +package com.example.caseData.dto.caseExchangeLabel; + +import cn.hutool.core.bean.BeanUtil; +import com.example.caseData.model.CaseExchangeLabelModel; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +@Data +public class CaseExchangeLabelDto { + /** + * 主键id + */ + @JsonProperty("exchange_label_id") + private String exchangeLabelId; + + /** + * 临床文章id + */ + @JsonProperty("exchange_id") + private String exchangeId; + + /** + * app唯一标识 + */ + @JsonProperty("app_iden") + private String appIden; + + /** + * 标签名称 + */ + @JsonProperty("label_name") + private String labelName; + + /** + * 创建时间 + */ + @JsonProperty("created_at") + private LocalDateTime createdAt; + + /** + * 修改时间 + */ + @JsonProperty("updated_at") + private LocalDateTime updatedAt; + + /** + * 列表 + */ + public static List GetListDto(List models) { + if (models == null || models.isEmpty()) { + return Collections.emptyList(); + } + + return models.stream() + .map(model -> { + CaseExchangeLabelDto dto = BeanUtil.copyProperties(model, CaseExchangeLabelDto.class); + + // 示例:手动处理字段类型不一致 + if (model.getExchangeLabelId() != null) { + dto.setExchangeLabelId(String.valueOf(model.getExchangeLabelId())); // Long -> String + } + + if (model.getExchangeId() != null) { + dto.setExchangeId(String.valueOf(model.getExchangeId())); // Long -> String + } + + return dto; + }) + .collect(Collectors.toList()); + } + + /** + * 详情 + */ + public static CaseExchangeLabelDto GetDto(CaseExchangeLabelModel model) { + if (model == null) { + return null; + } + + CaseExchangeLabelDto dto = BeanUtil.copyProperties(model, CaseExchangeLabelDto.class); + + // 类型转换示例 + if (model.getExchangeLabelId() != null) { + dto.setExchangeLabelId(String.valueOf(model.getExchangeLabelId())); // Long -> String + } + + if (model.getExchangeId() != null) { + dto.setExchangeId(String.valueOf(model.getExchangeId())); // Long -> String + } + + return dto; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/caseData/model/CaseExchangeModel.java b/src/main/java/com/example/caseData/model/CaseExchangeModel.java index 0ad6462..7436e65 100644 --- a/src/main/java/com/example/caseData/model/CaseExchangeModel.java +++ b/src/main/java/com/example/caseData/model/CaseExchangeModel.java @@ -87,4 +87,11 @@ public class CaseExchangeModel { @TableField(exist = false) @JsonProperty("case_exchange_vote") private CaseExchangeVoteModel caseExchangeVote; + + /** + * 标签 + */ + @TableField(exist = false) + @JsonProperty("case_exchange_label") + private List caseExchangeLabel; } \ No newline at end of file diff --git a/src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchange.java b/src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchange.java new file mode 100644 index 0000000..5c1c5a0 --- /dev/null +++ b/src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchange.java @@ -0,0 +1,85 @@ +package com.example.caseData.request.caseExchangeRequest; + +import com.example.caseData.request.clinicalRequest.getClinicalArticleSearchPage; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; +import lombok.Data; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +public class addCaseExchange { + /** + * 标题 + */ + @NotEmpty(message = "请输入标题") + @JsonProperty("exchange_title") + private String exchangeTitle; + + /** + * 内容 + */ + @NotEmpty(message = "请输入内容") + @JsonProperty("exchange_content") + private String exchangeContent; + + /** + * 总结 + */ + @JsonProperty("exchange_summary") + private String exchangeSummary; + + /** + * 投票 + */ + @JsonProperty("case_exchange_vote") + private CaseExchangeVoteRequest caseExchangeVote; + + /** + * 标签 + */ + @JsonProperty("case_exchange_label") + private List caseExchangeLabel; + + /** + * 投票 + */ + @Data + public static class CaseExchangeVoteRequest { + @JsonProperty("vote_title") + @NotEmpty(message = "请输入投票标题") + private String voteTitle; // 选项标题 + + @JsonProperty("valid_day") + @Size(min = 1, max = 20, message = "有效期在1-20天内") + private Integer validDay; // 投票有效期天数 + + @JsonProperty("case_exchange_vote_option") + private List caseExchangeVoteOption; + } + + /** + * 投票选项 + */ + @Data + public static class CaseExchangeVoteOptionRequest { + @JsonProperty("option_value") + private String optionValue; // 选项 + } + + /** + * 标签 + */ + @Data + public static class CaseExchangeLabelRequest { + @JsonProperty("app_iden") + private String appIden; // app唯一标识 + + @JsonProperty("label_name") + private String labelName; // 标签名称 + } +} diff --git a/src/main/java/com/example/caseData/service/CaseExchangeService.java b/src/main/java/com/example/caseData/service/CaseExchangeService.java index 154860b..5a1ab95 100644 --- a/src/main/java/com/example/caseData/service/CaseExchangeService.java +++ b/src/main/java/com/example/caseData/service/CaseExchangeService.java @@ -1,11 +1,18 @@ package com.example.caseData.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.example.caseData.dao.UserCollectClinicalArticleDao; -import com.example.caseData.dao.UserCollectExchangeDao; -import com.example.caseData.model.UserCollectExchangeModel; +import com.example.caseData.dao.*; +import com.example.caseData.exception.BusinessException; +import com.example.caseData.model.*; +import com.example.caseData.request.caseExchangeRequest.addCaseExchange; +import com.example.caseData.utils.Replace; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; @Service public class CaseExchangeService { @@ -13,6 +20,152 @@ public class CaseExchangeService { @Resource private UserCollectExchangeDao userCollectExchangeDao; + @Resource + private BasicSensitiveWordService basicSensitiveWordService; + + @Resource + private CaseExchangeDao caseExchangeDao; + + @Resource + private CaseExchangeVoteDao caseExchangeVoteDao; + + @Resource + private CaseExchangeVoteOptionDao caseExchangeVoteOptionDao; + + @Resource + private StatsCaseExchangeDao statsCaseExchangeDao; + + @Resource + private CaseExchangeLabelDao caseExchangeLabelDao; + + @Resource + private StatsCaseExchangeUserDao statsCaseExchangeUserDao; + + /** + * 新增-病例交流 + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean AddCaseExchange(String userId, addCaseExchange r){ + // 验证入参数据 + if (r.getCaseExchangeVote() != null){ + if (r.getCaseExchangeVote().getCaseExchangeVoteOption() == null){ + throw new BusinessException("缺少选项"); + } + + if (r.getCaseExchangeVote().getCaseExchangeVoteOption().size() > 5){ + throw new BusinessException("选项不可多余5项"); + } + + if (r.getCaseExchangeVote().getCaseExchangeVoteOption().size() < 2){ + throw new BusinessException("选项不可少于2项"); + } + + if (r.getCaseExchangeVote().getVoteTitle() == null){ + throw new BusinessException("请输入投票标题"); + } + + if (r.getCaseExchangeVote().getValidDay() < 1 || r.getCaseExchangeVote().getValidDay() > 20){ + throw new BusinessException("投票有效期在1-20天内"); + } + } + + if (r.getCaseExchangeLabel() != null && !r.getCaseExchangeLabel().isEmpty()){ + for (addCaseExchange.CaseExchangeLabelRequest caseExchangeLabelRequest : r.getCaseExchangeLabel()){ + if (caseExchangeLabelRequest.getAppIden() == null){ + throw new BusinessException("操作失败"); + } + + if (caseExchangeLabelRequest.getLabelName() == null){ + throw new BusinessException("操作失败"); + } + } + } + + // 处理违法内容 + BasicSensitiveWordService.FilterResult result = basicSensitiveWordService.filter(r.getExchangeContent()); + if (result.hasSensitive == 1){ + throw new BusinessException("内容中存在敏感词,请修改后提交"); + } + + if (r.getExchangeSummary() != null){ + result = basicSensitiveWordService.filter(r.getExchangeSummary()); + if (result.hasSensitive == 1){ + throw new BusinessException("总结中存在敏感词,请修改后提交"); + } + } + + // 新增病例交流 + CaseExchangeModel caseExchangeData = new CaseExchangeModel(); + caseExchangeData.setUserId(Long.valueOf(userId)); + caseExchangeData.setExchangeTitle(r.getExchangeTitle()); + caseExchangeData.setExchangeStatus(1); + caseExchangeData.setPushDate(LocalDateTime.now()); + caseExchangeData.setExchangeContent(r.getExchangeContent()); + caseExchangeData.setExchangeSummary(r.getExchangeSummary()); + int res = caseExchangeDao.insert(caseExchangeData); + if (res <= 0){ + throw new BusinessException("操作失败"); + } + + // 新增投票 + if (r.getCaseExchangeVote() != null){ + // 投票结束时间 + LocalDateTime endTime = LocalDateTime.now().plusDays(r.getCaseExchangeVote().getValidDay()); + + CaseExchangeVoteModel caseExchangeVoteData = new CaseExchangeVoteModel(); + caseExchangeVoteData.setExchangeId(caseExchangeData.getExchangeId()); + caseExchangeVoteData.setVoteTitle(r.getCaseExchangeVote().getVoteTitle()); + caseExchangeVoteData.setEndTime(endTime); + res = caseExchangeVoteDao.insert(caseExchangeVoteData); + if (res <= 0){ + throw new BusinessException("操作失败"); + } + + List caseExchangeVoteOption = r.getCaseExchangeVote().getCaseExchangeVoteOption(); + for (addCaseExchange.CaseExchangeVoteOptionRequest option : caseExchangeVoteOption ){ + CaseExchangeVoteOptionModel caseExchangeVoteOptionData = new CaseExchangeVoteOptionModel(); + caseExchangeVoteOptionData.setVoteId(caseExchangeVoteData.getVoteId()); + caseExchangeVoteOptionData.setOptionValue(option.getOptionValue()); + caseExchangeVoteOptionData.setVoteNum(0); + res = caseExchangeVoteOptionDao.insert(caseExchangeVoteOptionData); + if (res <= 0){ + throw new BusinessException("操作失败"); + } + } + } + + // 新增标签 + if (r.getCaseExchangeLabel() != null && !r.getCaseExchangeLabel().isEmpty()){ + // 验证标签数据-暂时无法验证,病例库不存标签库 + List caseExchangeLabel = r.getCaseExchangeLabel(); + for (addCaseExchange.CaseExchangeLabelRequest label : caseExchangeLabel ){ + CaseExchangeLabelModel caseExchangeLabelData = new CaseExchangeLabelModel(); + caseExchangeLabelData.setExchangeId(caseExchangeData.getExchangeId()); + caseExchangeLabelData.setAppIden(label.getAppIden()); + caseExchangeLabelData.setLabelName(label.getLabelName()); + res = caseExchangeLabelDao.insert(caseExchangeLabelData); + if (res <= 0){ + throw new BusinessException("操作失败"); + } + } + } + + // 新增病例交流统计 + if (!handleStatsCaseExchange()){ + throw new BusinessException("操作失败"); + } + + // 新增病例交流统计-用户 + if (!handleStatsCaseExchangeUser(userId)){ + throw new BusinessException("操作失败"); + } + + return true; + } + + /** * 获取用户收藏数据 * @param exchangeId 病例交流id @@ -27,4 +180,48 @@ public class CaseExchangeService { return userCollectExchangeDao.selectOne(mapQueryWrapper); } + + /** + * 新增病例交流统计 + * @return bool + */ + public boolean handleStatsCaseExchange(){ + LambdaQueryWrapper mapQueryWrapper = new LambdaQueryWrapper<>(); + StatsCaseExchangeModel statsCaseExchange = statsCaseExchangeDao.selectOne(mapQueryWrapper); + if (statsCaseExchange == null){ + // 新增 + StatsCaseExchangeModel statsCaseExchangeData = new StatsCaseExchangeModel(); + statsCaseExchangeData.setExchangeNum(1); + int res = statsCaseExchangeDao.insert(statsCaseExchangeData); + return res > 0; + }else{ + // 增加数量 + statsCaseExchangeDao.inc(statsCaseExchange.getStatsId(),"exchange_num",1); + } + + return true; + } + + /** + * 新增病例交流统计-用户 + * @return bool + */ + public boolean handleStatsCaseExchangeUser(String userId){ + LambdaQueryWrapper mapQueryWrapper = new LambdaQueryWrapper<>(); + mapQueryWrapper.eq(StatsCaseExchangeUserModel::getUserId, userId); + StatsCaseExchangeUserModel statsCaseExchangeUser = statsCaseExchangeUserDao.selectOne(mapQueryWrapper); + if (statsCaseExchangeUser == null){ + // 新增 + StatsCaseExchangeUserModel statsCaseExchangeUserData = new StatsCaseExchangeUserModel(); + statsCaseExchangeUserData.setUserId(Long.valueOf(userId)); + statsCaseExchangeUserData.setExchangeNum(1); + int res = statsCaseExchangeUserDao.insert(statsCaseExchangeUserData); + return res > 0; + }else{ + // 增加数量 + statsCaseExchangeUserDao.inc(statsCaseExchangeUser.getStatsId(),"exchange_num",1); + } + + return true; + } }