.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>