yxh
6 天以前 dc4df9a530016c4fd24f9aebc6ccf1b95310ff1f
Changes
已修改19个文件
582 ■■■■■ 文件已修改
.idea/compiler.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/jarRepositories.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ExternalInfoController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatMedInhospController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatReservationRecordController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-local.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/logback.xml 93 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ExternalOutHospInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatArchive.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatArchiveReq.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatReservationRecord.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ExternalInfoServiceImpl.java 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatArchiveServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/compiler.xml
@@ -12,7 +12,6 @@
        <module name="ruoyi-generator" />
        <module name="ruoyi-common" />
        <module name="smartor-admin" />
        <module name="smartor-wuxi (1)" />
        <module name="ruoyi-quartz" />
      </profile>
    </annotationProcessing>
.idea/jarRepositories.xml
@@ -2,11 +2,6 @@
<project version="4">
  <component name="RemoteRepositoriesConfiguration">
    <remote-repository>
      <option name="id" value="aliyun" />
      <option name="name" value="aliyun" />
      <option name="url" value="https://maven.aliyun.com/repository/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Central Repository" />
      <option name="url" value="https://repo.maven.apache.org/maven2" />
@@ -15,11 +10,6 @@
      <option name="id" value="jcenter" />
      <option name="name" value="jcenter" />
      <option name="url" value="https://maven.aliyun.com/repository/public" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Central Repository" />
      <option name="url" value="https://maven.aliyun.com/repository/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="releases" />
@@ -72,11 +62,6 @@
      <option name="url" value="http://repo2.maven.org/maven2/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="central" />
      <option name="url" value="https://maven.aliyun.com/repository/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="snapshots" />
      <option name="name" value="local private nexus snapshots" />
      <option name="url" value="http://122.49.30.5:8981/nexus/content/repositories/snapshots/" />
