Browse Source

Merge remote-tracking branch 'origin/master'

lifang 3 months ago
parent
commit
13cd6d0897
22 changed files with 449 additions and 15 deletions
  1. 0 3
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizClinicAddOrEditDTO.java
  2. 5 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizQuestionGroupDTO.java
  3. 1 1
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizQuestionGroupQueryDTO.java
  4. 47 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/enums/FastingEnums.java
  5. 3 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/po/BizPatientPO.java
  6. 4 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/repository/BizQuestionGroupRepository.java
  7. 20 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizFastingService.java
  8. 9 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizClinicRoomServiceImpl.java
  9. 8 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizClinicRoomWxUserServiceImpl.java
  10. 100 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizFastingServiceImpl.java
  11. 2 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionAnswerServiceImpl.java
  12. 1 8
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionGroupServiceImpl.java
  13. 16 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionServiceImpl.java
  14. 43 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/BizWxFastingController.java
  15. 34 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizFastingAttentionVO.java
  16. 37 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizFastingTipsVO.java
  17. 30 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizFastingVo.java
  18. 0 1
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizWxAppletClinicDetailVO.java
  19. 21 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/dto/BizFastingDTO.java
  20. 14 0
      tr-modules/tr-module-smartFollowUp/src/main/resources/llm/questionPrompt.txt
  21. 19 2
      tr-modules/tr-module-smartFollowUp/src/main/resources/mapper/smart/BizPainAssessmentMapper.xml
  22. 35 0
      tr-modules/tr-module-smartFollowUp/src/main/resources/mapper/smart/BizQuestionGroupMapper.xml

+ 0 - 3
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizClinicAddOrEditDTO.java

@@ -69,7 +69,4 @@ public class BizClinicAddOrEditDTO implements Serializable {
     @NotNull  (message = "手术开始时间不能为空",groups = {Update.class, Insert.class})
     private Date clinicStartTime;
 
-    public void setClinicStartTime(Date clinicStartTime) {
-        this.clinicStartTime= DateUtil.beginOfDay(clinicStartTime);
-    }
 }

+ 5 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizQuestionGroupDTO.java

@@ -32,6 +32,9 @@ public class BizQuestionGroupDTO extends BaseDTO {
     @ApiModelProperty(value = "问卷类型", position = 3)
     private String type;
 
+    @ApiModelProperty(value = "题目个数",position = 12)
+    private Integer questionCount;
+
     @ApiModelProperty(value = "术后推送间隔(小时)", position = 4)
     private Integer interval;
 
@@ -43,4 +46,6 @@ public class BizQuestionGroupDTO extends BaseDTO {
 
     @ApiModelProperty(value = "是否分享", position = 7)
     private Boolean isShare;
+    @ApiModelProperty(value = "租户ID", position = 17)
+    private String tenantId;
 }

+ 1 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizQuestionGroupQueryDTO.java

@@ -20,7 +20,7 @@ import java.io.Serializable;
 public class BizQuestionGroupQueryDTO  implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "查询条件", position = 1)
+    @ApiModelProperty(value = "问卷名称", position = 1)
     private String condition;
 
     @ApiModelProperty(value = "类型", position = 2)

+ 47 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/enums/FastingEnums.java

@@ -0,0 +1,47 @@
+package cn.tr.module.smart.common.enums;
+
+import lombok.Getter;
+
+import java.util.EnumSet;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 9:46
+ */
+@Getter
+public enum FastingEnums {
+
+    // 定义所有区间(起始值,结束值,描述)
+    RANGE_0_2(0, 2, "清水", "%s后可以少量饮用清水,一般不超过体重的5mL/kg"),
+    RANGE_2_4(2, 4, "母乳", "%s后可以喂养母乳,但不要过量喂养"),
+    RANGE_4_6(4, 6, "固体食物", "%s后可以食用配方奶粉、牛奶和易消化的固体食物,但同样要按照正常的饮食量进食,不宜过量进食"),
+    RANGE_6_8(6, 8, "牛奶/豆浆/粥", "%s后不能食用难消化的食物,如肉类,需要禁食8小时后才能进行麻醉和手术"),
+    RANGE_OVER_8(8, Long.MAX_VALUE, "无", "%s前饮食无特殊限制");
+    private final long start;  // 区间起始(包含)
+    private final long end;    // 区间结束(包含)
+    private final String type;
+    private final String desc; // 区间描述
+
+    FastingEnums(long start, long end, String type, String desc) {
+        this.start = start;
+        this.end = end;
+        this.type = type;
+        this.desc = desc;
+    }
+
+    // 判断当前值是否在区间内
+    public boolean contains(long value) {
+        return value > start && value <= end;
+    }
+
+    // 根据值获取对应的区间
+    public static FastingEnums getMatchedInterval(long value) {
+        return EnumSet.allOf(FastingEnums.class)
+                .stream()
+                .filter(interval -> interval.contains(value))
+                .findFirst()
+                .orElseThrow(() -> new IllegalArgumentException("未找到匹配的时间区间"));
+    }
+}

