Explorar el Código

根据手术号查询最近数据结果接口提交

wangzl hace 3 meses
padre
commit
503293298c

+ 37 - 3
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/controller/BaiLianPluginsController.java

@@ -5,6 +5,9 @@ import cn.tr.core.annotation.TenantIgnore;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.module.smart.app.controller.vo.DoctorClinicRoomVO;
 import cn.tr.module.smart.common.service.IBizClinicRoomService;
+import cn.tr.module.smart.common.vo.BizClinicAndAssessmentVO;
+import cn.tr.module.smart.common.vo.BizClinicAndDeviceVO;
+import cn.tr.module.smart.common.vo.BizClinicAndQuestionVO;
 import cn.tr.plugin.security.bo.UserLoginInfoBO;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -12,24 +15,55 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-@Api(tags = "百炼插件",hidden = true)
+@Api(tags = "百炼插件", hidden = true)
 @RestController
 @RequestMapping("/bailian/plugins")
 @AllArgsConstructor
 public class BaiLianPluginsController {
     @Autowired
     private IBizClinicRoomService clinicRoomService;
+
     @ApiOperationSupport(author = "lf", order = 1)
     @ApiOperation(value = "查询泵的输注信息", notes = "权限: 无")
     @GetMapping("/deviceInfo/{clinicId}")
     @TenantIgnore
     @SaIgnore
-    public CommonResult<DoctorClinicRoomVO> queryDeviceInfo(@PathVariable("clinicId") String clinicId){
+    public CommonResult<DoctorClinicRoomVO> queryDeviceInfo(@PathVariable("clinicId") String clinicId) {
         UserLoginInfoBO userLoginInfoBO = new UserLoginInfoBO();
         userLoginInfoBO.setUserId("1");
         LoginUserContextHolder.setUser(userLoginInfoBO);
         return CommonResult.success(clinicRoomService.selectAppBizClinicRoomById(clinicId));
     }
+
+    @ApiOperationSupport(author = "wangzl", order = 2)
+    @ApiOperation(value = "根据clinicId获取泵头输注信息", notes = "权限: 无")
+    @GetMapping("/deviceInfo/byClinicId/{clinicId}")
+    @TenantIgnore
+    @SaIgnore
+    public CommonResult<BizClinicAndDeviceVO> queryDeviceInfoByClinicId(@PathVariable("clinicId") String clinicId) {
+        return CommonResult.success(clinicRoomService.selectClinicAndDeviceByClinicId(clinicId));
+    }
+
+    @ApiOperationSupport(author = "wangzl", order = 3)
+    @ApiOperation(value = "根据clinicId最后一次问卷信息", notes = "权限: 无")
+    @GetMapping("/question/byClinicId/{clinicId}")
+    @TenantIgnore
+    @SaIgnore
+    public CommonResult<BizClinicAndQuestionVO> queryQuestionByClinicId(@PathVariable("clinicId") String clinicId) {
+        return CommonResult.success(clinicRoomService.selectClinicAndQuestionByClinicId(clinicId));
+    }
+
+    @ApiOperationSupport(author = "wangzl", order = 3)
+    @ApiOperation(value = "根据clinicId最后一次疼痛评价信息", notes = "权限: 无")
+    @GetMapping("/assessment/byClinicId/{clinicId}")
+    @TenantIgnore
+    @SaIgnore
+    public CommonResult<BizClinicAndAssessmentVO> queryAssessmentByClinicId(@PathVariable("clinicId") String clinicId) {
+        return CommonResult.success(clinicRoomService.selectClinicAndAssessmentByClinicId(clinicId));
+    }
 }

+ 13 - 4
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/repository/BizClinicRoomRepository.java

@@ -7,6 +7,10 @@ import cn.tr.module.smart.app.controller.vo.DoctorClinicRoomVO;
 import cn.tr.module.smart.app.controller.vo.WxDoctorClinicRoomThumbnailVO;
 import cn.tr.module.smart.common.dto.BizClinicRoomDTO;
 import cn.tr.module.smart.common.dto.BizClinicRoomQueryDTO;
+import cn.tr.module.smart.common.po.BizClinicRoomPO;
+import cn.tr.module.smart.common.vo.BizClinicAndAssessmentVO;
+import cn.tr.module.smart.common.vo.BizClinicAndDeviceVO;
+import cn.tr.module.smart.common.vo.BizClinicAndQuestionVO;
 import cn.tr.module.smart.web.dto.BizPatientClinicListDTO;
 import cn.tr.module.smart.wx.controller.vo.BizWxAppletClinicDetailVO;
 import cn.tr.module.smart.wx.dto.BizMpPublishInfoDTO;
@@ -15,7 +19,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
-import cn.tr.module.smart.common.po.BizClinicRoomPO;
 
 import java.util.Date;
 import java.util.List;
@@ -24,7 +27,7 @@ import java.util.List;
  * 诊疗室Mapper接口
  *
  * @author lf
- * @date  2025/06/09 10:59
+ * @date 2025/06/09 10:59
  **/
 @Repository
 @Mapper
@@ -34,7 +37,7 @@ public interface BizClinicRoomRepository extends BaseMapper<BizClinicRoomPO> {
     List<DoctorClinicRoomVO> selectByClinicRoomAndPatientList(@Param("source") AppDoctorClinicRoomDTO source);
 
 
-    BizClinicRoomPO stdWxAppletSelectByPatientCodeAndClinicStartTime(@Param("patientCode") String patientCode, @Param("clinicStartTime")Date clinicStartTime);
+    BizClinicRoomPO stdWxAppletSelectByPatientCodeAndClinicStartTime(@Param("patientCode") String patientCode, @Param("clinicStartTime") Date clinicStartTime);
 
     BizWxAppletClinicDetailVO stdSelectWxAppletById(@Param("id") String id);
 
@@ -47,5 +50,11 @@ public interface BizClinicRoomRepository extends BaseMapper<BizClinicRoomPO> {
     @TenantIgnore
     BizMpPublishInfoDTO selectMpPushTaskInfoById(@Param("clinicId") String clinicRoomId);
 
-    DoctorClinicRoomVO selectAppBizClinicRoomById(@Param("clinicId") String clinicId,@Param("currentUserId")String currentUserId);
+    DoctorClinicRoomVO selectAppBizClinicRoomById(@Param("clinicId") String clinicId, @Param("currentUserId") String currentUserId);
+
+    BizClinicAndDeviceVO selectClinicAndDeviceByClinicId(@Param("clinicId") String clinicId);
+
+    BizClinicAndQuestionVO selectClinicAndQuestionByClinicId(@Param("clinicId") String clinicId);
+
+    BizClinicAndAssessmentVO selectClinicAndAssessmentByClinicId(@Param("clinicId") String clinicId);
 }

+ 32 - 3
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizClinicRoomService.java

@@ -1,15 +1,20 @@
 package cn.tr.module.smart.common.service;
 
-import cn.tr.module.smart.app.controller.dto.*;
+import cn.tr.module.smart.app.controller.dto.AppDoctorClinicFinishDTO;
+import cn.tr.module.smart.app.controller.dto.AppDoctorClinicQueryByPatientCodeDTO;
+import cn.tr.module.smart.app.controller.dto.AppDoctorClinicRoomDTO;
 import cn.tr.module.smart.app.controller.vo.AppDoctorInfusionHistoryVO;
-import cn.tr.module.smart.app.controller.vo.WxDoctorClinicRoomThumbnailVO;
 import cn.tr.module.smart.app.controller.vo.DoctorClinicRoomVO;
+import cn.tr.module.smart.app.controller.vo.WxDoctorClinicRoomThumbnailVO;
+import cn.tr.module.smart.common.dto.BizClinicAddOrEditDTO;
 import cn.tr.module.smart.common.dto.BizClinicRoomDTO;
 import cn.tr.module.smart.common.dto.BizClinicRoomQueryDTO;
+import cn.tr.module.smart.common.vo.BizClinicAndAssessmentVO;
+import cn.tr.module.smart.common.vo.BizClinicAndDeviceVO;
+import cn.tr.module.smart.common.vo.BizClinicAndQuestionVO;
 import cn.tr.module.smart.wx.controller.vo.BizAiAgentParamVO;
 import cn.tr.module.smart.wx.controller.vo.BizWxAppletClinicDetailVO;
 import cn.tr.module.smart.wx.controller.vo.BizWxDeptQuestionVO;
-import cn.tr.module.smart.common.dto.BizClinicAddOrEditDTO;
 import cn.tr.module.smart.wx.dto.*;
 
 import java.io.IOException;
@@ -114,6 +119,7 @@ public interface IBizClinicRoomService {
 
     /**
      * 医生端添加手术信息
+     *
      * @param source
      * @return
      */
@@ -130,4 +136,27 @@ public interface IBizClinicRoomService {
     BizAiAgentParamVO touchMemoryId(BizCreateAgentSessionDTO source);
 
     DoctorClinicRoomVO selectAppBizClinicRoomById(String clinicId);
+
+    /**
+     * @description: 供Ai查询手术输注信息插件
+     * @author wangzl
+     * @date 2025/8/29
+     */
+    BizClinicAndDeviceVO selectClinicAndDeviceByClinicId(String clinicId);
+
+    /**
+     * @param clinicId
+     * @description: 供Ai查询最后一次问卷详情插件
+     * @author wangzl
+     * @date 2025/8/29
+     */
+    BizClinicAndQuestionVO selectClinicAndQuestionByClinicId(String clinicId);
+
+    /**
+     * @param clinicId
+     * @description: 供Ai查询手术信息查询最后一次镇痛评价插件
+     * @author wangzl
+     * @date 2025/8/29
+     */
+    BizClinicAndAssessmentVO selectClinicAndAssessmentByClinicId(String clinicId);
 }

+ 80 - 22
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizClinicRoomServiceImpl.java

@@ -1,46 +1,52 @@
 package cn.tr.module.smart.common.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.strategy.LoginUserStrategy;
-import cn.tr.module.smart.app.controller.dto.*;
+import cn.tr.module.smart.app.controller.dto.AppDoctorClinicFinishDTO;
+import cn.tr.module.smart.app.controller.dto.AppDoctorClinicQueryByPatientCodeDTO;
+import cn.tr.module.smart.app.controller.dto.AppDoctorClinicRoomDTO;
 import cn.tr.module.smart.app.controller.vo.AppDoctorInfusionHistoryVO;
 import cn.tr.module.smart.app.controller.vo.DoctorClinicRoomVO;
 import cn.tr.module.smart.app.controller.vo.WxDoctorClinicRoomThumbnailVO;
+import cn.tr.module.smart.common.dto.BizClinicAddOrEditDTO;
+import cn.tr.module.smart.common.dto.BizClinicRoomDTO;
+import cn.tr.module.smart.common.dto.BizClinicRoomQueryDTO;
 import cn.tr.module.smart.common.dto.BizDeptDTO;
+import cn.tr.module.smart.common.entity.BizWxAppletQuestionAnswerEntity;
 import cn.tr.module.smart.common.enums.ClinicPhaseEnums;
 import cn.tr.module.smart.common.enums.UserTypeEnums;
+import cn.tr.module.smart.common.mapper.BizClinicRoomMapper;
 import cn.tr.module.smart.common.mapper.BizInfusionHistoryMapper;
+import cn.tr.module.smart.common.mapper.BizQuestionAnswerMapper;
 import cn.tr.module.smart.common.po.*;
 import cn.tr.module.smart.common.properties.ALiYunProperties;
 import cn.tr.module.smart.common.repository.*;
 import cn.tr.module.smart.common.service.*;
+import cn.tr.module.smart.common.vo.BizClinicAndAssessmentVO;
+import cn.tr.module.smart.common.vo.BizClinicAndDeviceVO;
+import cn.tr.module.smart.common.vo.BizClinicAndQuestionVO;
 import cn.tr.module.smart.wx.controller.vo.BizAiAgentParamVO;
 import cn.tr.module.smart.wx.controller.vo.BizWxAppletClinicDetailVO;
 import cn.tr.module.smart.wx.controller.vo.BizWxDeptQuestionVO;
-import cn.tr.module.smart.common.dto.BizClinicAddOrEditDTO;
 import cn.tr.module.smart.wx.controller.vo.IdCardInfoVO;
 import cn.tr.module.smart.wx.dto.*;
 import cn.tr.module.smart.wx.utils.Id2Utils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
-import cn.hutool.core.collection.CollectionUtil;
 import org.springframework.transaction.annotation.Transactional;
-import cn.tr.core.exception.ServiceException;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import cn.tr.module.smart.common.dto.BizClinicRoomDTO;
-import cn.tr.module.smart.common.dto.BizClinicRoomQueryDTO;
 
 import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import cn.tr.module.smart.common.mapper.BizClinicRoomMapper;
-
 /**
  * 诊疗室Service接口实现类
  *
@@ -98,6 +104,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
 
     @Autowired
     private ALiYunService aLiYunService;
+
     @Override
     public List<BizWxAppletClinicDetailVO> stdSelectWxAppletClinicList(BizWxAppletClinicQueryDTO query) {
         return baseRepository.stdSelectWxAppletClinicList(query);
@@ -237,6 +244,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
      * 患者端删除手术信息
      * 如果手术信息已经被看护,则只删除软关联
      * 如果手术信息未被看护,则删除该手术数据
+     *
      * @param ids
      * @return
      */
@@ -375,7 +383,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
         }
         return clinicRoomDoctorUserRepository.delete(new LambdaQueryWrapper<BizClinicRoomDoctorUserPO>()
                 .eq(BizClinicRoomDoctorUserPO::getClinicRoomId, clinicId)
-                .eq(BizClinicRoomDoctorUserPO::getUserId,currentUserId)) != 0;
+                .eq(BizClinicRoomDoctorUserPO::getUserId, currentUserId)) != 0;
     }
 
     @Override