@@ -85,16 +70,6 @@
      <option name="id" value="maven_repos" />
      <option name="name" value="maven_repos" />
      <option name="url" value="https://nexus.cmread.com:9343/nexus/content/repositories/migu" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="jcenter" />
      <option name="name" value="jcenter" />
      <option name="url" value="https://maven.aliyun.com/repository/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="public" />
      <option name="name" value="aliyun nexus" />
      <option name="url" value="https://maven.aliyun.com/repository/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="jboss.community" />
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ExternalInfoController.java
@@ -88,7 +88,7 @@
    //@PreAuthorize("@ss.hasPermi('smartor:patarchive:list')")
    @PostMapping("/getExternalLeaveHospPatientInfo30Day")
    public Boolean getExternalLeaveHospPatientInfo30Day() {
        Boolean externalInHospPatientInfoBY250325 = externalInfoService.getExternalInHospPatientInfoBY250325();
//        Boolean externalInHospPatientInfoBY250325 = externalInfoService.getExternalInHospPatientInfoBY250325();
        Boolean externalInHospPatientInfo = externalInfoService.getExternalLeaveHospPatientInfo30Day();
        return externalInHospPatientInfo;
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveController.java
@@ -48,7 +48,7 @@
    //@PreAuthorize("@ss.hasPermi('smartor:patarchive:list')")
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody PatArchive patArchive) {
        startPage();
        PageUtils.startPageByPost(patArchive.getPageNum(), patArchive.getPageSize());
        List<PatArchive> list = patArchiveService.selectPatArchiveList(patArchive);
        return getDataTable(list);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatMedInhospController.java
@@ -4,6 +4,8 @@
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.PageUtils;
@@ -41,6 +43,13 @@
    //@PreAuthorize("@ss.hasPermi('smartor:patinhosp:list')")
    @PostMapping("/selectPatMedInhospList")
    public TableDataInfo selectPatMedInhosplist(@RequestBody PatMedInhosp patMedInhosp) {
        //获取当前登陆人
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        if (!"admin".equals(user.getUserName()) && CollectionUtils.isEmpty(patMedInhosp.getDeptcodes()) && CollectionUtils.isEmpty(patMedInhosp.getHospitaldistrictcodes()))
            //如果在院病区科室同时间为空,返回空
            return getDataTable2(0, null);
        PageUtils.startPageByPost(patMedInhosp.getPageNum(), patMedInhosp.getPageSize());
        List<PatMedInhosp> list = patMedInhospService.selectPatMedInhospList(patMedInhosp);
        long count = PageUtils.count(new ISelect() {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatReservationRecordController.java
@@ -17,12 +17,12 @@
import java.util.List;
/**
 * 【请填写功能名称】Controller
 * 患者预约记录Controller
 *
 * @author lihu
 * @date 2025-06-24
 */
@Api("【请填写功能名称】")
@Api("患者预约记录")
@RestController
@RequestMapping("/smartor/record")
public class PatReservationRecordController extends BaseController {
@@ -30,9 +30,9 @@
    private IPatReservationRecordService patReservationRecordService;
    /**
     * 查询【请填写功能名称】列表
     * 查询患者预约记录列表
     */
    @ApiOperation("查询【请填写功能名称】列表")
    @ApiOperation("查询患者预约记录列表")
    //@PreAuthorize("@ss.hasPermi('smartor:record:list')")
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody PatReservationRecord patReservationRecord) {
@@ -42,9 +42,9 @@
    }
    /**
     * 导出【请填写功能名称】列表
     * 导出患者预约记录列表
     */
    @ApiOperation("导出【请填写功能名称】列表")
    @ApiOperation("导出患者预约记录列表")
    //@PreAuthorize("@ss.hasPermi('smartor:record:export')")
    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
@@ -57,7 +57,7 @@
    /**
     * 获取【请填写功能名称】详细信息
     */
    @ApiOperation("获取【请填写功能名称】详细信息")
    @ApiOperation("获取患者预约记录详细信息")
    //@PreAuthorize("@ss.hasPermi('smartor:record:query')")
    @GetMapping(value = "/getInfo/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
@@ -65,9 +65,9 @@
    }
    /**
     * 新增【请填写功能名称】
     * 新增患者预约记录
     */
    @ApiOperation("新增【请填写功能名称】")
    @ApiOperation("新增患者预约记录")
    //@PreAuthorize("@ss.hasPermi('smartor:record:add')")
    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
    @PostMapping("/add")
@@ -76,9 +76,9 @@
    }
    /**
     * 修改【请填写功能名称】
     * 修改患者预约记录
     */
    @ApiOperation("修改【请填写功能名称】")
    @ApiOperation("修改患者预约记录")
    //@PreAuthorize("@ss.hasPermi('smartor:record:edit')")
    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
@@ -87,9 +87,9 @@
    }
    /**
     * 删除【请填写功能名称】
     * 删除患者预约记录
     */
    @ApiOperation("删除【请填写功能名称】")
    @ApiOperation("删除患者预约记录")
    //@PreAuthorize("@ss.hasPermi('smartor:record:remove')")
    @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
    @GetMapping("/remove/{ids}")
ruoyi-admin/src/main/resources/application-local.yml
@@ -19,7 +19,7 @@
        #        password: csbsbxt@123
        #        driver-class-name: org.postgresql.Driver
        #      本地高斯
        url: jdbc:postgresql://192.168.100.122:5432/postgres
        url: jdbc:postgresql://127.0.0.1:5432/postgres
        username: gaussdb
        password: Ls@123456
        driver-class-name: org.postgresql.Driver
@@ -90,7 +90,7 @@
#    port: 6020
    # 地址(公司)
    host: 116.62.18.175
    host: 127.0.0.1
    port: 6020
    # 数据库索引
    database: 0
ruoyi-admin/src/main/resources/application.yml
@@ -37,9 +37,27 @@
logging:
  # 日志路径 示例( Windows配置D:/ruoyi/logs,Linux配置 /home/ruoyi/logs,不填同级目录logs)
  path: D:/ruoyi/ls/logs
  # 字符编码
  charset:
    console: UTF-8
    file: UTF-8
  # 日志文件配置
  file:
    name: ${logging.path}/ruoyi.log
    max-size: 100MB
    max-history: 30
  # 日志级别配置
  level:
    com.ruoyi: debug
    com.ruoyi: info
    com.smartor: info
    org.springframework: warn
    org.apache.ibatis: warn
    # 控制台输出级别
    root: info
  # 日志格式配置
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"
# 用户配置
user:
@@ -56,7 +74,7 @@
    # 国际化资源文件路径
    basename: i18n/messages
  profiles:
    active: local
    active: wx
  # 文件上传
  servlet:
    multipart:
ruoyi-admin/src/main/resources/logback.xml
@@ -1,31 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
    <property name="log.path" value="D:/lihu/logs" />
    <!-- 日志存放路径 8095-->
    <property name="log.path" value="D:/lihu/logs"/>
    <!-- 日志存放路径 8096-->
    <!--    <property name="log.path" value="D:/lihu/logs"/>-->
    <!-- 丽水日志存放路径 -->
    <!--    <property name="log.path" value="/home/software/smartor-logs" />-->
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>l
            <pattern>${og.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
@@ -33,60 +37,61 @@
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    </appender>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
        <encoder charset="UTF-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 用户访问日志输出  -->
    <!-- 用户访问日志输出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-user.log</file>
        <file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
        <encoder charset="UTF-8">
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 系统模块日志级别控制  -->
    <logger name="com.ruoyi" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
    <!-- 系统模块日志级别控制  -->
    <logger name="com.ruoyi" level="info"/>
    <logger name="com.smartor" level="info"/>
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn"/>
    <root level="info">
        <appender-ref ref="console" />
    </root>
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
        <appender-ref ref="console"/>
    </root>
    <!--系统用户操作日志-->
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info"/>
        <appender-ref ref="file_error"/>
    </root>
    <!--系统用户操作日志-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
smartor/src/main/java/com/smartor/domain/ExternalOutHospInfo.java
@@ -37,13 +37,13 @@
    private Long czbz;
    @ApiModelProperty(value = "就诊科室代码")
    private Long ksdm;
    private String ksdm;
    @ApiModelProperty(value = "就诊科室")
    private String ksmc;
    @ApiModelProperty(value = "医生代码")
    private Long ysdm;
    private String ysdm;
    @ApiModelProperty(value = "医生")
    private String ysmc;
smartor/src/main/java/com/smartor/domain/PatArchive.java
@@ -376,5 +376,18 @@
    @ApiModelProperty("主要照护人年龄")
    @Excel(name = "主要照护人年龄")
    private String casePersonAge;
    /**
     * pageNum
     */
    @ApiModelProperty(value = "pageNum")
    @Excel(name = "pageNum")
    private Integer pageNum;
    /**
     * pageSize
     */
    @ApiModelProperty(value = "pageSize")
    @Excel(name = "pageSize")
    private Integer pageSize;
}
smartor/src/main/java/com/smartor/domain/PatArchiveReq.java
@@ -96,7 +96,7 @@
    /**
     * 查看全部  0   查看住院  1  查看门诊  2   查看体检  3
     */
    @ApiModelProperty(value = " 查看住院  1  查看门诊  2   查看体检  3")
    @ApiModelProperty(value = " 查看住院  1  查看门诊  2   查看体检  3   查看出院  4")
    private Long allhosp;
smartor/src/main/java/com/smartor/domain/PatReservationRecord.java
@@ -13,7 +13,7 @@
 * @date 2025-06-24
 */
@Data
@ApiModel("【请填写功能名称】")
@ApiModel("患者预约记录")
public class PatReservationRecord extends BaseEntity {
    private static final long serialVersionUID = 1L;
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java
@@ -191,6 +191,14 @@
    @ApiModelProperty(value = "问题结果 ,给=“值类型”是文本或者数值用的")
    private String scriptResult;
    /**
     * 题目主题
     */
    @Excel(name = "题目结果")
    @ApiModelProperty("题目结果ID(service_subtask_detail里的主键)")
    private String scriptResultId;
    /**
     * 变量参数集合
     */
smartor/src/main/java/com/smartor/service/impl/ExternalInfoServiceImpl.java
@@ -15,6 +15,7 @@
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Period;
@@ -583,105 +584,149 @@
     */
    @Override
    public Boolean getExternalLeaveHospPatientInfo30Day() {
        String startTime = null;
        String endTime = null;
        Date date = patMedInhospMapper.selectEndtimeMax();
        if (ObjectUtils.isNotEmpty(date)) {
            Date now = new Date();
            // 使用Calendar计算30天前
            Calendar cal = Calendar.getInstance();
            cal.setTime(now);
            cal.add(Calendar.DAY_OF_MONTH, -30);
            Date before30Days = cal.getTime();
        try {
            // 固定开始时间
            String fixedStartTime = "2025-03-25";
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//            startTime = formatter.format(date);
//            startTime = formatter.format(before30Days);
            startTime = "2025-03-25";
            endTime = formatter.format(new Date());
        }
        List<ExternalLeaveHospPatientInfo> externalLeaveHospPatientInfo = externalInfoMapper.getExternalLeaveHospPatientInfo(startTime, endTime);
        for (ExternalLeaveHospPatientInfo externalLeaveHospPatientInfo1 : externalLeaveHospPatientInfo) {
            //先对患者基本信息进行处理
            Long patid = dealPatArchive(externalLeaveHospPatientInfo1.getBrid());
            //新增出院数据
            //根据住院号查询入院信息
            PatMedInhosp pmi = new PatMedInhosp();
            pmi.setInhospno(externalLeaveHospPatientInfo1.getZybm());
            List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList2(pmi);
            log.error("通过住院号:{},查询患者入院的信息为:{}", externalLeaveHospPatientInfo1.getZybm(), patMedInhospList);
//            log.error("externalLeaveHospPatientInfo1的结果为:{}", externalLeaveHospPatientInfo1);
            if (CollectionUtils.isEmpty(patMedInhospList)) {
                //如果不存在入院信息,是不是需要获取一下入院信息,则进行新增()
                List<ExternalInHospPatientInfo> externalInHospPatientInfo1 = externalInfoMapper.getExternalInHospPatientInfo(null, null, externalLeaveHospPatientInfo1.getBrid());
                if (CollectionUtils.isNotEmpty(externalInHospPatientInfo1)) {
                    //先对患者基本信息进行处理
                    Long pid = dealPatArchive(externalInHospPatientInfo1.get(0).getBrid());
                    PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
                    //新增入院数据
                    PatMedInhosp inhosp = new PatMedInhosp();
                    inhosp.setInhospno(externalInHospPatientInfo1.get(0).getZyhm());
                    inhosp.setSerialnum(externalInHospPatientInfo1.get(0).getZyhm());
                    inhosp.setNurseId(externalInHospPatientInfo1.get(0).getZrhsbm());
                    inhosp.setNurseName(externalInHospPatientInfo1.get(0).getZrhs());
                    inhosp.setStarttime(externalInHospPatientInfo1.get(0).getRyrq());
                    inhosp.setDiagname(externalInHospPatientInfo1.get(0).getRyqk());
                    inhosp.setDeptcode(externalLeaveHospPatientInfo1.getCyks());
                    inhosp.setDeptname(externalLeaveHospPatientInfo1.getCyksdm());
                    inhosp.setDrname(externalLeaveHospPatientInfo1.getZrys());
                    inhosp.setDrcode(externalLeaveHospPatientInfo1.getZrysbm());
                    inhosp.setHospitaldistrictid("" + externalInHospPatientInfo1.get(0).getBrbqdm());
                    inhosp.setBedNo("" + externalInHospPatientInfo1.get(0).getBrch());
                    inhosp.setPatid(pid);
                    inhosp.setPatname(patArchive.getName());
                    inhosp.setTelcode(patArchive.getTelcode());
                    inhosp.setPatno(patArchive.getPatientno());
                    inhosp.setOutWayName(externalLeaveHospPatientInfo1.getCyfs());
                    inhosp.setEndtime(externalLeaveHospPatientInfo1.getCysq());
                    inhosp.setLeavediagname(externalLeaveHospPatientInfo1.getCyzd());
                    inhosp.setLeavehospitaldistrictcode(externalLeaveHospPatientInfo1.getCybqdm());
                    inhosp.setLeavehospitaldistrictname(externalLeaveHospPatientInfo1.getCybq());
                    inhosp.setLeaveldeptcode(externalLeaveHospPatientInfo1.getCyksdm());
                    inhosp.setLeaveldeptname(externalLeaveHospPatientInfo1.getCyks());
            String today = formatter.format(new Date());
                    inhosp.setSchemestatus(2L);
                    inhosp.setInhospstate("1");
                    inhosp.setCreateTime(new Date());
//                    log.error("新增的patMedInhosp为:{}", inhosp);
                    int i = patMedInhospMapper.insertPatMedInhosp(inhosp);
                    log.error("新增的patMedInhosp结果为:{}", i);
            log.info("开始分批查询出院患者信息,总时间范围:{} 至 {}", fixedStartTime, today);
                } else {
                    log.error("该病人不存在入院信息,病人ID:{}", externalLeaveHospPatientInfo1.getBrid());
                }
            // 计算需要查询的次数
            Calendar startCal = Calendar.getInstance();
            Calendar endCal = Calendar.getInstance();
            Calendar currentCal = Calendar.getInstance();
            } else if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                //如果存在入院信息,则进行修改
                pmi = patMedInhospList.get(0);
                pmi.setOutWayName(externalLeaveHospPatientInfo1.getCyfs());
                pmi.setEndtime(externalLeaveHospPatientInfo1.getCysq());
                pmi.setLeavediagname(externalLeaveHospPatientInfo1.getCyzd());
                pmi.setLeaveldeptcode(externalLeaveHospPatientInfo1.getCyksdm());
                pmi.setLeaveldeptname(externalLeaveHospPatientInfo1.getCyks());
                pmi.setDeptname(externalLeaveHospPatientInfo1.getCyks());
                pmi.setDeptcode(externalLeaveHospPatientInfo1.getCyksdm());
                pmi.setLeavehospitaldistrictcode(externalLeaveHospPatientInfo1.getCybqdm());
                pmi.setLeavehospitaldistrictname(externalLeaveHospPatientInfo1.getCybq());
//                pmi.setSchemestatus(2L);
                pmi.setInhospstate("1");
//                pmi.setUpdateTime(new Date());
                pmi.setNurseId(externalLeaveHospPatientInfo1.getZrhsbm());
                pmi.setNurseName(externalLeaveHospPatientInfo1.getZrhs());
                pmi.setDrcode(externalLeaveHospPatientInfo1.getZrysbm());
                pmi.setDrname(externalLeaveHospPatientInfo1.getZrys());
                log.error("修改的pmi结果为:{}", pmi);
                patMedInhospMapper.updatePatMedInhosp(pmi);
            try {
                startCal.setTime(formatter.parse(fixedStartTime));
                endCal.setTime(formatter.parse(today));
            } catch (ParseException e) {
                log.error("日期解析失败:{}", e.getMessage(), e);
                return false;
            }
            int totalDays = (int) ((endCal.getTimeInMillis() - startCal.getTimeInMillis()) / (1000 * 60 * 60 * 24));
            int batchSize = 10; // 每批10天
            int totalBatches = (int) Math.ceil((double) totalDays / batchSize);
            log.info("总共需要查询 {} 天,分为 {} 批次,每批 {} 天", totalDays, totalBatches, batchSize);
            int totalSuccessCount = 0;
            int totalFailCount = 0;
            // 分批查询
            for (int batch = 0; batch < totalBatches; batch++) {
                // 计算当前批次的开始和结束时间
                Calendar batchStartCal = (Calendar) startCal.clone();
                batchStartCal.add(Calendar.DAY_OF_MONTH, batch * batchSize);
                Calendar batchEndCal = (Calendar) batchStartCal.clone();
                batchEndCal.add(Calendar.DAY_OF_MONTH, batchSize - 1);
                // 确保不超过今天
                if (batchEndCal.after(endCal)) {
                    batchEndCal = (Calendar) endCal.clone();
                }
                String batchStartTime = formatter.format(batchStartCal.getTime());
                String batchEndTime = formatter.format(batchEndCal.getTime());
                log.info("开始查询第 {} 批次,时间范围:{} 至 {}", batch + 1, batchStartTime, batchEndTime);
                try {
                    // 查询当前批次的外部出院患者信息
                    List<ExternalOutHospInfo> externalOutHospInfos = externalInfoMapper.getExternalOutHospInfo(batchStartTime, batchEndTime);
                    log.info("第 {} 批次查询到出院患者信息数量:{}", batch + 1, externalOutHospInfos.size());
                    int batchSuccessCount = 0;
                    int batchFailCount = 0;
                    // 处理当前批次的数据
                    for (ExternalOutHospInfo externalOutHospInfo : externalOutHospInfos) {
                        try {
                            // 处理患者档案
                            Long patid = dealPatArchive(externalOutHospInfo.getBrid());
                            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
                            // 创建门诊记录对象
                            PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
                            // 设置基本信息
                            patMedOuthosp.setOuthospno(externalOutHospInfo.getJzkh());
                            patMedOuthosp.setSerialnum(externalOutHospInfo.getJzkh());
                            patMedOuthosp.setPatid(patid);
                            // 设置患者姓名
                            if (ObjectUtils.isNotEmpty(patArchive)) {
                                patMedOuthosp.setPatname(patArchive.getName());
                            }
                            // 设置诊断信息
                            patMedOuthosp.setIcd10code(externalOutHospInfo.getZddm());
                            patMedOuthosp.setDiagname(externalOutHospInfo.getZdmc());
                            // 设置科室信息
                            patMedOuthosp.setDeptcode(String.valueOf(externalOutHospInfo.getKsdm()));
                            patMedOuthosp.setDeptname(externalOutHospInfo.getKsmc());
                            // 设置医生信息
                            patMedOuthosp.setDrcode(String.valueOf(externalOutHospInfo.getYsdm()));
                            patMedOuthosp.setDrname(externalOutHospInfo.getYsmc());
                            // 设置其他信息
                            patMedOuthosp.setHpi(externalOutHospInfo.getXbs());
                            patMedOuthosp.setMainsuit(externalOutHospInfo.getZs());
                            patMedOuthosp.setCategory(externalOutHospInfo.getLb());
                            patMedOuthosp.setAdmitdate(externalOutHospInfo.getJzrq());
                            // 设置时间字段
                            Date now = new Date();
                            patMedOuthosp.setUploadTime(now);
                            patMedOuthosp.setCreateTime(now);
                            patMedOuthosp.setUpdateTime(now);
                            // 设置默认值
                            patMedOuthosp.setDelFlag("0");  // 删除标志
                            patMedOuthosp.setIsupload(0L);   // 上传标志
                            // 插入数据
                            int result = patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp);
                            if (result > 0) {
                                batchSuccessCount++;
                                totalSuccessCount++;
                            } else {
                                batchFailCount++;
                                totalFailCount++;
                            }
                        } catch (Exception e) {
                            batchFailCount++;
                            totalFailCount++;
                            log.error("处理患者门诊记录时发生异常,患者ID:{},门诊号:{},异常信息:{}",
                                    externalOutHospInfo.getBrid(), externalOutHospInfo.getJzkh(), e.getMessage(), e);
                        }
                    }
                    log.info("第 {} 批次处理完成,成功:{},失败:{}", batch + 1, batchSuccessCount, batchFailCount);
                    // 每批次处理完后稍作延迟,避免对数据库造成过大压力
                    if (batch < totalBatches - 1) {
                        Thread.sleep(1000); // 延迟1秒
                    }
                } catch (Exception e) {
                    log.error("第 {} 批次查询处理时发生异常:{}", batch + 1, e.getMessage(), e);
                    totalFailCount++;
                }
            }
            log.info("所有批次处理完成,总计成功:{},失败:{}", totalSuccessCount, totalFailCount);
            return true;
        } catch (Exception e) {
            log.error("获取出院患者信息时发生异常:{}", e.getMessage(), e);
            return false;
        }
        return null;
    }
smartor/src/main/java/com/smartor/service/impl/PatArchiveServiceImpl.java
@@ -124,6 +124,13 @@
            if (CollectionUtils.isNotEmpty(patArchives3)) {
                patArchiveList.addAll(patArchives3);
            }
        } else if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 4) {
            //  查看住院  1  查看门诊  2   查看体检  3   查看出院 4
            patArchiveReq.setCry(1);
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhospQC(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
            }
        }
        return patArchiveList;
@@ -282,6 +289,7 @@
        List<PatArchiveOthreInfo> patArchiveList = new ArrayList<>();
        if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 1) {
            //  查看住院  1  查看门诊  2   查看体检  3
            patArchiveReq.setCry(0);
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhosp(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
@@ -297,6 +305,13 @@
            List<PatArchiveOthreInfo> patArchives3 = patArchiveMapper.selectPatArchiveInfoByPhysical(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives3)) {
                patArchiveList.addAll(patArchives3);
            }
        }else if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 4) {
            //  查看住院  1  查看门诊  2   查看体检  3   查看出院 4
            patArchiveReq.setCry(1);
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhospQC(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
            }
        }