+ 3 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/po/BizPatientPO.java

@@ -39,6 +39,9 @@ public class BizPatientPO extends TenantPO {
     @ApiModelProperty("是否为新生儿")
     private Boolean newHuman;
 
+    @ApiModelProperty(value = "头像图片链接(医生端可不传)",position = 2)
+    private String imageUrl;
+
     @TableField(updateStrategy = FieldStrategy.NEVER,fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR)
     private Integer deleted;
 }

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

@@ -1,6 +1,8 @@
 package cn.tr.module.smart.common.repository;
 
 import cn.tr.module.smart.app.controller.vo.AppQuestionAndDeptListVO;
+import cn.tr.module.smart.common.dto.BizQuestionGroupDTO;
+import cn.tr.module.smart.common.dto.BizQuestionGroupQueryDTO;
 import cn.tr.module.smart.common.po.BizQuestionGroupPO;
 import cn.tr.module.smart.web.dto.BizDeptUnlinkQuestionQueryDTO;
 import cn.tr.module.smart.web.vo.BizDeptUnlinkQuestionVO;
@@ -27,4 +29,6 @@ public interface BizQuestionGroupRepository extends BaseMapper<BizQuestionGroupP
 
 
    List<BizDeptUnlinkQuestionVO> queryAllUnlink(@Param("query") BizDeptUnlinkQuestionQueryDTO query);
+
+    List<BizQuestionGroupDTO> selectQuestionGroupAllList(@Param("query")BizQuestionGroupQueryDTO query);
 }

+ 20 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizFastingService.java

@@ -0,0 +1,20 @@
+package cn.tr.module.smart.common.service;
+
+import cn.tr.module.smart.wx.controller.vo.BizFastingVo;
+import cn.tr.module.smart.wx.dto.BizFastingDTO;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 8:27
+ */
+public interface IBizFastingService {
+
+    /**
+     * @description: 禁饮禁食提示信息
+     * @author wangzl
+     * @date 2025/9/19
+     */
+    BizFastingVo getTips(BizFastingDTO source);
+}

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

@@ -462,6 +462,10 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
         if (ObjectUtil.isNotNull(idCard)&&StrUtil.equals(idCard.getName(),source.getName())) {
             return Boolean.TRUE;
         }