@@ -391,14 +399,14 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
                     .eq(BizClinicRoomDoctorUserPO::getClinicRoomId, clinicRoom.getId())
                     .last("limit 1"));
             if (ObjectUtil.isNotNull(clinicRoomDoctorUserPO)) {
-                if(ObjectUtil.equal(clinicRoomDoctorUserPO.getUserId(),userId)){
+                if (ObjectUtil.equal(clinicRoomDoctorUserPO.getUserId(), userId)) {
                     throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, String.format("住院号{%s}于{%s}已存在手术:{%s},请勿重复添加", patientCode, DateUtil.formatDate(clinicStartTime), clinicRoom.getClinicName()));
-                }else {
+                } else {
                     throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, String.format("住院号{%s}于{%s}已存在手术:{%s},已被其他医生看护", patientCode, DateUtil.formatDate(clinicStartTime), clinicRoom.getClinicName()));
                 }
             }
             //若未监护,则证明该手术是由医生端发起的,添加监护信息(手术信息以医生输入为主,如果医生没有输入,则按照病人输入的来)
-            clinicRoomDoctorUserService.stdInsertBizClinicRoomDoctor(userId,clinicRoom.getId());
+            clinicRoomDoctorUserService.stdInsertBizClinicRoomDoctor(userId, clinicRoom.getId());
             //更新监护信息
             updateClinicInfoBaseOnDoctorByWxApplet(clinicRoom, source);
             baseRepository.updateById(clinicRoom);