@@ -605,6 +620,13 @@
            if (CollectionUtils.isNotEmpty(patArchives3)) {
                patArchiveList.addAll(patArchives3);
            }
        }else if (patArchive.getAllhosp() != null && patArchive.getAllhosp() == 4) {
            //  查看住院  1  查看门诊  2   查看体检  3   查看出院 4
            patArchive.setCry(1);
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhospQC(patArchive);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
            }
        }
        //根据患者ID进行分组
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -251,8 +251,6 @@
    @Override
    public List<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO) {
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
        //根据出院 时间倒序
//        List<ServiceSubtask> sortedServiceSubtaskList = selectServiceSubtaskList.stream().sorted(Comparator.comparing(ServiceSubtask::getEndtime).reversed()).collect(Collectors.toList());
        return selectServiceSubtaskList;
    }
@@ -269,6 +267,7 @@
    @Override
    public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) {
        serviceSubtaskVO.setSendstate(null);
        serviceSubtaskVO.setPageSize(99999999);
        serviceSubtaskVO.setPageNum(1);
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
@@ -278,18 +277,15 @@
        Integer yc = 0;
        Integer fssb = 0;
        Integer yfs = 0;
        Integer xj = 0;
        Integer dfs = 0;
        Integer ywc = 0;
        Integer ywc2 = 0;
        Integer blq = 0;
        Integer dsf = 0;
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
            if (serviceSubtask.getSendstate() == 4L) wzx = wzx + 1;
            else if (serviceSubtask.getSendstate() != 4L) ysf = ysf + 1;
            if (serviceSubtask.getSendstate() == 5L) fssb = fssb + 1;
            if (serviceSubtask.getSendstate() == 3L) yfs = yfs + 1;
            if (serviceSubtask.getSendstate() == 1L) xj = xj + 1;
            if (serviceSubtask.getSendstate() == 2L) dfs = dfs + 1;
            if (serviceSubtask.getSendstate() == 6L) ywc = ywc + 1;
            if (serviceSubtask.getSendstate() >= 3L || serviceSubtask.getSendstate() == 1L) yfs = yfs + 1;
            if (serviceSubtask.getSendstate() == 2L) dsf = dsf + 1;
            if (serviceSubtask.getSendstate() == 1L) blq = blq + 1;
            if (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && serviceSubtask.getExcep().equals("1")) yc = yc + 1;
        }
        map.put("wzx", wzx);