+
+        if (ObjectUtil.isNotNull(idCard)&&!StrUtil.equals(idCard.getName(),source.getName())) {
+            return Boolean.FALSE;
+        }
         IdCardInfoVO cardInfoVO = Id2Utils.getInfo(source.getName(), source.getCardNo());
         if (!"0".equals(cardInfoVO.getRespCode())) {
             return Boolean.FALSE;
@@ -647,18 +651,23 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
         if (ObjectUtil.isNull(source)) {
             return;
         }
+        //患者年龄
         if (ObjectUtil.isNull(baseInfo.getPatientAge())) {
             baseInfo.setPatientAge(source.getPatientAge());
         }
+        //科室id
         if (StrUtil.isBlank(baseInfo.getDeptId())) {
             baseInfo.setDeptId(source.getDeptId());
         }
+        //科室名称
         if (StrUtil.isBlank(baseInfo.getDeptName())) {
             baseInfo.setDeptName(source.getDeptName());
         }
+        //手术名称
         if (StrUtil.isBlank(baseInfo.getClinicName())) {
             baseInfo.setClinicName(source.getClinicName());
         }
+        //手术开始时间
         if (ObjectUtil.isNull(baseInfo.getClinicStartTime())) {
             baseInfo.setClinicStartTime(source.getClinicStartTime());
         }

+ 8 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizClinicRoomWxUserServiceImpl.java

@@ -4,7 +4,10 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.smart.common.po.BizClinicRoomPO;
+import cn.tr.module.smart.common.po.BizInfusionClinicPO;
 import cn.tr.module.smart.common.repository.BizClinicRoomRepository;
+import cn.tr.module.smart.common.repository.BizInfusionClinicRepository;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import cn.hutool.core.collection.CollectionUtil;
@@ -32,6 +35,9 @@ public class BizClinicRoomWxUserServiceImpl implements IBizClinicRoomWxUserServi
     @Autowired
     private BizClinicRoomRepository clinicRoomRepository;
 
+    @Autowired
+    private BizInfusionClinicRepository infusionClinicRepository;
+
     /**
      * 根据条件查询诊室患者绑定id
      * @param    query 查询参数
@@ -130,6 +136,8 @@ public class BizClinicRoomWxUserServiceImpl implements IBizClinicRoomWxUserServi
                 .eq(BizClinicRoomWxUserPO::getWxUserId, userId)
                 .in(BizClinicRoomWxUserPO::getClinicRoomId, ids));
         if(result!=0){
+            infusionClinicRepository.delete(new LambdaQueryWrapper<BizInfusionClinicPO>()
+                    .in(BizInfusionClinicPO::getClinicId, ids));
             clinicRoomRepository.deleteBatchIds(ids);
         }
         return result;

+ 100 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizFastingServiceImpl.java

@@ -0,0 +1,100 @@
+package cn.tr.module.smart.common.service.impl;
+
+import cn.hutool.core.date.DateUnit;
+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.module.smart.common.enums.ClinicPhaseEnums;
+import cn.tr.module.smart.common.enums.FastingEnums;
+import cn.tr.module.smart.common.po.BizClinicRoomPO;
+import cn.tr.module.smart.common.repository.BizClinicRoomRepository;
+import cn.tr.module.smart.common.service.IBizFastingService;
+import cn.tr.module.smart.wx.controller.vo.BizFastingAttentionVO;
+import cn.tr.module.smart.wx.controller.vo.BizFastingTipsVO;
+import cn.tr.module.smart.wx.controller.vo.BizFastingVo;
+import cn.tr.module.smart.wx.dto.BizFastingDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import java.util.stream.LongStream;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 8:28
+ */
+@Service
+public class BizFastingServiceImpl implements IBizFastingService {
+    @Autowired
+    private BizClinicRoomRepository bizClinicRoomRepository;
+
+    private static final long[] FASTING_TIME_RANGE = {0, 2, 4, 6, 8, Long.MAX_VALUE};
+
+
+    /**
+     * @param source
+     * @description: 禁饮禁食提示信息
+     * @author wangzl
+     * @date 2025/9/19
+     */
+    @Override
+    public BizFastingVo getTips(BizFastingDTO source) {
+        BizClinicRoomPO bizClinicRoomPO = bizClinicRoomRepository.selectById(source.getClinicId());
+        if (ObjectUtil.isNull(bizClinicRoomPO)) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到手术信息");
+        }
+        if (StrUtil.equals(bizClinicRoomPO.getClinicStatus(), ClinicPhaseEnums.AFTER)) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "手术已经结束");
+        }
+        if (ObjectUtil.compare(new Date(),bizClinicRoomPO.getClinicStartTime()) > 0) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001
+                    , String.format("手术开始时间[%s],在当前时间[%s]之前请结束手术"
+                    , DateUtil.formatDateTime(bizClinicRoomPO.getClinicStartTime())
+                    , DateUtil.formatDateTime(new Date())));
+        }
+        //计算当前时间与手术开始时间的间隔
+        long between = DateUtil.between(new Date(), bizClinicRoomPO.getClinicStartTime(), DateUnit.HOUR);
+        //计算时间间隔对应时间
+        List<BizFastingTipsVO> collect = EnumSet.allOf(FastingEnums.class)
+                .stream()
+                .map(fasting -> {
+                    int currentTime = fasting.getEnd() > 8 ? (int) between : (int) fasting.getEnd();
+                    return BizFastingTipsVO.builder()
+                            .type(fasting.getType())
+                            .flag(fasting.contains(between))
+                            .tip(String.format(fasting.getDesc(),
+                                    DateUtil.format(DateUtil.offsetHour(bizClinicRoomPO.getClinicStartTime(),
+                                            -currentTime), "MM月dd日 HH:mm")))
+                            .interval(String.format("手术前%d小时", currentTime))
+                            .build();
+                }).collect(Collectors.toList());
+
+        List<BizFastingAttentionVO> attentionVOS = new ArrayList<>();
+        attentionVOS.add(BizFastingAttentionVO.builder()
+                .serialNo(1)
+                .icon("")
+                .content("若不慎进食或饮水,无论量多少,必须立即联系主管护士,可能需调整手术时间(隐瞒会导致麻醉误吸风险,危及安全);")
+                .build());
+        attentionVOS.add(BizFastingAttentionVO.builder()
+                .serialNo(2)
+                .icon("")
+                .content("术前可少量清水漱口(禁止吞咽),取下假牙、首饰,携带必需药物(需经医护核对);")
+                .build());
+        attentionVOS.add(BizFastingAttentionVO.builder()
+                .serialNo(3)
+                .icon("")
+                .content("若术前出现发热(>37.3℃)、咳嗽、呕吐,请立即告知医护人员,评估是否暂停手术。")
+                .build());
+
+        return BizFastingVo.builder()
+                .attentions(attentionVOS)
+                .tips(collect)
+                .build();
+    }
+}

