style(watch): 关爱人员标记及相关统计功能调整

This commit is contained in:
2026-06-12 11:49:00 +08:00
parent 7775f6eef4
commit 0b6b5856d1
6 changed files with 119 additions and 8 deletions
@@ -16,4 +16,10 @@ public class DepartDeviceNum {
private Integer wearCount;
/** 关爱人员佩戴数 */
private Integer careWearCount;
/** 关爱人员未佩戴数 */
private Integer careUnwearCount;
}
@@ -39,6 +39,12 @@ public class DepartStatTransfer {
/** 二级部门汇总的非关爱人员数量(仅在指定二级部门时有值) */
private Integer secondDepartNonCareNum;
/** 各部门关爱人员佩戴/未佩戴数 MaporgCode → DepartDeviceNum */
private Map<String, DepartDeviceNum> careWearNumMap;
/** 二级部门汇总的关爱人员佩戴/未佩戴数(仅在指定二级部门时有值) */
private DepartDeviceNum secondDepartCareWearNum;
private IPage<DeptStatData> pagedData;
private List<DeptStatData> data;
@@ -33,28 +33,44 @@ public class DeptStatData {
/**
* 佩戴人员数
*/
@Excel(name = "佩戴人员数", width = 15,orderNum = "6")
@Excel(name = "佩戴人员数", width = 15, orderNum = "6")
private Integer assignedUserNums;
/**
* 关爱人员佩戴数
*/
@Excel(name = "关爱人员佩戴人数", width = 18, orderNum = "7")
private Integer careWearNums;
/**
* 未佩戴人员数
*/
@Excel(name = "未佩戴人员数", width = 15,orderNum = "7")
@Excel(name = "未佩戴人员数", width = 15, orderNum = "8")
private Integer undistributedUserNums;
/**
* 关爱人员未佩戴数
*/
@Excel(name = "关爱人员未佩戴人数", width = 18, orderNum = "9")
private Integer careUnwearNums;
@Excel(name = "心率异常人数", width = 15,orderNum = "8")
@Excel(name = "心率异常人数", width = 15, orderNum = "10")
private Integer heartRateNums;
@Excel(name = "血氧异常人数", width = 15,orderNum = "9")
@Excel(name = "血氧异常人数", width = 15, orderNum = "11")
private Integer spo2Nums;
@Excel(name = "压力异常人数", width = 15,orderNum = "10")
@Excel(name = "压力异常人数", width = 15, orderNum = "12")
private Integer stressNums;
@Excel(name = "体温异常人数", width = 15,orderNum = "11")
@Excel(name = "体温异常人数", width = 15, orderNum = "13")
private Integer tempNums;
/**
* 非关爱人员数量
*/
@Excel(name = "非关爱人员数量", width = 15, orderNum = "12")
@Excel(name = "非关爱人员数量", width = 15, orderNum = "14")
private Integer nonCareNums;
/**
* 关爱人员数量(已分配设备数 - 非关爱人员数量)
*/
@Excel(name = "关爱人员数量", width = 15, orderNum = "15")
private Integer careNums;
}
@@ -48,6 +48,14 @@ public interface WatchStatisticsMapper {
})
List<DepartDeviceNum> nonCareNums(DepartStatsFilter filter);
@SelectProvider(type = WatchStatisticsProvider.class, method = "careWearNumsSql")
@Results({
@Result(column = "org_code", property = "orgCode"),
@Result(column = "care_wear_count", property = "careWearCount"),
@Result(column = "care_unwear_count", property = "careUnwearCount")
})
List<DepartDeviceNum> careWearNums(DepartStatsFilter filter);
@SelectProvider(type = WatchStatisticsProvider.class, method = "wearingDetail")
@Results({
@Result(column = "bind_user_id", property = "bindUserId"),
@@ -84,6 +84,38 @@ public class WatchStatisticsProvider {
return sb.toString();
}
/**
* 查询关爱人员(non_care_flag != 1)的佩戴数和未佩戴数。
* 以 QH_WAT_DEVICE(已分配设备人员)为基准,与 deviceBindAndWearNumsSql 结构完全一致,
* 在其基础上增加关爱标志过滤:
* care_wear_count = 关爱人员中,在统计日期范围内有佩戴数据的人数
* care_unwear_count = 关爱人员中,在统计日期范围内无佩戴数据的人数
*/
public String careWearNumsSql(DepartStatsFilter filter) {
String orgCodeStr;
if (StrUtil.isEmpty(filter.getOrgCodeLeaf()) && StrUtil.isEmpty(filter.getOrgCode())) {
orgCodeStr = "left(wbh.org_code, 6)";
} else {
orgCodeStr = "left(wbh.org_code, 9)";
}
StringBuilder sb = new StringBuilder("select ");
sb.append(orgCodeStr).append(" as org_code, ")
.append("count(distinct case when (ex.non_care_flag is null or ex.non_care_flag != 1) and wud.watch_no is not null then wd.watch_no end) as care_wear_count, ")
.append("count(distinct case when (ex.non_care_flag is null or ex.non_care_flag != 1) and wud.watch_no is null then wd.watch_no end) as care_unwear_count ")
.append("from QH_WAT_DEVICE wd ")
.append("left join QH_WAT_BIND_HIS wbh on wd.watch_no = wbh.watch_no and wd.bind_user_id = wbh.bind_user_id and wbh.bind_end_date is null ")
.append("left join QH_WAT_USER_DATA wud on wud.watch_no = wd.watch_no and wd.bind_user_id = wud.bind_user_id and wud.data_date between #{start} and #{end} ")
.append("left join QH_HLT_USER_EMPLOYEE_EX ex on ex.id = wd.bind_user_id ")
.append("where wd.bind_user_id is not null and wd.bind_user_id <> '' ");
if (StrUtil.isNotEmpty(filter.getOrgCodeLeaf())) {
sb.append("and wbh.org_code like CONCAT(#{orgCodeLeaf},'%')");
} else if (StrUtil.isNotEmpty(filter.getOrgCode())) {
sb.append("and wbh.org_code like CONCAT(#{orgCode},'%')");
}
sb.append(" group by ").append(orgCodeStr).append(";");
return sb.toString();
}
public String wearingDetail() {
return "SELECT " +
" max(wd.bind_user_id) as bind_user_id," +
@@ -659,13 +659,17 @@ public class DeptStatisticDataServiceImpl extends ServiceImpl<DeptStatisticDataM
Map<String, AbnormalCount> secondDepartAbnormalCount = getSecondDepartAbnormalCount(filter, departAbnormalCountMap);
Map<String, Integer> nonCareNumMap = getNonCareNumMap(filter);
Integer secondDepartNonCareNum = getSecondDepartNonCareNum(filter, nonCareNumMap);
Map<String, DepartDeviceNum> careWearNumMap = getCareWearNumMap(filter);
DepartDeviceNum secondDepartCareWearNum = getSecondDepartCareWearNum(filter, careWearNumMap);
transfer.departDeviceNumMap(departDeviceNumMap)
.departBindAndWearNumMap(departBindAndWearNumMap)
.secondDepartBindAndWearNum(secondDepartBindAndWearNum)
.departAbnormalCountMap(departAbnormalCountMap)
.secondDepartAbnormalCount(secondDepartAbnormalCount)
.nonCareNumMap(nonCareNumMap)
.secondDepartNonCareNum(secondDepartNonCareNum);
.secondDepartNonCareNum(secondDepartNonCareNum)
.careWearNumMap(careWearNumMap)
.secondDepartCareWearNum(secondDepartCareWearNum);
if (paged) {
transfer.pagedData().setTotal(finalDeparts.size());
finalDeparts = getPagedDeparts(finalDeparts, filter);
@@ -747,6 +751,16 @@ public class DeptStatisticDataServiceImpl extends ServiceImpl<DeptStatisticDataM
? Optional.ofNullable(transfer.secondDepartNonCareNum()).orElse(0)
: transfer.nonCareNumMap().getOrDefault(orgCode, 0)
);
// 关爱人员数量 = 已分配设备数 - 非关爱人员数量
deptStatData.setCareNums(
Optional.ofNullable(deptStatData.getAssignedDeviceNums()).orElse(0)
- Optional.ofNullable(deptStatData.getNonCareNums()).orElse(0)
);
DepartDeviceNum careNum = (!allSecond && (isFirst || isSecond))
? Optional.ofNullable(transfer.secondDepartCareWearNum()).orElse(new DepartDeviceNum())
: transfer.careWearNumMap().getOrDefault(orgCode, new DepartDeviceNum());
deptStatData.setCareWearNums(Optional.ofNullable(careNum.getCareWearCount()).orElse(0));
deptStatData.setCareUnwearNums(Optional.ofNullable(careNum.getCareUnwearCount()).orElse(0));
return deptStatData;
}
@@ -867,6 +881,35 @@ public class DeptStatisticDataServiceImpl extends ServiceImpl<DeptStatisticDataM
return nonCareNumMap.values().stream().mapToInt(Integer::intValue).sum();
}
/**
* 查询各部门关爱人员佩戴/未佩戴数 MaporgCode → DepartDeviceNum
*/
private Map<String, DepartDeviceNum> getCareWearNumMap(DepartStatsFilter filter) {
return watchStatisticsMapper.careWearNums(filter)
.stream()
.filter(o -> StrUtil.isNotBlank(o.getOrgCode()))
.collect(Collectors.toMap(DepartDeviceNum::getOrgCode, Function.identity()));
}
/**
* 汇总二级部门下所有三级部门的关爱人员佩戴/未佩戴数,用于二级部门行展示
* 仅在"指定了二级部门但未指定三级部门"时有效,其他情况返回 null
*/
private DepartDeviceNum getSecondDepartCareWearNum(DepartStatsFilter filter,
Map<String, DepartDeviceNum> careWearNumMap) {
if (StrUtil.isNotEmpty(filter.getOrgCodeLeaf()) || StrUtil.isEmpty(filter.getOrgCode())) {
return null;
}
DepartDeviceNum result = new DepartDeviceNum();
result.setCareWearCount(0);
result.setCareUnwearCount(0);
careWearNumMap.values().forEach(d -> {
result.setCareWearCount(result.getCareWearCount() + Optional.ofNullable(d.getCareWearCount()).orElse(0));
result.setCareUnwearCount(result.getCareUnwearCount() + Optional.ofNullable(d.getCareUnwearCount()).orElse(0));
});
return result;
}
/**
* 汇总二级部门下所有三级部门的绑定/佩戴数,用于二级部门行的数据展示
* <p>