diff --git a/health/src/main/java/com/ccsens/health/api/StudentController.java b/health/src/main/java/com/ccsens/health/api/StudentController.java index 07b9652c..bc90aac6 100644 --- a/health/src/main/java/com/ccsens/health/api/StudentController.java +++ b/health/src/main/java/com/ccsens/health/api/StudentController.java @@ -47,7 +47,7 @@ public class StudentController { return JsonResponse.newInstance().ok(contactPatientVo); } -// @MustLogin + @MustLogin @PostMapping("import") @ApiOperation(value = "导入成员", notes = "") public JsonResponse importMembers(@RequestParam(required = true) Part file) { diff --git a/health/src/main/java/com/ccsens/health/bean/dto/ClockDto.java b/health/src/main/java/com/ccsens/health/bean/dto/ClockDto.java index 4e79f442..a39ceffa 100644 --- a/health/src/main/java/com/ccsens/health/bean/dto/ClockDto.java +++ b/health/src/main/java/com/ccsens/health/bean/dto/ClockDto.java @@ -32,4 +32,15 @@ public class ClockDto { @ApiModelProperty("场所id") private Long id; } + + @Data + @ApiModel("查询打卡用户") + public static class QueryClockUser{ + @ApiModelProperty("场所ID") + private Long siteId; + @ApiModelProperty("进入时间") + private Long inTime; + @ApiModelProperty("出去时间") + private Long outTime; + } } diff --git a/health/src/main/java/com/ccsens/health/bean/dto/MemberDto.java b/health/src/main/java/com/ccsens/health/bean/dto/MemberDto.java index ac4fc75c..f28c3a8a 100644 --- a/health/src/main/java/com/ccsens/health/bean/dto/MemberDto.java +++ b/health/src/main/java/com/ccsens/health/bean/dto/MemberDto.java @@ -33,17 +33,19 @@ public class MemberDto { private String patientName; @ApiModelProperty("病患学号") private String patientMkno; - @ApiModelProperty("姓名") - private String name; - @ApiModelProperty("学号") - private String wkno; - @ApiModelProperty("班级(所在机构)") - private String department; +// @ApiModelProperty("姓名") +// private String name; +// @ApiModelProperty("学号") +// private String wkno; +// @ApiModelProperty("班级(所在机构)") +// private String department; + @ApiModelProperty("出行方式 0铁路 1飞机 2客运车辆 3自驾 4船 5其他") + private Byte tripMode; @ApiModelProperty("车次号") private String carNo; @ApiModelProperty("开始时间") - private String startTime; + private Long startTime; @ApiModelProperty("结束时间") - private String endTime; + private Long endTime; } } diff --git a/health/src/main/java/com/ccsens/health/bean/vo/ClockVo.java b/health/src/main/java/com/ccsens/health/bean/vo/ClockVo.java index f5a0a5f2..397d1676 100644 --- a/health/src/main/java/com/ccsens/health/bean/vo/ClockVo.java +++ b/health/src/main/java/com/ccsens/health/bean/vo/ClockVo.java @@ -75,4 +75,25 @@ public class ClockVo { @ApiModelProperty("出二维码") private String outUrl; } + + @ApiModel("成员打卡信息") + @Data + public static class ClockInMsg{ + @ApiModelProperty("用户id") + private Long userId; + @ApiModelProperty("班级") + private String department; + @ApiModelProperty("学号") + private String no; + @ApiModelProperty("姓名") + private String name; + @ApiModelProperty("场所ID") + private Long siteId; + @ApiModelProperty("场所名") + private String siteName; + @ApiModelProperty("进入打卡时间") + private Long time; + @ApiModelProperty("出去打卡时间") + private Long outTime; + } } diff --git a/health/src/main/java/com/ccsens/health/bean/vo/HealthVo.java b/health/src/main/java/com/ccsens/health/bean/vo/HealthVo.java index eae7ff73..1d1a6676 100644 --- a/health/src/main/java/com/ccsens/health/bean/vo/HealthVo.java +++ b/health/src/main/java/com/ccsens/health/bean/vo/HealthVo.java @@ -65,4 +65,34 @@ public class HealthVo { //已打卡次数 private int times; } + + @Data + public static class HealthDetail{ + @ApiModelProperty("打卡记录的id") + private Long id; + @ApiModelProperty("成员id") + private Long userId; + @ApiModelProperty("日期") + private Long time; + @ApiModelProperty("当前所在地区") + private String district; + @ApiModelProperty("当前所在详细地址") + private String address; + @ApiModelProperty("当前身体状态") + private Long healthTypeId; + @ApiModelProperty("就诊医院") + private String hospital; + @ApiModelProperty("有无湖北武汉接触史 0没有 1有") + private int touchHubei; + @ApiModelProperty("有无接触患者 0无 1有") + private int touchSick; + @ApiModelProperty("体温") + private BigDecimal animalHeat; + @ApiModelProperty("健康状态code") + private Byte code; + @ApiModelProperty("健康状态名字") + private String name; + private String quarantine; + private String independent; + } } diff --git a/health/src/main/java/com/ccsens/health/bean/vo/MemberVo.java b/health/src/main/java/com/ccsens/health/bean/vo/MemberVo.java index aa50bcb5..a2a006bf 100644 --- a/health/src/main/java/com/ccsens/health/bean/vo/MemberVo.java +++ b/health/src/main/java/com/ccsens/health/bean/vo/MemberVo.java @@ -6,7 +6,10 @@ import lombok.Data; import javax.validation.constraints.Max; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Data public class MemberVo { @@ -42,16 +45,14 @@ public class MemberVo { @ApiModel("接触病患学生列表") public static class ContactPatientVo { @ApiModelProperty("校内打卡") - private List contactPatientInsideList; + private List contactPatientInsideList = new ArrayList<>(); @ApiModelProperty("校外行程") - private List contactPatientOutsideList; + private List contactPatientOutsideList = new ArrayList<>(); } @Data @ApiModel("接触病患学生列表(校内打卡)") public static class ContactPatientInside { - @ApiModelProperty("id") - private Long id; @ApiModelProperty("姓名") private String name; @ApiModelProperty("学号") @@ -67,17 +68,19 @@ public class MemberVo { @ApiModelProperty("体温") private BigDecimal animalHeat; @ApiModelProperty("状态 0:健康 1:治愈 2:隔离 3:疑似 4:确诊") - private int healthType; + private Byte healthType; + @ApiModelProperty("名字") + private String healthTypeName; @ApiModelProperty("就诊医院") private String hospital; @ApiModelProperty("上报时详细地址") private String address; @ApiModelProperty("接触场所") - private List contactSiteList; + private Set contactSiteList = new HashSet<>(); @ApiModelProperty("接触病人") - private List contactPatientList; + private String contactPatient; @ApiModelProperty("打卡场所") - private List clockInSiteList; + private List clockInSiteList = new ArrayList<>(); } @Data @@ -104,7 +107,7 @@ public class MemberVo { private String wkno; @ApiModelProperty("班级(所在机构)") private String department; - @ApiModelProperty("'出行方式'") + @ApiModelProperty("出行方式") private int tripMode; @ApiModelProperty("车次号") private String carNo; diff --git a/health/src/main/java/com/ccsens/health/persist/dao/HealthRecordsDao.java b/health/src/main/java/com/ccsens/health/persist/dao/HealthRecordsDao.java index 56129aea..0c9e7f72 100644 --- a/health/src/main/java/com/ccsens/health/persist/dao/HealthRecordsDao.java +++ b/health/src/main/java/com/ccsens/health/persist/dao/HealthRecordsDao.java @@ -17,4 +17,12 @@ public interface HealthRecordsDao extends HealthRecordsMapper { List getHealthQrCodeByEmployeeId(@Param("employeeId")Long employeeId, @Param("startTime")Long startTime, @Param("endTime")Long endTime); HealthVo.NotUpload getNotUpload( @Param("days")Long days, @Param("startTime")Long startTime, @Param("endTime")Long endTime); + + /** + * 根据user_id和endtime查询最新的一条健康上报信息 + * @param userId + * @param endTime + * @return + */ + HealthVo.HealthDetail queryDetail(@Param("userId")Long userId, @Param("endTime") Long endTime); } diff --git a/health/src/main/java/com/ccsens/health/persist/dao/JourneyDao.java b/health/src/main/java/com/ccsens/health/persist/dao/JourneyDao.java index cbaa0fea..10178a1f 100644 --- a/health/src/main/java/com/ccsens/health/persist/dao/JourneyDao.java +++ b/health/src/main/java/com/ccsens/health/persist/dao/JourneyDao.java @@ -1,7 +1,9 @@ package com.ccsens.health.persist.dao; +import com.ccsens.health.bean.dto.MemberDto; import com.ccsens.health.bean.po.Journey; import com.ccsens.health.bean.vo.JourneyVo; +import com.ccsens.health.bean.vo.MemberVo; import com.ccsens.health.persist.mapper.JourneyMapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -25,4 +27,18 @@ public interface JourneyDao extends JourneyMapper { * @return */ List classBackStatistics(@Param("endTime") Long endTime); + + /** + * 根据学号,姓名,时间查询校外行程 + * @param dto + * @return + */ + List queryByNoAndName(MemberDto.ContactPatientDto dto); + + /** + * 根据行程查询 + * @param carNos + * @return + */ + List queryByCarNo(List carNos); } diff --git a/health/src/main/java/com/ccsens/health/persist/dao/SiteClockInDao.java b/health/src/main/java/com/ccsens/health/persist/dao/SiteClockInDao.java index 55aaadaf..9bd26923 100644 --- a/health/src/main/java/com/ccsens/health/persist/dao/SiteClockInDao.java +++ b/health/src/main/java/com/ccsens/health/persist/dao/SiteClockInDao.java @@ -1,5 +1,7 @@ package com.ccsens.health.persist.dao; +import com.ccsens.health.bean.dto.ClockDto; +import com.ccsens.health.bean.dto.MemberDto; import com.ccsens.health.bean.vo.ClockVo; import com.ccsens.health.persist.mapper.SiteClockInMapper; import org.apache.ibatis.annotations.Param; @@ -12,4 +14,19 @@ public interface SiteClockInDao extends SiteClockInMapper { List selectHealthInfoByDate(@Param("employee")Long employee, @Param("startTime")Long startTime, @Param("endTime")Long endTime); int getClockInNumberBySiteId(@Param("siteId")Long siteId, @Param("startTime")Long startTime, @Param("endTime")Long endTime); + + /** + * 查询用户打卡信息 + * @param dto + * @return + */ + List queryRecord(MemberDto.ContactPatientDto dto); + + /** + * 查询场所时间段内的打卡信息 + * @param dtos + * @return + */ + List queryRecordBySite(List dtos); + } diff --git a/health/src/main/java/com/ccsens/health/service/JourneyService.java b/health/src/main/java/com/ccsens/health/service/JourneyService.java index d845622a..7cabb1cb 100644 --- a/health/src/main/java/com/ccsens/health/service/JourneyService.java +++ b/health/src/main/java/com/ccsens/health/service/JourneyService.java @@ -89,7 +89,7 @@ public class JourneyService implements IJourneyService{ @Override public long updateBackNum() { long total = journeyDao.countByType(HealthConstant.JOURNEY_BACK_SCHOOL); - redisUtil.set(HealthConstant.BACK_SCHOOL_TOTAL_REDIS, total); + redisUtil.set(HealthConstant.BACK_SCHOOL_TOTAL_REDIS, total, HealthConstant.REDIS_TIME); log.info("填写返校行程的总人数:{}", total); return total; } diff --git a/health/src/main/java/com/ccsens/health/service/StudentService.java b/health/src/main/java/com/ccsens/health/service/StudentService.java index b6670259..ab129cfb 100644 --- a/health/src/main/java/com/ccsens/health/service/StudentService.java +++ b/health/src/main/java/com/ccsens/health/service/StudentService.java @@ -3,19 +3,18 @@ package com.ccsens.health.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.StrUtil; +import com.ccsens.health.bean.dto.JourneyDto; import com.ccsens.health.bean.dto.MemberDto; -import com.ccsens.health.bean.po.EmployeeExample; -import com.ccsens.health.bean.po.Member; -import com.ccsens.health.bean.po.MemberExample; -import com.ccsens.health.bean.po.RealNameAuthExample; +import com.ccsens.health.bean.po.*; +import com.ccsens.health.bean.vo.ClockVo; +import com.ccsens.health.bean.vo.HealthVo; import com.ccsens.health.bean.vo.MemberVo; -import com.ccsens.health.persist.dao.EmployeeDao; -import com.ccsens.health.persist.dao.MemberDao; -import com.ccsens.health.persist.dao.RealNameAuthDao; +import com.ccsens.health.persist.dao.*; import com.ccsens.health.util.HealthConstant; import com.ccsens.util.*; import com.ccsens.util.bean.dto.QueryDto; import com.ccsens.util.exception.BaseException; +import io.swagger.annotations.ApiModelProperty; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -25,9 +24,13 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.validation.Valid; import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + @Slf4j @Service @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @@ -47,6 +50,14 @@ public class StudentService implements IStudentService{ private RealNameAuthDao realNameAuthDao; @Resource private IAsyncService asyncService; + @Resource + private SiteClockInDao siteClockInDao; + @Resource + private HealthRecordsDao healthRecordsDao; + @Resource + private JourneyDao journeyDao; + + /** * 查询学生健康信息列表 * @param params @@ -100,7 +111,7 @@ public class StudentService implements IStudentService{ public long updateStudentNum() { MemberExample example = new MemberExample(); long total = memberDao.countByExample(example); - redisUtil.set(HealthConstant.MEMBER_TOTAL_REDIS, total); + redisUtil.set(HealthConstant.MEMBER_TOTAL_REDIS, total, HealthConstant.REDIS_TIME); log.info("更新成员总数redis结束:{}", total); return total; } @@ -172,6 +183,129 @@ public class StudentService implements IStudentService{ */ @Override public MemberVo.ContactPatientVo getContactPatient(QueryDto params) { - return null; + log.info("查询接触病患学生列表:{}", params); + // 返回对象 + MemberVo.ContactPatientVo vo = new MemberVo.ContactPatientVo(); + //请求参数 + MemberDto.ContactPatientDto dto = params.getParam(); + // 校外行程车次 + List carNos = new ArrayList<>(); + if (StrUtil.isNotBlank(dto.getCarNo())) { + carNos.add(dto); + } + + if (StrUtil.isNotBlank(dto.getPatientMkno()) || StrUtil.isNotBlank(dto.getPatientName())) { + //查询打卡 + List clockInMsgs = siteClockInDao.queryRecord(dto); + log.info("病人打卡信息"); + if (CollectionUtil.isNotEmpty(clockInMsgs)) { + // 查询同时间同场所接触信息 + List allClockIns = siteClockInDao.queryRecordBySite(clockInMsgs); + //封装用户打卡信息,并查询用户时间范围内最新的健康上报信息 + List insides = transInsideVo(allClockIns, dto.getEndTime(), clockInMsgs.get(0).getName()); + // 查询病人外出行程 + vo.setContactPatientInsideList(insides); + } + // 查询校外行程 + queryJourney(dto, carNos); + } + if (CollectionUtil.isNotEmpty(carNos)) { + List outsides = journeyDao.queryByCarNo(carNos); + vo.getContactPatientOutsideList().addAll(outsides); + } + + log.info("疫情查看"); + + return vo; + } + + /** + * 查询学生的校外行程 + * @param dto + * @param carNos + */ + private void queryJourney(MemberDto.ContactPatientDto dto, List carNos) { + List journeys = journeyDao.queryByNoAndName(dto); + if (CollectionUtil.isNotEmpty(journeys)) { + journeys.forEach(journey -> { + MemberDto.ContactPatientDto carDto = new MemberDto.ContactPatientDto(); + carDto.setCarNo(journey.getCarNo()); + carDto.setTripMode(journey.getTripMode()); + carDto.setStartTime(journey.getStartTime()); + carDto.setEndTime(journey.getEndTime()); + carNos.add(carDto); + }); + } + } + + /** + * 将打卡记录转换为所需样式返回 + * @param allClockIns 转换对象 + * @param endTime 结束时间 + * @return + */ + private List transInsideVo(List allClockIns, Long endTime, String patientName) { + List insides = new ArrayList<>(); + if (CollectionUtil.isEmpty(allClockIns)) { + return insides; + } + Map memberMap = new HashMap<>(); + allClockIns.forEach(clockInMsg -> { + MemberVo.ContactPatientInside inside; + String no = clockInMsg.getNo(); + if (memberMap.containsKey(no)) { + inside = memberMap.get(no); + } else { + inside = new MemberVo.ContactPatientInside(); + inside.setName(clockInMsg.getName()); + inside.setWkno(clockInMsg.getNo()); + inside.setDepartment(clockInMsg.getDepartment()); + inside.setContactPatient(patientName); + //初始化健康信息 + initHealth(endTime, clockInMsg, inside); + memberMap.put(no, inside); + //将对象保存在list中 + insides.add(inside); + } + inside.getContactSiteList().add(clockInMsg.getSiteName()); + inside.getClockInSiteList().add(transClock(clockInMsg)); + }); + + + return insides; + } + + /** + * 转化对象 + * @param clockInMsg + * @return + */ + private MemberVo.ClockInSite transClock(ClockVo.ClockInMsg clockInMsg) { + MemberVo.ClockInSite site = new MemberVo.ClockInSite(); + site.setSiteId(clockInMsg.getSiteId()); + site.setSiteName(clockInMsg.getSiteName()); + site.setInSiteTime(clockInMsg.getTime()); + site.setOutSiteTime(clockInMsg.getOutTime()); + return site; + } + + /** + * 初始化健康信息 + * @param endTime + * @param clockInMsg + * @param inside + */ + private void initHealth(Long endTime, ClockVo.ClockInMsg clockInMsg, MemberVo.ContactPatientInside inside) { + HealthVo.HealthDetail healthDetail = healthRecordsDao.queryDetail(clockInMsg.getUserId(), endTime); + if (healthDetail != null) { + inside.setHealthType(healthDetail.getCode()); + inside.setHealthTypeName(healthDetail.getName()); + inside.setAnimalHeat(healthDetail.getAnimalHeat()); + inside.setTouchHubei(healthDetail.getTouchHubei()); + inside.setTouchSick(healthDetail.getTouchSick()); + inside.setAddress(healthDetail.getDistrict() + healthDetail.getAddress()); + inside.setTime(healthDetail.getTime()); + inside.setHospital(healthDetail.getHospital()); + } } } diff --git a/health/src/main/java/com/ccsens/health/util/HealthConstant.java b/health/src/main/java/com/ccsens/health/util/HealthConstant.java index f49530c1..6a3c4435 100644 --- a/health/src/main/java/com/ccsens/health/util/HealthConstant.java +++ b/health/src/main/java/com/ccsens/health/util/HealthConstant.java @@ -10,6 +10,8 @@ public class HealthConstant { public static final String MEMBER_TOTAL_REDIS = "health_member_total_redis"; /** redis key: 返校行程总人数*/ public static final String BACK_SCHOOL_TOTAL_REDIS = "health_back_school_total_redis"; + /** redis有效时长:30天 */ + public static final long REDIS_TIME = 30 * 24 * 60 * 60; /**成员表 本科生*/ public static final byte MEMBER_UNDERGRADUATE = 0; diff --git a/health/src/main/resources/application.yml b/health/src/main/resources/application.yml index 5889ff7f..5c2cd5c4 100644 --- a/health/src/main/resources/application.yml +++ b/health/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: test - include: common, util-test \ No newline at end of file + active: dev + include: common, util-dev \ No newline at end of file diff --git a/health/src/main/resources/mapper_dao/HealthRecordDao.xml b/health/src/main/resources/mapper_dao/HealthRecordDao.xml index 3a92ad89..4d9167df 100644 --- a/health/src/main/resources/mapper_dao/HealthRecordDao.xml +++ b/health/src/main/resources/mapper_dao/HealthRecordDao.xml @@ -103,4 +103,20 @@ WHERE a.times < #{days} + \ No newline at end of file diff --git a/health/src/main/resources/mapper_dao/JourneyDao.xml b/health/src/main/resources/mapper_dao/JourneyDao.xml index 848ba4e9..c6bce915 100644 --- a/health/src/main/resources/mapper_dao/JourneyDao.xml +++ b/health/src/main/resources/mapper_dao/JourneyDao.xml @@ -1,6 +1,20 @@ + + + + + + + + + + + + + + @@ -57,5 +71,43 @@ on t1.department = t2.department + + + \ No newline at end of file diff --git a/health/src/main/resources/mapper_dao/SiteClockInDao.xml b/health/src/main/resources/mapper_dao/SiteClockInDao.xml index d4edba82..d3058653 100644 --- a/health/src/main/resources/mapper_dao/SiteClockInDao.xml +++ b/health/src/main/resources/mapper_dao/SiteClockInDao.xml @@ -43,5 +43,46 @@ and c.time >= #{startTime} + + \ No newline at end of file diff --git a/tall/src/main/resources/application.yml b/tall/src/main/resources/application.yml new file mode 100644 index 00000000..1d881c2f --- /dev/null +++ b/tall/src/main/resources/application.yml @@ -0,0 +1,4 @@ +spring: + profiles: + active: dev + include: util-dev,common \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/DistanceUtil.java b/util/src/main/java/com/ccsens/util/DistanceUtil.java index c6985673..beaf3daa 100644 --- a/util/src/main/java/com/ccsens/util/DistanceUtil.java +++ b/util/src/main/java/com/ccsens/util/DistanceUtil.java @@ -42,7 +42,7 @@ public class DistanceUtil { */ public static boolean isInCircle(BigDecimal lng1, BigDecimal lat1, BigDecimal lng2, BigDecimal lat2, String radius) { log.info("判断距离参数:{},{},{},{},{}", lat1, lng1, lat2, lng2,radius); - return getDistance(lat1, lng1, lat2, lng2) > Double.parseDouble(radius); + return getDistance(lat1, lng1, lat2, lng2) <= Double.parseDouble(radius); } } diff --git a/util/src/main/java/com/ccsens/util/bean/dto/QueryDto.java b/util/src/main/java/com/ccsens/util/bean/dto/QueryDto.java index 600f2175..50cf2a80 100644 --- a/util/src/main/java/com/ccsens/util/bean/dto/QueryDto.java +++ b/util/src/main/java/com/ccsens/util/bean/dto/QueryDto.java @@ -22,5 +22,4 @@ public class QueryDto { private T param; @ApiModelProperty("登录用户ID 前端不为userId赋值") private Long userId; - }