+ 2 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionAnswerServiceImpl.java

@@ -1,6 +1,7 @@
 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;
@@ -161,6 +162,7 @@ public class BizQuestionAnswerServiceImpl implements IBizQuestionAnswerService {
         baseRepository.insert(questionAnswer);
         Integer followUpCount = Optional.ofNullable(clinicRoom.getFollowUpCount()).orElse(0);
         clinicRoom.setFollowUpCount(++followUpCount);
+        clinicRoom.setLastFollowUpTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
         clinicRoom.setFollowUp(Boolean.TRUE);
         clinicRoom.setLastAfterQuestionTime(new Date());
         clinicRoomRepository.updateById(clinicRoom);

+ 1 - 8
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionGroupServiceImpl.java

@@ -114,14 +114,7 @@ public class BizQuestionGroupServiceImpl implements IBizQuestionGroupService {
      */
     @Override
     public List<BizQuestionGroupDTO> selectList(BizQuestionGroupQueryDTO query) {
-        LambdaQueryWrapper<BizQuestionGroupPO> queryWrapper = new LambdaQueryWrapper<>();
-        if(StringUtils.isNotBlank(query.getCondition())){
-            queryWrapper.like(BizQuestionGroupPO::getName, query.getCondition());
-        }
-        if(StringUtils.isNotBlank(query.getType())){
-            queryWrapper.eq(BizQuestionGroupPO::getType, query.getType());
-        }
-        return  BizQuestionGroupMapper.INSTANCE.convertDtoList(baseRepository.selectList(queryWrapper)) ;
+        return baseRepository.selectQuestionGroupAllList(query);
     }
 
     /**

+ 16 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionServiceImpl.java

@@ -1,18 +1,24 @@
 package cn.tr.module.smart.common.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.smart.common.dto.BizQuestionDTO;
+import cn.tr.module.smart.common.dto.BizQuestionGroupDTO;
 import cn.tr.module.smart.common.mapper.BizQuestionMapper;
+import cn.tr.module.smart.common.po.BizQuestionGroupPO;
 import cn.tr.module.smart.common.po.BizQuestionPO;
+import cn.tr.module.smart.common.repository.BizQuestionGroupRepository;
 import cn.tr.module.smart.common.repository.BizQuestionRepository;
 import cn.tr.module.smart.common.service.IBizQuestionService;
 import cn.tr.module.smart.web.dto.BizQuestionInsertOrUpdateDTO;
 import cn.tr.module.smart.wx.controller.vo.BizWxDeptQuestionVO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,6 +37,9 @@ public class BizQuestionServiceImpl extends ServiceImpl<BizQuestionRepository, B
     @Autowired
     private BizQuestionRepository baseRepository;
 
+    @Autowired
+    private BizQuestionGroupRepository questionGroupRepository;
+
 
     /**
     * 新增问卷调查问题字段
@@ -45,6 +54,13 @@ public class BizQuestionServiceImpl extends ServiceImpl<BizQuestionRepository, B
         validate(source.getQuestionList());
         //对问卷组进行先删后插
         baseRepository.delete(new LambdaQueryWrapper<BizQuestionPO>().in(BizQuestionPO::getGroupId, source.getGroupId()));
+        //修改医院的问卷组中的update_time
+        BizQuestionGroupPO questionGroupPO = new BizQuestionGroupPO();
+        questionGroupPO.setUpdateTime(new DateTime(System.currentTimeMillis()));
+        questionGroupRepository.update(
+                questionGroupPO, new LambdaUpdateWrapper<BizQuestionGroupPO>()
+                        .in(BizQuestionGroupPO::getId, source.getGroupId())
+        );
         return this.saveBatch(BizQuestionMapper.INSTANCE.convertPOList(source.getQuestionList()));
     }
 

+ 43 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/BizWxFastingController.java

@@ -0,0 +1,43 @@
+package cn.tr.module.smart.wx.controller;
+
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.tr.core.annotation.TenantIgnore;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.module.smart.common.service.IBizFastingService;
+import cn.tr.module.smart.wx.controller.vo.BizFastingVo;
+import cn.tr.module.smart.wx.dto.BizFastingDTO;
+import cn.tr.module.sys.oauth2.LoginTypeConstant;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 7:55
+ */
+@Api(tags = "禁饮禁食管理")
+@RestController
+@RequestMapping("/wx/fasting")
+@AllArgsConstructor
+//@SaCheckLogin(type = LoginTypeConstant.WX_APPLET)
+public class BizWxFastingController {
+    @Autowired
+    private IBizFastingService bizFastingService;
+
+    @ApiOperationSupport(author = "wangzl", order = 1)
+    @ApiOperation(value = "查询禁食禁饮提示信息", notes = "权限: 无")
+    @PostMapping("/tips")
+    public CommonResult<BizFastingVo> getTips(@RequestBody BizFastingDTO source){
+        return CommonResult.success(bizFastingService.getTips(source));
+    }
+
+
+}

+ 34 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizFastingAttentionVO.java

@@ -0,0 +1,34 @@
+package cn.tr.module.smart.wx.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/22 7:54
+ */
+@Data
+@ToString
+@Builder
+@ApiModel("提示注意事项")
+public class BizFastingAttentionVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("序号")
+    private Integer serialNo;
+
+    @ApiModelProperty("图标 base64")
+    private String icon;
+
+    @ApiModelProperty("内容")
+    private String content;
+
+
+}

+ 37 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizFastingTipsVO.java

@@ -0,0 +1,37 @@
+package cn.tr.module.smart.wx.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 7:58
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ToString
+@ApiModel("禁饮禁食提示信息实体")
+public class BizFastingTipsVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "禁止类型", position = 1)
+    private String type;
+
+    @ApiModelProperty(value = "间隔时长 2 4 6 8 大于8小时", position = 2)
+    private String interval;
+
+    @ApiModelProperty(value = "标记", position = 3)
+    private Boolean flag;
+
+    @ApiModelProperty(value = "提示信息", position = 4)
+    private String tip;
+
+}

