diff --git a/intc-api/intc-api-health/pom.xml b/intc-api/intc-api-health/pom.xml
new file mode 100644
index 0000000..fd7279c
--- /dev/null
+++ b/intc-api/intc-api-health/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ com.intc
+ intc-api
+ 3.6.3
+
+ 4.0.0
+
+ intc-api-health
+
+
+ intc-api-health 健康模块远程调用接口
+
+
+
+
+
+
+ com.intc
+ intc-common-core
+
+
+
+
+
diff --git a/intc-api/intc-api-health/src/main/java/com/intc/api/health/RemoteHealthService.java b/intc-api/intc-api-health/src/main/java/com/intc/api/health/RemoteHealthService.java
new file mode 100644
index 0000000..817b03a
--- /dev/null
+++ b/intc-api/intc-api-health/src/main/java/com/intc/api/health/RemoteHealthService.java
@@ -0,0 +1,40 @@
+package com.intc.api.health;
+
+import com.intc.common.core.constant.ServiceNameConstants;
+import com.intc.common.core.domain.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 健康模块远程调用服务
+ *
+ * @author intc
+ */
+@FeignClient(contextId = "remoteHealthService", value = ServiceNameConstants.INTC_HEALTH, fallbackFactory = com.intc.api.health.factory.RemoteHealthFallbackFactory.class)
+public interface RemoteHealthService {
+
+ /**
+ * 每日生成服药任务
+ *
+ * @return 结果
+ */
+ @RequestMapping(value = "/job/generateDailyTasks", method = RequestMethod.POST)
+ R generateDailyTasks();
+
+ /**
+ * 扫描并发送服药提醒
+ *
+ * @return 结果
+ */
+ @RequestMapping(value = "/job/scanAndSendReminders", method = RequestMethod.POST)
+ R scanAndSendReminders();
+
+ /**
+ * 扫描超时未服药任务
+ *
+ * @return 结果
+ */
+ @RequestMapping(value = "/job/scanOverdueRecords", method = RequestMethod.POST)
+ R scanOverdueRecords();
+}
diff --git a/intc-api/intc-api-health/src/main/java/com/intc/api/health/factory/RemoteHealthFallbackFactory.java b/intc-api/intc-api-health/src/main/java/com/intc/api/health/factory/RemoteHealthFallbackFactory.java
new file mode 100644
index 0000000..935c7c4
--- /dev/null
+++ b/intc-api/intc-api-health/src/main/java/com/intc/api/health/factory/RemoteHealthFallbackFactory.java
@@ -0,0 +1,41 @@
+package com.intc.api.health.factory;
+
+import com.intc.api.health.RemoteHealthService;
+import com.intc.common.core.domain.R;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 健康服务降级处理
+ *
+ * @author intc
+ */
+@Component
+public class RemoteHealthFallbackFactory implements FallbackFactory {
+
+ private static final Logger log = LoggerFactory.getLogger(RemoteHealthFallbackFactory.class);
+
+ @Override
+ public RemoteHealthService create(Throwable throwable) {
+ log.error("健康服务调用失败:{}", throwable.getMessage());
+ return new RemoteHealthService() {
+
+ @Override
+ public R generateDailyTasks() {
+ return R.fail("健康服务调用每日生成服药任务失败");
+ }
+
+ @Override
+ public R scanAndSendReminders() {
+ return R.fail("健康服务调用扫描服药提醒失败");
+ }
+
+ @Override
+ public R scanOverdueRecords() {
+ return R.fail("健康服务调用扫描超时未服药记录失败");
+ }
+ };
+ }
+}
diff --git a/intc-api/intc-api-health/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/intc-api/intc-api-health/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 0000000..4389ae5
--- /dev/null
+++ b/intc-api/intc-api-health/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+com.intc.api.health.factory.RemoteHealthFallbackFactory
\ No newline at end of file
diff --git a/intc-api/pom.xml b/intc-api/pom.xml
index 3395678..db3a536 100644
--- a/intc-api/pom.xml
+++ b/intc-api/pom.xml
@@ -11,6 +11,7 @@
intc-api-system
intc-api-invest
+ intc-api-health
intc-api
pom
diff --git a/intc-common/intc-common-core/src/main/java/com/intc/common/core/constant/ServiceNameConstants.java b/intc-common/intc-common-core/src/main/java/com/intc/common/core/constant/ServiceNameConstants.java
index da07691..55d79d9 100644
--- a/intc-common/intc-common-core/src/main/java/com/intc/common/core/constant/ServiceNameConstants.java
+++ b/intc-common/intc-common-core/src/main/java/com/intc/common/core/constant/ServiceNameConstants.java
@@ -65,4 +65,9 @@ public class ServiceNameConstants
* INTC_INVEST_PROD的serviceId
*/
public static final String INTC_INVEST_PROD ="intc-invest-prod";
+
+ /**
+ * INTC_HEALTH的serviceId
+ */
+ public static final String INTC_HEALTH = "intc-health";
}
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/controller/HealthJobController.java b/intc-modules/intc-health/src/main/java/com/intc/health/controller/HealthJobController.java
new file mode 100644
index 0000000..b5c8270
--- /dev/null
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/controller/HealthJobController.java
@@ -0,0 +1,59 @@
+package com.intc.health.controller;
+
+import com.intc.common.core.web.domain.AjaxResult;
+import com.intc.health.task.MedicationRemindJob;
+import com.intc.health.task.MedicationTaskJob;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 健康模块定时任务触发接口(供 intc-job 远程调用)
+ *
+ * @author intc
+ */
+@RestController
+@RequestMapping("/job")
+@Api(tags = "健康模块定时任务接口")
+public class HealthJobController {
+
+ @Resource
+ private MedicationTaskJob medicationTaskJob;
+
+ @Resource
+ private MedicationRemindJob medicationRemindJob;
+
+ /**
+ * 每日生成服药任务
+ */
+ @PostMapping("/generateDailyTasks")
+ @ApiOperation("每日生成服药任务")
+ public AjaxResult generateDailyTasks() {
+ medicationTaskJob.generateDailyTasks();
+ return AjaxResult.success();
+ }
+
+ /**
+ * 扫描并发送服药提醒
+ */
+ @PostMapping("/scanAndSendReminders")
+ @ApiOperation("扫描并发送服药提醒")
+ public AjaxResult scanAndSendReminders() {
+ medicationRemindJob.scanAndSendReminders();
+ return AjaxResult.success();
+ }
+
+ /**
+ * 扫描超时未服药任务
+ */
+ @PostMapping("/scanOverdueRecords")
+ @ApiOperation("扫描超时未服药任务")
+ public AjaxResult scanOverdueRecords() {
+ medicationRemindJob.scanOverdueRecords();
+ return AjaxResult.success();
+ }
+}
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/controller/MedicationTaskController.java b/intc-modules/intc-health/src/main/java/com/intc/health/controller/MedicationTaskController.java
index 90b0fd5..15c8f8b 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/controller/MedicationTaskController.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/controller/MedicationTaskController.java
@@ -58,8 +58,10 @@ public class MedicationTaskController extends BaseController {
@ApiOperation("确认服药")
@RequiresPermissions("health:medicationTask:edit")
@Log(title = "服药任务", businessType = BusinessType.UPDATE)
- public AjaxResult confirm(@PathVariable Long id, @RequestParam(required = false) Integer confirmType) {
- return toAjax(taskService.confirm(id, confirmType));
+ public AjaxResult confirm(@PathVariable Long id,
+ @RequestParam(required = false) Integer confirmType,
+ @RequestParam(required = false) String confirmTime) {
+ return toAjax(taskService.confirm(id, confirmType, confirmTime));
}
@PutMapping("/skip/{id}")
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/domain/ChronicDiseaseRecord.java b/intc-modules/intc-health/src/main/java/com/intc/health/domain/ChronicDiseaseRecord.java
index 6591fd0..a9ec46d 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/domain/ChronicDiseaseRecord.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/domain/ChronicDiseaseRecord.java
@@ -23,6 +23,9 @@ public class ChronicDiseaseRecord extends BaseEntity {
@ApiModelProperty("关联成员ID")
private Long personId;
+ @ApiModelProperty("关联疾病ID")
+ private Long diseaseId;
+
@ApiModelProperty("疾病名称")
private String diseaseName;
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationPlanVo.java b/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationPlanVo.java
index 91a9533..11615f8 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationPlanVo.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationPlanVo.java
@@ -1,13 +1,13 @@
package com.intc.health.domain.vo;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
+import java.util.Date;
/**
* 用药计划VO
@@ -62,10 +62,12 @@ public class MedicationPlanVo {
private JsonNode timeSlots;
@ApiModelProperty("开始日期")
- private LocalDate startDate;
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date startDate;
@ApiModelProperty("结束日期")
- private LocalDate endDate;
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date endDate;
@ApiModelProperty("是否开启提醒:1-是 0-否")
private Integer remindEnabled;
@@ -89,5 +91,6 @@ public class MedicationPlanVo {
private Integer todayCompleted;
@ApiModelProperty("创建时间")
- private LocalDateTime createTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
}
\ No newline at end of file
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationTaskVo.java b/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationTaskVo.java
index 52d0c33..9cb2312 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationTaskVo.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/domain/vo/MedicationTaskVo.java
@@ -1,13 +1,12 @@
package com.intc.health.domain.vo;
+import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.util.Date;
/**
* 服药任务VO
@@ -38,16 +37,19 @@ public class MedicationTaskVo {
private String medicineName;
@ApiModelProperty("计划服药日期")
- private LocalDate plannedDate;
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date plannedDate;
@ApiModelProperty("计划服药时间")
- private LocalTime plannedTime;
+ @JsonFormat(pattern = "HH:mm:ss")
+ private Date plannedTime;
@ApiModelProperty("计划剂量")
private BigDecimal plannedDosage;
@ApiModelProperty("实际服药时间")
- private LocalDateTime actualTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date actualTime;
@ApiModelProperty("实际剂量")
private BigDecimal actualDosage;
@@ -68,8 +70,10 @@ public class MedicationTaskVo {
private Integer remindStatus;
@ApiModelProperty("提醒时间")
- private LocalDateTime remindTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date remindTime;
@ApiModelProperty("创建时间")
- private LocalDateTime createTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
}
\ No newline at end of file
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/mapper/ChronicDiseaseRecordMapper.java b/intc-modules/intc-health/src/main/java/com/intc/health/mapper/ChronicDiseaseRecordMapper.java
index 224f973..8680d1b 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/mapper/ChronicDiseaseRecordMapper.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/mapper/ChronicDiseaseRecordMapper.java
@@ -1,5 +1,6 @@
package com.intc.health.mapper;
+import com.intc.common.datascope.annotation.DataScope;
import java.util.List;
import com.intc.health.domain.vo.ChronicDiseaseRecordVo;
import com.intc.health.domain.dto.ChronicDiseaseRecordDto;
@@ -27,6 +28,7 @@ public interface ChronicDiseaseRecordMapper
* @param chronicDiseaseRecordDto 慢性疾病档案
* @return 慢性疾病档案集合
*/
+ @DataScope(businessAlias = "a")
public List selectChronicDiseaseRecordList(ChronicDiseaseRecordDto chronicDiseaseRecordDto);
/**
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationPlanMapper.java b/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationPlanMapper.java
index 407cd7c..44c56b3 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationPlanMapper.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationPlanMapper.java
@@ -1,5 +1,6 @@
package com.intc.health.mapper;
+import com.intc.common.datascope.annotation.DataScope;
import com.intc.health.domain.MedicationPlan;
import com.intc.health.domain.dto.MedicationPlanDto;
import com.intc.health.domain.vo.MedicationPlanVo;
@@ -23,6 +24,7 @@ public interface MedicationPlanMapper {
/**
* 查询用药计划列表
*/
+ @DataScope(businessAlias = "a")
List selectList(MedicationPlanDto dto);
/**
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationTaskMapper.java b/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationTaskMapper.java
index cfb54a8..993cdfd 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationTaskMapper.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/mapper/MedicationTaskMapper.java
@@ -1,5 +1,6 @@
package com.intc.health.mapper;
+import com.intc.common.datascope.annotation.DataScope;
import com.intc.health.domain.MedicationTask;
import com.intc.health.domain.dto.MedicationTaskDto;
import com.intc.health.domain.vo.MedicationTaskVo;
@@ -25,6 +26,7 @@ public interface MedicationTaskMapper {
/**
* 查询服药任务列表
*/
+ @DataScope(businessAlias = "a")
List selectList(MedicationTaskDto dto);
/**
@@ -67,6 +69,11 @@ public interface MedicationTaskMapper {
*/
int countByPlanAndDate(@Param("planId") Long planId, @Param("date") LocalDate date);
+ /**
+ * 删除某计划某天的所有任务(用于重新生成时清理旧数据)
+ */
+ int deleteByPlanAndDate(@Param("planId") Long planId, @Param("date") LocalDate date);
+
/**
* 统计某计划某天的已服药数
*/
@@ -87,21 +94,21 @@ public interface MedicationTaskMapper {
/**
* 获取总体统计
*/
- java.util.Map getOverallStats(@Param("memberId") Long memberId,
+ java.util.Map getOverallStats(@Param("personId") Long personId,
@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate);
/**
* 获取每日统计
*/
- List> getDailyStats(@Param("memberId") Long memberId,
+ List> getDailyStats(@Param("personId") Long personId,
@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate);
/**
* 获取时段统计
*/
- List> getTimeSlotStats(@Param("memberId") Long memberId,
+ List> getTimeSlotStats(@Param("personId") Long personId,
@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate);
}
\ No newline at end of file
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/service/IMedicationTaskService.java b/intc-modules/intc-health/src/main/java/com/intc/health/service/IMedicationTaskService.java
index 4354210..af445b9 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/service/IMedicationTaskService.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/service/IMedicationTaskService.java
@@ -42,7 +42,7 @@ public interface IMedicationTaskService {
/**
* 确认服药
*/
- int confirm(Long id, Integer confirmType);
+ int confirm(Long id, Integer confirmType, String confirmTime);
/**
* 跳过服药
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationPlanServiceImpl.java b/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationPlanServiceImpl.java
index 9d426ab..8188bdb 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationPlanServiceImpl.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationPlanServiceImpl.java
@@ -27,19 +27,12 @@ public class MedicationPlanServiceImpl implements IMedicationPlanService {
@Override
public MedicationPlanVo selectById(Long id) {
- MedicationPlanVo vo = planMapper.selectById(id);
- if (vo != null) {
- // 统计今日任务情况
- // TODO: 添加今日任务统计
- }
- return vo;
+ return planMapper.selectById(id);
}
@Override
public List selectList(MedicationPlanDto dto) {
- List list = planMapper.selectList(dto);
- // TODO: 可以添加今日任务统计
- return list;
+ return planMapper.selectList(dto);
}
@Override
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationTaskServiceImpl.java b/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationTaskServiceImpl.java
index ce00e2b..db3bd6a 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationTaskServiceImpl.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/service/impl/MedicationTaskServiceImpl.java
@@ -10,7 +10,9 @@ import com.intc.health.service.IMedicationTaskService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
+import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.List;
/**
@@ -58,12 +60,27 @@ public class MedicationTaskServiceImpl implements IMedicationTaskService {
}
@Override
- public int confirm(Long id, Integer confirmType) {
+ public int confirm(Long id, Integer confirmType, String confirmTime) {
MedicationTask task = new MedicationTask();
task.setId(id);
task.setStatus(1); // 已服药
task.setConfirmType(confirmType != null ? confirmType : 1);
- task.setActualTime(LocalDateTime.now());
+ // 优先使用前端传入的实际服药时间,没有则用当前时间
+ if (confirmTime != null && !confirmTime.isEmpty()) {
+ try {
+ LocalTime time = LocalTime.parse(confirmTime, java.time.format.DateTimeFormatter.ofPattern("HH:mm"));
+ task.setActualTime(LocalDateTime.of(LocalDate.now(), time));
+ } catch (Exception e1) {
+ try {
+ LocalTime time = LocalTime.parse(confirmTime, java.time.format.DateTimeFormatter.ofPattern("HH:mm:ss"));
+ task.setActualTime(LocalDateTime.of(LocalDate.now(), time));
+ } catch (Exception e2) {
+ task.setActualTime(LocalDateTime.now());
+ }
+ }
+ } else {
+ task.setActualTime(LocalDateTime.now());
+ }
task.setUpdateBy(SecurityUtils.getUsername());
task.setUpdateTime(DateUtils.getNowDate());
return taskMapper.update(task);
diff --git a/intc-modules/intc-health/src/main/java/com/intc/health/task/MedicationTaskJob.java b/intc-modules/intc-health/src/main/java/com/intc/health/task/MedicationTaskJob.java
index efdc836..2dd3168 100644
--- a/intc-modules/intc-health/src/main/java/com/intc/health/task/MedicationTaskJob.java
+++ b/intc-modules/intc-health/src/main/java/com/intc/health/task/MedicationTaskJob.java
@@ -16,9 +16,11 @@ import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
+import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
/**
@@ -70,19 +72,26 @@ public class MedicationTaskJob {
continue;
}
- // 检查是否已生成过任务
- int existCount = taskMapper.countByPlanAndDate(plan.getId(), date);
- if (existCount > 0) {
+ // 先计算本次应生成的任务列表
+ List tasks = generateTasksForPlan(plan, date);
+ if (tasks.isEmpty()) {
continue;
}
- // 生成任务
- List tasks = generateTasksForPlan(plan, date);
- if (!tasks.isEmpty()) {
- taskMapper.batchInsert(tasks);
- generatedCount += tasks.size();
- log.info("计划 {} 在 {} 生成了 {} 条任务", plan.getPlanName(), date, tasks.size());
+ // 检查已生成的任务数,只补充未生成的部分(防止重复)
+ int existCount = taskMapper.countByPlanAndDate(plan.getId(), date);
+ if (existCount >= tasks.size()) {
+ // 已全量生成,跳过
+ continue;
}
+
+ // 未全量生成时,删除旧的再重新全量插入(保证幂等)
+ if (existCount > 0) {
+ taskMapper.deleteByPlanAndDate(plan.getId(), date);
+ }
+ taskMapper.batchInsert(tasks);
+ generatedCount += tasks.size();
+ log.info("计划 {} 在 {} 生成了 {} 条任务", plan.getPlanName(), date, tasks.size());
} catch (Exception e) {
log.error("生成计划 {} 的任务失败: {}", plan.getId(), e.getMessage(), e);
}
@@ -96,10 +105,10 @@ public class MedicationTaskJob {
*/
private boolean shouldTakeMedicineOnDate(MedicationPlanVo plan, LocalDate date) {
// 检查日期范围
- if (plan.getStartDate() != null && date.isBefore(plan.getStartDate())) {
+ if (plan.getStartDate() != null && date.isBefore(toLocalDate(plan.getStartDate()))) {
return false;
}
- if (plan.getEndDate() != null && date.isAfter(plan.getEndDate())) {
+ if (plan.getEndDate() != null && date.isAfter(toLocalDate(plan.getEndDate()))) {
return false;
}
@@ -152,7 +161,7 @@ public class MedicationTaskJob {
* 隔天服药判断
*/
private boolean shouldTakeOnAlternate(MedicationPlanVo plan, LocalDate date) {
- LocalDate startDate = plan.getStartDate();
+ LocalDate startDate = plan.getStartDate() != null ? toLocalDate(plan.getStartDate()) : null;
if (startDate == null) {
startDate = date;
}
@@ -182,23 +191,25 @@ public class MedicationTaskJob {
List tasks = new ArrayList<>();
JsonNode timeSlots = plan.getTimeSlots();
+ log.info("计划 {} timeSlots原始值={}, isArray={}, nodeType={}",
+ plan.getId(), timeSlots, timeSlots != null && timeSlots.isArray(), timeSlots != null ? timeSlots.getNodeType() : null);
+ // TextNode说明存储时被二次序列化,需要再解析一次
+ if (timeSlots != null && timeSlots.isTextual()) {
+ try {
+ timeSlots = new com.fasterxml.jackson.databind.ObjectMapper().readTree(timeSlots.asText());
+ } catch (Exception e) {
+ timeSlots = null;
+ }
+ }
if (timeSlots == null || !timeSlots.isArray()) {
// 如果没有配置时段,使用默认时段
timeSlots = createDefaultTimeSlots(plan);
}
for (JsonNode slot : timeSlots) {
- if (!slot.has("enabled") || !slot.get("enabled").asBoolean(true)) {
- continue;
- }
-
- String timeStr = slot.has("time") ? slot.get("time").asText() : "08:00";
- LocalTime time = parseTime(timeStr);
-
+ String timeStr = slot.asText();
BigDecimal dosage = plan.getDosagePerTime();
- if (slot.has("dosage")) {
- dosage = new BigDecimal(slot.get("dosage").asText());
- }
+ LocalTime time = parseTime(timeStr);
MedicationTask task = new MedicationTask();
task.setPlanId(plan.getId());
@@ -230,6 +241,13 @@ public class MedicationTaskJob {
}
}
+ /**
+ * Date 转 LocalDate
+ */
+ private LocalDate toLocalDate(Date date) {
+ return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+ }
+
/**
* 解析时间字符串
*/
diff --git a/intc-modules/intc-health/src/main/resources/mapper/health/ChronicDiseaseRecordMapper.xml b/intc-modules/intc-health/src/main/resources/mapper/health/ChronicDiseaseRecordMapper.xml
index baadaf2..b2aac63 100644
--- a/intc-modules/intc-health/src/main/resources/mapper/health/ChronicDiseaseRecordMapper.xml
+++ b/intc-modules/intc-health/src/main/resources/mapper/health/ChronicDiseaseRecordMapper.xml
@@ -8,7 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
+
@@ -28,7 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- select a.id, a.person_id, a.disease_name, a.disease_code, a.diagnosis_date,
+ select a.id, a.person_id,a.disease_id, a.disease_name, a.disease_code, a.diagnosis_date,
a.disease_status, a.main_doctor, a.hospital, a.department, a.notes, a.is_active,
a.create_by, a.create_time, a.update_by, a.update_time, a.del_flag, a.remark,
p.name as person_name
@@ -62,6 +62,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and a.diagnosis_date <= #{diagnosisDateEnd}
+
+ ${params.dataScope}
order by a.create_time desc
@@ -81,6 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
id,
person_id,
+ disease_id,
disease_name,
disease_code,
diagnosis_date,
@@ -100,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id},
#{personId},
+ #{diseaseId},
#{diseaseName},
#{diseaseCode},
#{diagnosisDate},
@@ -122,6 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update chronic_disease_record
person_id = #{personId},
+ disease_id = #{diseaseId},
disease_name = #{diseaseName},
disease_code = #{diseaseCode},
diagnosis_date = #{diagnosisDate},
diff --git a/intc-modules/intc-health/src/main/resources/mapper/health/MedicationPlanMapper.xml b/intc-modules/intc-health/src/main/resources/mapper/health/MedicationPlanMapper.xml
index e11f3a2..29bb0e1 100644
--- a/intc-modules/intc-health/src/main/resources/mapper/health/MedicationPlanMapper.xml
+++ b/intc-modules/intc-health/src/main/resources/mapper/health/MedicationPlanMapper.xml
@@ -24,6 +24,8 @@
+
+
@@ -33,7 +35,9 @@
a.medicine_name, a.specification, a.dosage_per_time, a.dosage_unit,
a.frequency_type, a.frequency_config, a.time_slots, a.start_date, a.end_date,
a.remind_enabled, a.remind_advance_min, a.notify_family, a.family_member_ids,
- a.status, a.create_time
+ a.status, a.create_time,
+ (select count(1) from medication_task t where t.plan_id = a.id and t.del_flag = 0 and t.planned_date = current_date) as today_total,
+ (select count(1) from medication_task t where t.plan_id = a.id and t.del_flag = 0 and t.planned_date = current_date and t.status = 1) as today_completed
from medication_plan a
left join health_person p on a.person_id = p.id
left join chronic_disease_record c on a.chronic_disease_id = c.id
@@ -60,6 +64,8 @@
and (a.plan_name like '%' || #{keyword} || '%' or a.medicine_name like '%' || #{keyword} || '%')
+
+ ${params.dataScope}
order by a.create_time desc
diff --git a/intc-modules/intc-health/src/main/resources/mapper/health/MedicationTaskMapper.xml b/intc-modules/intc-health/src/main/resources/mapper/health/MedicationTaskMapper.xml
index f143cd8..bffa40a 100644
--- a/intc-modules/intc-health/src/main/resources/mapper/health/MedicationTaskMapper.xml
+++ b/intc-modules/intc-health/src/main/resources/mapper/health/MedicationTaskMapper.xml
@@ -52,6 +52,8 @@
and a.medicine_name like '%' || #{keyword} || '%'
+
+ ${params.dataScope}
order by a.planned_date desc, a.planned_time desc
@@ -118,6 +120,11 @@
where del_flag = 0 and plan_id = #{planId} and planned_date = #{date}
+
+ delete from medication_task
+ where plan_id = #{planId} and planned_date = #{date} and status = 0
+
+