@@ -423,7 +431,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
             patient.setCurrentClinicId(clinicRoom.getId());
             patientRepository.updateById(patient);
             //更新医生看护列表
-            clinicRoomDoctorUserService.stdInsertBizClinicRoomDoctor(userId,clinicRoom.getId());
+            clinicRoomDoctorUserService.stdInsertBizClinicRoomDoctor(userId, clinicRoom.getId());
         }
         return Boolean.TRUE;
     }
@@ -434,7 +442,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
                 .eq(BizIdCardPO::getIdCard, source.getCardNo())
                 .eq(BizIdCardPO::getName, source.getName())
                 .last("limit 1"));
-        if(ObjectUtil.isNotNull(idCard)){
+        if (ObjectUtil.isNotNull(idCard)) {
             return Boolean.TRUE;
         }
         IdCardInfoVO cardInfoVO = Id2Utils.getInfo(source.getName(), source.getCardNo());
@@ -465,7 +473,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
             return null;
         }
 
-        return  BizInfusionHistoryMapper.INSTANCE.convertAPPVO(infusionHistoryRepository.selectById(infusionClinic.getInfusionId()));
+        return BizInfusionHistoryMapper.INSTANCE.convertAPPVO(infusionHistoryRepository.selectById(infusionClinic.getInfusionId()));
     }
 
     @Override