+ 30 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizFastingVo.java

@@ -0,0 +1,30 @@
+package cn.tr.module.smart.wx.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 8:21
+ */
+@ApiModel("禁饮禁食整体")
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+@ToString
+public class BizFastingVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "提示", position = 1)
+    private List<BizFastingTipsVO> tips;
+
+    @ApiModelProperty(value = "注意事项", position = 2)
+    private List<BizFastingAttentionVO> attentions;
+}

+ 0 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/controller/vo/BizWxAppletClinicDetailVO.java

@@ -42,7 +42,6 @@ public class BizWxAppletClinicDetailVO implements Serializable {
     private String patientCode;
 
     @ApiModelProperty(value = "手术开始时间", position = 6)
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")
     private Date clinicStartTime;
 
     @ApiModelProperty(value = "手术结束时间", position = 6)

+ 21 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/dto/BizFastingDTO.java

@@ -0,0 +1,21 @@
+package cn.tr.module.smart.wx.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * TODO
+ *
+ * @author wangzl
+ * @date 2025/9/19 8:25
+ */
+@Data
+@ToString
+@ApiModel("禁饮禁食请求参数")
+public class BizFastingDTO {
+
+    @ApiModelProperty(value = "手术ID", position = 1)
+    private String clinicId;
+}

+ 14 - 0
tr-modules/tr-module-smartFollowUp/src/main/resources/llm/questionPrompt.txt

@@ -3,6 +3,7 @@
 
 【核心任务】
 根据用户指定的问卷类型(${type}),生成一套包含10-20个问题的专业问卷。问题设计需完全符合指定类型的临床需求和信息收集目的。
+
 【输出格式要求】
 请输出一个完整的JSON对象,严格遵循以下结构:
 
@@ -94,4 +95,17 @@ json
 
 确保所有技术规范得到严格遵守
 
+且生成的单选题选项均为纯选择形式
+
+所有问题必须是完整封闭式问题
+
+禁止使用具体为:、其他:等需要用户填写的占位符
+
+选项必须提供完整的选择项,每个选项都是独立完整的陈述
+
+错误格式:有,具体为:
+正确格式:A) 无过敏史 B) 药物过敏 C) 食物过敏 D) 药物和食物均过敏
+
+问题标题上不能出现可多选字样
+
 只输出JSON格式内容,不要有任何额外解释

