新增了病例交流1

This commit is contained in:
wucongxing8150 2025-05-30 16:32:38 +08:00
parent 257b08d28e
commit 82c2055756
8 changed files with 469 additions and 4 deletions

View File

@ -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<CaseExchangeLabelModel> caseExchangeLabelQueryWrapper = new LambdaQueryWrapper<>();
caseExchangeLabelQueryWrapper.eq(CaseExchangeLabelModel::getExchangeId, caseExchange.getExchangeId());
List<CaseExchangeLabelModel> 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<T> 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();
}
}

View File

@ -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<CaseExchangeModel> {
public interface CaseExchangeLabelDao extends BaseMapper<CaseExchangeLabelModel> {
}

View File

@ -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<StatsCaseExchangeUserModel> {
/**
* 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);
}

View File

@ -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<CaseExchangeLabelDto> caseExchangeLabel;
/**
* 列表
*/
@ -137,6 +144,11 @@ public class CaseExchangeDto {
dto.setCaseExchangeVote(listDto);
}
if (model.getCaseExchangeLabel() != null) {
List<CaseExchangeLabelDto> 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<CaseExchangeLabelDto> listDto = CaseExchangeLabelDto.GetListDto(model.getCaseExchangeLabel());
dto.setCaseExchangeLabel(listDto);
}
return dto;
}

View File

@ -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<CaseExchangeLabelDto> GetListDto(List<CaseExchangeLabelModel> 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;
}
}

View File

@ -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<CaseExchangeLabelModel> caseExchangeLabel;
}

View File

@ -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<CaseExchangeLabelRequest> 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<CaseExchangeVoteOptionRequest> 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; // 标签名称
}
}

View File

@ -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<addCaseExchange.CaseExchangeVoteOptionRequest> 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<addCaseExchange.CaseExchangeLabelRequest> 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<StatsCaseExchangeModel> 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<StatsCaseExchangeUserModel> 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;
}
}