@@ -481,18 +489,18 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
         result.setApiKey(aLiYunProperties.getApiKey());
         result.setWorkplaceId(aLiYunProperties.getBailianWorkplaceId());
         BizClinicRoomPO clinicRoom = baseRepository.selectById(source.getClinicId());
-        if(ObjectUtil.isNull(clinicRoom)){
+        if (ObjectUtil.isNull(clinicRoom)) {
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "手术信息不存在");
         }
-        if(StrUtil.isNotEmpty(clinicRoom.getMemoryId())){
+        if (StrUtil.isNotEmpty(clinicRoom.getMemoryId())) {
             result.setMemoryId(clinicRoom.getMemoryId());
-        }else {
-            try{
+        } else {
+            try {
                 String memoryId = aLiYunService.createMemory();
                 result.setMemoryId(memoryId);
                 clinicRoom.setMemoryId(memoryId);
                 baseRepository.updateById(clinicRoom);
-            }catch (Exception e){
+            } catch (Exception e) {
 
             }
         }
@@ -502,7 +510,57 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
     @Override
     public DoctorClinicRoomVO selectAppBizClinicRoomById(String clinicId) {
         String currentUserId = LoginUserStrategy.tr.getCurrentUserId();
-        return baseRepository.selectAppBizClinicRoomById(clinicId,currentUserId);
+        return baseRepository.selectAppBizClinicRoomById(clinicId, currentUserId);
+    }
+
+    /**
+     * @description: 供Ai查询手术输注信息插件
+     * @author wangzl
+     * @date 2025/8/29
+     */
+    @Override
+    public BizClinicAndDeviceVO selectClinicAndDeviceByClinicId(String clinicId) {
+        return baseRepository.selectClinicAndDeviceByClinicId(clinicId);
+    }
+
+    /**
+     * @param clinicId
+     * @description: 供Ai查询最后一次问卷详情插件
+     * @author wangzl
+     * @date 2025/8/29
+     */
+    @Override
+    public BizClinicAndQuestionVO selectClinicAndQuestionByClinicId(String clinicId) {
+        BizClinicAndQuestionVO bizClinicAndQuestionVO = baseRepository.selectClinicAndQuestionByClinicId(clinicId);
+        List<BizWxDeptQuestionVO> questionAnswerList = BizQuestionAnswerMapper.INSTANCE.convertWxAppletVOList(bizClinicAndQuestionVO.getQuestion());
+        //填充回答
+        List<BizWxAppletQuestionAnswerEntity> answerContent = bizClinicAndQuestionVO.getContent();
+        if (CollectionUtil.isNotEmpty(answerContent) && CollectionUtil.isNotEmpty(questionAnswerList)) {
+            Map<String, BizWxDeptQuestionVO> questionMap = questionAnswerList.stream().collect(Collectors.groupingBy(BizWxDeptQuestionVO::getFieldName,
+                    Collectors.collectingAndThen(Collectors.toList(), CollectionUtil::getFirst)));
+            for (BizWxAppletQuestionAnswerEntity answer : answerContent) {
+                if (StrUtil.isEmpty(answer.getFiledName())) {
+                    continue;
+                }
+                BizWxDeptQuestionVO question = questionMap.get(answer.getFiledName());
+                if (ObjectUtil.isNotNull(question)) {
+                    question.setAnswer(answer.getContent());
+                }
+            }
+        }
+        bizClinicAndQuestionVO.setQuestionList(questionAnswerList);
+        return bizClinicAndQuestionVO;
+    }
+
+    /**
+     * @param clinicId
+     * @description: 供Ai查询手术信息查询最后一次镇痛评价插件
+     * @author wangzl
+     * @date 2025/8/29
+     */
+    @Override
+    public BizClinicAndAssessmentVO selectClinicAndAssessmentByClinicId(String clinicId) {
+        return baseRepository.selectClinicAndAssessmentByClinicId(clinicId);
     }
 
     /**

+ 84 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/vo/BizClinicAndAssessmentVO.java

@@ -0,0 +1,84 @@
+package cn.tr.module.smart.common.vo;
+
+import cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler;
+import cn.tr.module.smart.common.entity.BizPainAssessmentContentEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/8/29 11:55
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("手术信息和最后一次疼痛评价信息")
+public class BizClinicAndAssessmentVO extends BizClinicInfoVO {
+
+    @ApiModelProperty(value = "评估记录ID", position = 1)
+    private String assessmentId;
+
+    @ApiModelProperty(value = "静息时疼痛评分(0-10)", position = 2)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity restingPain;
+
+    @ApiModelProperty(value = "运动时疼痛评分(0-10)", position = 3)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity movementPain;
+
+    @ApiModelProperty(value = "过去24小时内最剧烈疼痛评分(0-10)", position = 4)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity painLast;
+
+    @ApiModelProperty(value = "爆发痛每日发生频次", position = 5)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity flareUpFrequency;
+
+    @ApiModelProperty(value = "爆发痛每次持续时长(分钟)", position = 6)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity flareUpDuration;
+
+    @ApiModelProperty(value = "睡眠质量状况(极差/很差/较差/尚可/正常)", position = 7)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity sleepStatus;
+
+    @ApiModelProperty(value = "精神状态(极差/很差/较差/尚可/正常)", position = 8)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity mentalStatus;
+
+    @ApiModelProperty(value = "食欲状况(极差/很差/较差/尚可/正常)", position = 9)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity appetiteStatus;
+
+    @ApiModelProperty(value = "恶心呕吐情况(呕吐/仅恶心/无)", position = 10)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity nauseaVomiting;
+
+    @ApiModelProperty(value = "瘙痒程度(无/轻度/中度/重度)", position = 11)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity itching;
+
+    @ApiModelProperty(value = "眩晕程度(无/轻度/中度/重度)", position = 12)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity dizziness;
+
+    @ApiModelProperty(value = "喉咙疼痛程度(无/轻度/中度/重度)", position = 13)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity throatPain;
+
+    @ApiModelProperty(value = "声音嘶哑情况(无/有)", position = 14)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity voiceHoarseness;
+
+    @ApiModelProperty(value = "患者满意度评分(不满意/较满意/满意)", position = 15)
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity satisfactionRating;
+
+    @ApiModelProperty("疼痛性质")
+    @TableField(typeHandler = PainAssessmentJsonbTypeHandler.class)
+    private BizPainAssessmentContentEntity painNature;
+
+}

+ 134 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/vo/BizClinicAndDeviceVO.java

@@ -0,0 +1,134 @@
+package cn.tr.module.smart.common.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/8/29 11:40
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("手术基本信息和全量泵头信息")
+public class BizClinicAndDeviceVO extends BizClinicInfoVO {
+
+    @ApiModelProperty(value = "输注ID", position = 1)
+    private String infusionId;
+
+    @ApiModelProperty(value = "设备唯一编码", position = 2)
+    private String deviceId;
+
+    @ApiModelProperty(value = "设备数据标识", position = 3)
+    private String classification;
+
+    @ApiModelProperty(value = "输注过程中的数据编号", position = 4)
+    private Integer dataNum;
+
+    @ApiModelProperty(value = "总量", position = 6)
+    private Integer totalDose;
+
+    @ApiModelProperty(value = "公共-首次量", position = 7)
+    private Integer firstDose;
+
+    @ApiModelProperty(value = "公共-剩余量", position = 8)
+    private BigDecimal remainDose;
+
+    @ApiModelProperty(value = "公共-已输入量", position = 9)
+    private BigDecimal inputDose;
+
+    @ApiModelProperty(value = "公共-追加量", position = 10)
+    private BigDecimal appendDose;
+
+    @ApiModelProperty(value = "公共-追加锁时", position = 11)
+    private BigDecimal appendLockTime;
+
+    @ApiModelProperty(value = "公共-极限量", position = 12)
+    private BigDecimal maxDose;
+
+    @ApiModelProperty(value = "公共-自控次数", position = 13)
+    private Integer selfControlCount;
+
+    @ApiModelProperty(value = "公共-自控锁时", position = 14)
+    private BigDecimal selfControlLockTime;
+
+    @ApiModelProperty(value = "公共-有效次数", position = 15)
+    private Integer pcaValidCount;
+
+    @ApiModelProperty(value = "公共-无效次数", position = 16)
+    private Integer pcaInvalidCount;
+
+    @ApiModelProperty(value = "公共-总按次数", position = 17)
+    private Integer pcaTotalCount;
+
+    @ApiModelProperty(value = "持续-持续量", position = 18)
+    private BigDecimal continueDose;
+
+    @ApiModelProperty(value = "脉冲-脉冲量", position = 19)
+    private Integer pulseDose;
+
+    @ApiModelProperty(value = "脉冲-脉冲锁时", position = 20)
+    private Integer pulseLockTime;
+
+    @ApiModelProperty(value = "脉冲-脉冲首次锁时", position = 21)
+    private Integer pulseFirstLockTime;
+
+    @ApiModelProperty(value = "智能-加档周期", position = 22)
+    private BigDecimal flowUpCycle;
+
+    @ApiModelProperty(value = "智能-减档周期", position = 23)
+    private BigDecimal flowDownCycle;
+
+    @ApiModelProperty(value = "智能-计次", position = 24)
+    private Integer flowCount;
+
+    @ApiModelProperty(value = "智能-上限", position = 25)
+    private BigDecimal flowUpLimit;
+
+    @ApiModelProperty(value = "智能-下限", position = 26)
+    private BigDecimal flowDownLimit;
+
+    @ApiModelProperty(value = "智能-自调比例", position = 27)
+    private BigDecimal flowAdjustRate;
+
+    @ApiModelProperty(value = "智能-输注过程中是否出现过加档受限", position = 28)
+    private String flowRestricted;
+
+    @ApiModelProperty(value = "智能-加减档提示", position = 29)
+    private String warnFlow;
+
+    @ApiModelProperty(value = "电量", position = 30)
+    private Integer electricQuantity;
+
+    @ApiModelProperty(value = "镇痛泵运行状态", position = 31)
+    private String deviceRunState;
+
+    @ApiModelProperty(value = "输液将结束(0:否,1:是)", position = 32)
+    private Boolean warnWillFinished;
+
+    @ApiModelProperty(value = "镇痛不足(0:否,1:是)", position = 33)
+    private Boolean warnAnalgesicPoor;
+
+    @ApiModelProperty(value = "电量偏低(0:否,1:是)", position = 34)
+    private Boolean warnLowBattery;
+
+    @ApiModelProperty(value = "报警信息", position = 35)
+    private String deviceAlarm;
+
+    @ApiModelProperty(value = "开始时间", position = 36)
+    private Date infusionStartTime;
+
+    @ApiModelProperty(value = "一次输注最后上传时间", position = 37)
+    private Date lastUploadTime;
+
+    @ApiModelProperty(value = "设备类型", position = 38)
+    private String deviceType;
+
+    @ApiModelProperty(value = "医院编码", position = 40)
+    private String hospitalCode;
+}

+ 54 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/vo/BizClinicAndQuestionVO.java

@@ -0,0 +1,54 @@
+package cn.tr.module.smart.common.vo;
+
+import cn.tr.module.smart.app.config.ContentListType;
+import cn.tr.module.smart.app.config.QuestionListType;
+import cn.tr.module.smart.common.entity.BizQuestionEntity;
+import cn.tr.module.smart.common.entity.BizWxAppletQuestionAnswerEntity;
+import cn.tr.module.smart.wx.controller.vo.BizWxDeptQuestionVO;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/8/29 11:53
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("手术信息和最后一次问卷信息")
+public class BizClinicAndQuestionVO extends BizClinicInfoVO {
+    @ApiModelProperty(value = "问卷id", position = 1)
+    private String questionAnswerId;
+
+    @ApiModelProperty(value = "回答的内容", position = 2, hidden = true)
+    @TableField(typeHandler = ContentListType.class)
+    @JsonIgnore
+    private List<BizWxAppletQuestionAnswerEntity> content;
+
+    @ApiModelProperty(value = "问卷问题", position = 3, hidden = true)
+    @TableField(typeHandler = QuestionListType.class)
+    @JsonIgnore
+    private List<BizQuestionEntity> question;
+
+    @ApiModelProperty(value = "问卷组id", position = 5)
+    private String questionGroupId;
+
+    @ApiModelProperty(value = "问卷推送时间", position = 6)
+    private Date sendTime;
+
+    @ApiModelProperty(value = "问卷回答时间", position = 7)
+    private Date answerTime;
+
+    @ApiModelProperty(value = "问卷类型", position = 8)
+    private String questionType;
+
+    @ApiModelProperty(value = "问题集合", position = 9)
+    private List<BizWxDeptQuestionVO> questionList;
+}

+ 50 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/vo/BizClinicInfoVO.java

@@ -0,0 +1,50 @@
+package cn.tr.module.smart.common.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/8/29 13:41
+ */
+@Data
+@ApiModel("手术信息")
+public class BizClinicInfoVO {
+    @ApiModelProperty(value = "手术ID", position = 1)
+    private String clinicId;
+
+    @ApiModelProperty(value = "手术名称", position = 2)
+    private String clinicName;
+
+    @ApiModelProperty(value = "手术开始时间", position = 3)
+    private Date clinicStartTime;
+
+    @ApiModelProperty(value = "手术结束时间", position = 4)
+    private Date clinicEndTime;
+
+    @ApiModelProperty(value = "手术名称医生", position = 5)
+    private String clinicNameDoctor;
+
+    @ApiModelProperty(value = "患者名称", position = 6)
+    private String patientName;
+
+    @ApiModelProperty(value = "患者年龄", position = 7)
+    private Integer patientAge;
+
+    @ApiModelProperty(value = "患者性别", position = 8)
+    private String patientGender;
+
+    @ApiModelProperty(value = "患者住院号", position = 9)
+    private String patientCode;
+
+    @ApiModelProperty(value = "科室名称", position = 10)
+    private String deptName;
+
+    @ApiModelProperty(value = "手术状态", position = 11)
+    private String clinicStatus;
+
+}

+ 184 - 0
tr-modules/tr-module-smartFollowUp/src/main/resources/mapper/smart/BizClinicRoomMapper.xml

@@ -354,4 +354,188 @@
         left join (select * from im_group_user where user_id=  #{currentUserId}) as igu on igu.group_id=bcr.id
         where bcr.id=#{clinicId}
     </select>
+    <sql id="ClinicAndInfusionColumn">
+        bih.id AS infusion_id,bih.device_id,bih.classification,bih.data_num,bih.total_dose,
+        bih.first_dose,bih.remain_dose,bih.input_dose,bih.append_dose,bih.append_lock_time,bih.max_dose,
+        bih.self_control_count,bih.self_control_lock_time,bih.pca_valid_count,bih.pca_invalid_count,
+        bih.pca_total_count,bih.continue_dose,bih.pulse_dose,bih.pulse_lock_time,bih.pulse_first_lock_time,
+        bih.flow_up_cycle,bih.flow_down_cycle,bih.flow_count,bih.flow_up_limit,bih.flow_down_limit,
+        bih.flow_adjust_rate,bih.flow_restricted,bih.warn_flow,bih.electric_quantity,bih.device_run_state,
+        bih.device_alarm,bih.infusion_start_time,bih.last_upload_time,bih.device_type,bih.hospital_code,
+        bih.warn_will_finished,bih.warn_analgesic_poor,bih.warn_low_battery
+    </sql>
+    <resultMap id="ClinicAndDevice" type="cn.tr.module.smart.common.vo.BizClinicAndDeviceVO">
+        <result property="clinicId" column="clinic_id"/>
+        <result property="clinicName" column="clinic_name"/>
+        <result property="clinicNameDoctor" column="clinic_name_doctor"/>
+        <result property="clinicStartTime" column="clinic_start_time"/>
+        <result property="clinicEndTime" column="clinic_end_time"/>
+        <result property="clinicStatus" column="clinic_status"/>
+        <result property="patientName" column="patient_name"/>
+        <result property="patientGender" column="patient_gender"/>
+        <result property="patientAge" column="patient_age"/>
+        <result property="patientCode" column="patient_code"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="infusionId" column="infusion_id"/>
+        <result property="deviceId" column="device_id"/>
+        <result property="classification" column="classification"/>
+        <result property="totalDose" column="total_dose"/>
+        <result property="firstDose" column="first_dose"/>
+        <result property="remainDose" column="remain_dose"/>
+        <result property="inputDose" column="input_dose"/>
+        <result property="appendDose" column="append_dose"/>
+        <result property="appendLockTime" column="append_lock_time"/>
+        <result property="maxDose" column="max_dose"/>
+        <result property="selfControlCount" column="self_control_count"/>
+        <result property="selfControlLockTime" column="self_control_lock_time"/>
+        <result property="pcaValidCount" column="pca_valid_count"/>
+        <result property="pcaInvalidCount" column="pca_invalid_count"/>
+        <result property="pcaTotalCount" column="pca_total_count"/>
+        <result property="continueDose" column="continue_dose"/>
+        <result property="pulseDose" column="pulse_dose"/>
+        <result property="pulseLockTime" column="pulse_lock_time"/>
+        <result property="pulseFirstLockTime" column="pulse_first_lock_time"/>
+        <result property="flowUpCycle" column="flow_up_cycle"/>
+        <result property="flowDownCycle" column="flow_down_cycle"/>
+        <result property="flowCount" column="flow_count"/>
+        <result property="flowUpLimit" column="flow_up_limit"/>
+        <result property="flowDownLimit" column="flow_down_limit"/>
+        <result property="flowAdjustRate" column="flow_adjust_rate"/>
+        <result property="flowRestricted" column="flow_restricted"/>
+        <result property="warnFlow" column="warn_flow"/>
+        <result property="electricQuantity" column="electric_quantity"/>
+        <result property="deviceRunState" column="device_run_state"/>
+        <result property="deviceAlarm" column="device_alarm"/>
+        <result property="infusionStartTime" column="infusion_start_time"/>
+        <result property="lastUploadTime" column="last_upload_time"/>
+        <result property="deviceType" column="device_type"/>
+        <result property="hospitalCode" column="hospital_code"/>
+        <result property="warnWillFinished" column="warn_will_finished"/>
+        <result property="warnAnalgesicPoor" column="warn_analgesic_poor"/>
+        <result property="warnLowBattery" column="warn_low_battery"/>
+    </resultMap>
+    <select id="selectClinicAndDeviceByClinicId" resultMap="ClinicAndDevice">
+        SELECT
+            bcr.id as clinic_id,
+            bcr.clinic_name,
+            bcr.clinic_name_doctor,
+            bcr.clinic_start_time,
+            bcr.clinic_end_time,
+            bcr.clinic_status,
+            bcr.patient_name,
+            bcr.patient_gender,
+            bcr.patient_age,
+            bcr.dept_name,
+            bcr.patient_code,
+            <include refid="ClinicAndInfusionColumn"/>
+        FROM
+            biz_clinic_room bcr
+                LEFT JOIN biz_infusion_clinic bic ON bcr.ID = bic.clinic_id
+                left join biz_infusion_history bih on bih.id = bic.infusion_id
+        WHERE
+            bcr.id = #{clinicId}
+    </select>
+    <sql id="ClinicAndQuestionAnswerColumn">
+        bqa.id as question_answer_id,bqa.content,bqa.question,bqa.question_group_id,bqa.send_time,bqa.answer_time,bqa.deleted,bqa.question_type
+    </sql>
+    <resultMap id="ClinicAndQuestionAnswer" type="cn.tr.module.smart.common.vo.BizClinicAndQuestionVO">
+        <result property="clinicId" column="clinic_id"/>
+        <result property="clinicName" column="clinic_name"/>
+        <result property="clinicNameDoctor" column="clinic_name_doctor"/>
+        <result property="clinicStartTime" column="clinic_start_time"/>
+        <result property="clinicEndTime" column="clinic_end_time"/>
+        <result property="clinicStatus" column="clinic_status"/>
+        <result property="patientName" column="patient_name"/>
+        <result property="patientGender" column="patient_gender"/>
+        <result property="patientAge" column="patient_age"/>
+        <result property="patientCode" column="patient_code"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="questionAnswerId" column="question_answer_id"/>
+        <result property="content" column="content" typeHandler="cn.tr.module.smart.app.config.ContentListType"/>
+        <result property="question" column="question" typeHandler="cn.tr.module.smart.app.config.QuestionListType"/>
+        <result property="questionGroupId" column="question_group_id"/>
+        <result property="sendTime" column="send_time"/>
+        <result property="answerTime" column="answer_time"/>
+        <result property="questionType" column="question_type"/>
+    </resultMap>
+    <select id="selectClinicAndQuestionByClinicId" resultMap="ClinicAndQuestionAnswer">
+        SELECT
+            bcr.ID AS clinic_id,
+            bcr.clinic_name,
+            bcr.clinic_name_doctor,
+            bcr.clinic_start_time,
+            bcr.clinic_end_time,
+            bcr.clinic_status,
+            bcr.patient_name,
+            bcr.patient_gender,
+            bcr.patient_age,
+            bcr.dept_name,
+            bcr.patient_code,
+           <include refid="ClinicAndQuestionAnswerColumn"/>
+        FROM
+            biz_clinic_room bcr
+                LEFT JOIN biz_question_answer bqa ON bcr.ID = bqa.clinic_id
+        WHERE
+            bcr.id = #{clinicId}
+        ORDER BY
+            bqa.answer_time desc
+        LIMIT 1
+    </select>
+    <sql id="ClinicAndAssessmentColumn">
+        bpa.id as assessment_id,bpa.resting_pain,bpa.movement_pain,bpa.pain_last,bpa.flare_up_frequency,
+        bpa.flare_up_duration,bpa.sleep_status,bpa.mental_status,bpa.appetite_status,bpa.nausea_vomiting,
+        bpa.itching,bpa.dizziness,bpa.throat_pain,bpa.voice_hoarseness,bpa.satisfaction_rating,bpa.pain_nature
+    </sql>
+    <resultMap id="ClinicAndAssessment" type="cn.tr.module.smart.common.vo.BizClinicAndAssessmentVO">
+        <result property="clinicId" column="clinic_id"/>
+        <result property="clinicName" column="clinic_name"/>
+        <result property="clinicNameDoctor" column="clinic_name_doctor"/>
+        <result property="clinicStartTime" column="clinic_start_time"/>
+        <result property="clinicEndTime" column="clinic_end_time"/>
+        <result property="clinicStatus" column="clinic_status"/>
+        <result property="patientName" column="patient_name"/>
+        <result property="patientGender" column="patient_gender"/>
+        <result property="patientAge" column="patient_age"/>
+        <result property="patientCode" column="patient_code"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="assessmentId" column="assessment_id"/>
+        <result property="restingPain" column="resting_pain" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="movementPain" column="movement_pain" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="painLast" column="pain_last" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="flareUpFrequency" column="flare_up_frequency" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="flareUpDuration" column="flare_up_duration" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="sleepStatus" column="sleep_status" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="mentalStatus" column="mental_status" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="appetiteStatus" column="appetite_status" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="nauseaVomiting" column="nausea_vomiting" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="itching" column="itching" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="dizziness" column="dizziness" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="throatPain" column="throat_pain" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="voiceHoarseness" column="voice_hoarseness" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="satisfactionRating" column="satisfaction_rating" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+        <result property="painNature" column="pain_nature" typeHandler="cn.tr.module.smart.common.config.PainAssessmentJsonbTypeHandler"/>
+    </resultMap>
+    <select id="selectClinicAndAssessmentByClinicId" resultMap="ClinicAndAssessment">
+        SELECT
+            bcr.id AS clinic_id,
+            bcr.clinic_name,
+            bcr.clinic_name_doctor,
+            bcr.clinic_start_time,
+            bcr.clinic_end_time,
+            bcr.clinic_status,
+            bcr.patient_name,
+            bcr.patient_gender,
+            bcr.patient_age,
+            bcr.dept_name,
+            bcr.patient_code,
+            <include refid="ClinicAndAssessmentColumn"/>
+        FROM
+            biz_clinic_room bcr
+                LEFT JOIN biz_pain_assessment bpa ON bcr.ID = bpa.clinic_id
+        WHERE
+            bcr.id = #{ clinicId }
+        ORDER BY
+            bpa.create_time desc
+        LIMIT 1
+    </select>
 </mapper>