@@ -297,10 +293,9 @@
        map.put("yc", yc);
        map.put("fssb", fssb);
        map.put("yfs", yfs);
        map.put("xj", xj);
        map.put("dfs", dfs);
        map.put("ywc", ywc);
        map.put("yfs2", yfs + ywc);
        map.put("blq", blq);
        map.put("dsf", dsf);
        return map;
    }
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -52,7 +52,7 @@
    private IvrLibaTemplateScriptMapper ivrLibaTemplateScriptMapper;
    @Autowired
    private SvyTaskTemplateScriptMapper svyTaskTemplateScriptMapper;
    private SvyLibTemplateScriptMapper svyLibTemplateScriptMapper;
    @Autowired
    private PatArchiveMapper patArchiveMapper;
@@ -65,7 +65,7 @@
    private PatReservationRecordMapper patReservationRecordMapper;
    @Autowired
    private SvyTaskTemplateTargetoptionMapper svyTaskTemplateTargetoptionMapper;
    private SvyLibTemplateTargetoptionMapper svyLibTemplateTargetoptionMapper;
    @Autowired
    private RedisCache redisCache;
@@ -309,55 +309,57 @@
            }
        }
        // 通过模板ID获取问题信息
        SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
        svyTaskTemplateScript.setTemplateID(Long.valueOf(serviceTask.getTemplateid()));
        svyTaskTemplateScript.setDelFlag("0");
        List<SvyTaskTemplateScript> svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
        if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
            log.warn("svyTaskTemplateScripts为空,请尽快联系管理员处理");
            return Collections.emptyList();
        //通过模板ID获取问题信息
        SvyLibTemplateScript svyLibTemplateScript = new SvyLibTemplateScript();
        svyLibTemplateScript.setSvyid(Long.valueOf(serviceTask.getLibtemplateid()));
        svyLibTemplateScript.setDelFlag("0");
        List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSvyLibTemplateScriptList(svyLibTemplateScript);
        if (CollectionUtils.isEmpty(svyLibTemplateScripts) || svyLibTemplateScripts.size() == 0) {
            log.info("ivrLibaTemplateScripts为空了,请尽快联系管理员处理");
            return new ArrayList<>();
        }
        List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOS = DtoConversionUtils.sourceToTarget(svyTaskTemplateScripts, SvyTaskTemplateScriptVO.class);
        List<SvyLibTemplateScriptVO> svyLibTemplateScriptVOS = DtoConversionUtils.sourceToTarget(svyLibTemplateScripts, SvyLibTemplateScriptVO.class);
        // 获取患者信息
        //获取患者信息
        PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
        // 解析textParam
        Map<String, Map<String, String>> ivrTaskMap = Collections.emptyMap();
        //通过患者信息和任务信息中的textParam对问题中的变量进行填充
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Map<String, String>> ivrTaskMap = null;
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            ivrTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class);
        } catch (Exception e) {
            log.error("解析textParam失败", e);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        List<Map<String, String>> mapList = new ArrayList<>(ivrTaskMap.values());
        List<Map<String, String>> mapList = new ArrayList<>();
        // 替换模板问题话术里的通配符
        for (SvyTaskTemplateScriptVO scriptVO : svyTaskTemplateScriptVOS) {
            String content = scriptVO.getScriptContent();
            if (StringUtils.isNotEmpty(content)) {
                // 替换变量
        for (Map<String, String> map : ivrTaskMap.values()) {
            mapList.add(map);
        }
        //将模板问题话术里的通配符替换
        for (SvyLibTemplateScriptVO svyLibTemplateScriptVO : svyLibTemplateScriptVOS) {
            if (StringUtils.isNotEmpty(svyLibTemplateScriptVO.getScriptContent())) {
                for (Map<String, String> map : mapList) {
                    for (Map.Entry<String, String> entry : map.entrySet()) {
                        String key = entry.getKey();
                        String value = StringUtils.defaultString(entry.getValue());
                        content = content.replace(key, value);
                    for (String key : map.keySet()) {
                        svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""));
                    }
                }
                // 替换患者个人信息
                content = content.replace("${name}", StringUtils.defaultString(patArchive.getName()))
                        .replace("${dzz}", StringUtils.defaultString(patArchive.getPlaceOfResidence()))
                        .replace("${dhh}", StringUtils.defaultString(patArchive.getTelcode()));
                scriptVO.setScriptContent(content);
                // 获取问题选项
                SvyTaskTemplateTargetoption optionQuery = new SvyTaskTemplateTargetoption();
                optionQuery.setScriptid(scriptVO.getId());
                List<SvyTaskTemplateTargetoption> options = svyTaskTemplateTargetoptionMapper.selectSvyTaskTemplateTargetoptionList(optionQuery);
                //替换患者个人信息数据
                log.error("问题id:{},   问题内容:{}", svyLibTemplateScriptVO.getId(), svyLibTemplateScriptVO.getScriptContent());
                if (StringUtils.isNotEmpty(svyLibTemplateScriptVO.getScriptContent())) {
                    svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : ""));
                    svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : ""));
                    svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : ""));
                }
                //获取问题选项
                SvyLibTemplateTargetoption svyLibTemplateTargetoption = new SvyLibTemplateTargetoption();
                svyLibTemplateTargetoption.setScriptid(svyLibTemplateScriptVO.getId());
                List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(svyLibTemplateTargetoption);
                // 判断预约人数
                for (SvyTaskTemplateTargetoption stt : options) {
                for (SvyLibTemplateTargetoption stt : svyLibTemplateTargetoptions) {
                    Boolean full = patReservationRecordMapper.existsEqualNum(stt.getId());
                    if (Boolean.TRUE.equals(full)) {
                        stt.setPerson(-1L);
@@ -368,11 +370,11 @@
                    stt.setJmid(id);
                    stt.setId(null);
                }
                scriptVO.setSvyTaskTemplateTargetoptions(options);
                svyLibTemplateScriptVO.setSvyLibTemplateTargetoptions(svyLibTemplateTargetoptions);
            }
        }
        svyTaskTemplateScriptVOS.sort(Comparator.comparingLong(SvyTaskTemplateScriptVO::getSort));
        return svyTaskTemplateScriptVOS;
        svyLibTemplateScriptVOS.sort(Comparator.comparingLong(SvyLibTemplateScriptVO::getSort));
        return svyLibTemplateScriptVOS;
    }
    private List xjInfo(Long templateId, Long taskid, Long patid, Boolean isFinish) {
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -393,12 +393,13 @@
        a.leavehospitaldistrictcode,
        a.leavehospitaldistrictname,
        a.diagname
        <if test="serviceType != null  and serviceType != ''and serviceType != '2'and serviceType != '3'">order by
            a.long_send_time desc
        order by a.visit_time desc
        <if test="serviceType != null  and serviceType != ''and serviceType != '2'and serviceType != '3'">
            ,a.long_send_time desc
        </if>
        <if test="serviceType != null  and serviceType != ''and serviceType == '2'">order by a.endtime desc</if>
        <if test="serviceType != null  and serviceType != ''and serviceType == '3'">order by a.admindate desc</if>
        -- order by update_time desc,id desc
        <if test="serviceType != null  and serviceType != ''and serviceType == '2'">,a.endtime desc</if>
        <if test="serviceType != null  and serviceType != ''and serviceType == '3'">,a.admindate desc</if>
    </select>