+ 19 - 2
tr-modules/tr-module-smartFollowUp/src/main/resources/mapper/smart/BizPainAssessmentMapper.xml

@@ -3,8 +3,24 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.tr.module.smart.common.repository.BizPainAssessmentRepository">
-
-    <select id="selectWebBizPainAssessmentList" resultType="cn.tr.module.smart.web.vo.BizWebPainAssessmentVO">
+    <resultMap id="WebPainAssessment" type="cn.tr.module.smart.web.vo.BizWebPainAssessmentVO">
+        <result property="id" column="id"/>
+        <result property="clinicId" column="clinic_id"/>
+        <result property="patientName" column="patient_name"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="clinicName" column="clinic_name"/>
+        <result property="clinicStartTime" column="clinic_start_time"/>
+        <result property="satisfactionRating" column="satisfaction_rating"/>
+        <result property="assessmentId" column="assessment_id"/>
+        <result property="clinicEndTime" column="clinic_end_time"/>
+        <result property="patientCode" column="patient_code"/>
+        <result property="patientAge" column="patient_age"/>
+        <result property="patientGender" column="patient_gender"/>
+        <result property="imageUrl" column="image_url"/>
+        <result property="createTime" column="create_time"/>
+    </resultMap>
+    <select id="selectWebBizPainAssessmentList" resultMap="WebPainAssessment" >
         SELECT
             bpa.id as id,
             bcr.id as clinicId,
@@ -17,6 +33,7 @@
             bcr.patient_code as patientCode,
             bpa.satisfaction_rating as satisfactionRating,
             bpa.id as assessmentId,
+            bpa.create_time as createTime,
             bcr.create_time as create_time,
             bcr.create_by as create_by,
             bcr.update_time as update_time,

+ 35 - 0
tr-modules/tr-module-smartFollowUp/src/main/resources/mapper/smart/BizQuestionGroupMapper.xml

@@ -61,4 +61,39 @@
             </if>
         </where>
     </select>
+
+    <select id="selectQuestionGroupAllList" resultType="cn.tr.module.smart.common.dto.BizQuestionGroupDTO">
+        SELECT
+            bqg.id,
+            bqg.name,
+            bqg.type,
+            bqg.interval,
+            bqg.frequency,
+            bqg.square_id,
+            bqg.is_share,
+            bqg.create_by,
+            bqg.update_by,
+            bqg.create_time,
+            bqg.update_time,
+            bqg.tenant_id,
+            st.avatar as tenant_avatar,
+            st.name as hospital_name,
+            COALESCE(bq_count.cnt, 0) AS question_count
+        FROM
+            biz_question_group bqg
+                left join sys_tenant st on st.id = bqg.tenant_id
+                LEFT JOIN (
+                SELECT group_id, COUNT(1) AS cnt
+                FROM biz_question
+                GROUP BY group_id
+            ) bq_count ON bq_count.group_id = bqg.id
+        <where>
+            <if test="query.condition != null and query.condition != ''">
+                AND bqg.name LIKE CONCAT(CONCAT('%', #{query.condition}), '%')
+            </if>
+            <if test="query.type != null and query.type != ''">
+                AND bqg.type = #{query.type}
+            </if>
+        </where>
+    </select>
 </mapper>