From 0b5ec13aab12767236d0ad46b52660cc2e1a03e3 Mon Sep 17 00:00:00 2001 From: feng <18691763612@163.com> Date: Wed, 3 Dec 2025 16:21:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5AED=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../renkang/anyan/model/vo/AnYanAedInfo.java | 26 +++---- .../AedEquipmentMangerController.java | 6 ++ .../service/IAedEquipmentMangerService.java | 5 ++ .../impl/AedEquipmentMangerServiceImpl.java | 69 ++++++++++++++++++- .../task/LargeScreenJob.java | 17 ++++- .../org/jeecg/bean/response/DepartEasyVO.java | 23 +++++++ .../jeecg/common/system/api/ISysBaseAPI.java | 9 +++ .../api/fallback/SysBaseAPIFallback.java | 5 ++ .../controller/SysDepartController.java | 11 +++ .../system/service/ISysDepartService.java | 8 +++ .../service/impl/SysDepartServiceImpl.java | 40 ++++++++++- 11 files changed, 199 insertions(+), 20 deletions(-) rename health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/{largeScreen => }/task/LargeScreenJob.java (71%) create mode 100644 jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/bean/response/DepartEasyVO.java diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanAedInfo.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanAedInfo.java index 80fc9cb..7ffacdd 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanAedInfo.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanAedInfo.java @@ -1,13 +1,10 @@ package com.renkang.anyan.model.vo; -import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.Date; @Data @@ -62,21 +59,20 @@ public class AnYanAedInfo { @Schema(title = "更新时间") private Date updateDate; - public String getLon() { - //安眼提供的经纬度过长, 在这里只保留6位小数 - if(StrUtil.isNotEmpty(lon)){ - BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble(lon)).setScale(6, RoundingMode.HALF_UP); - return bigDecimal.toString(); + public String getSecondOfficeName() { + if(null != secondOfficeName){ + // 处理返数据中的空格和换行符 + return secondOfficeName.replaceAll(" ","").replaceAll("\r\n",""); } - return lon; + return ""; } - public String getLat() { - //安眼提供的经纬度过长, 在这里只保留6位小数 - if(StrUtil.isNotEmpty(lat)){ - BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble(lat)).setScale(6, RoundingMode.HALF_UP); - return bigDecimal.toString(); + public String getThirdOfficeName() { + if(null != thirdOfficeName){ + // 处理返数据中的空格和换行符 + return thirdOfficeName.replaceAll(" ","").replaceAll("\r\n",""); } - return lat; + return ""; } + } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/controller/AedEquipmentMangerController.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/controller/AedEquipmentMangerController.java index ea07e7e..6351160 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/controller/AedEquipmentMangerController.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/controller/AedEquipmentMangerController.java @@ -326,4 +326,10 @@ public class AedEquipmentMangerController extends JeecgController syncAnYanAedData() { + aedEquipmentMangerService.syncAnYanAedData(); + return Result.ok(); + } + } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/IAedEquipmentMangerService.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/IAedEquipmentMangerService.java index 72f9395..9aff537 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/IAedEquipmentMangerService.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/IAedEquipmentMangerService.java @@ -132,4 +132,9 @@ public interface IAedEquipmentMangerService extends IService SrcInfo getSrc(); List selectAedAllBack(); + + /** + * 从安眼系统同步更新AED数据 + */ + void syncAnYanAedData(); } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/impl/AedEquipmentMangerServiceImpl.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/impl/AedEquipmentMangerServiceImpl.java index 321d5e7..f3ea948 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/impl/AedEquipmentMangerServiceImpl.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/aed/service/impl/AedEquipmentMangerServiceImpl.java @@ -10,7 +10,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.renkang.emergency.aed.entity.AedLocationEquipment; +import com.renkang.anyan.client.AnYanClient; +import com.renkang.anyan.model.vo.AnYanAedInfo; import com.renkang.emergency.aed.manage.AedCacheNewManager; import com.renkang.emergency.aed.manage.AedManagerNew; import com.renkang.emergency.aed.mapper.AedEquipmentMangerMapper; @@ -27,6 +28,7 @@ import com.renkang.emergency.aed.vo.res.manager.AedGeo; import com.renkang.emergency.bean.response.SrcInfo; import com.renkang.emergency.entity.AedEquipmentManger; import org.apache.poi.ss.usermodel.Workbook; +import org.jeecg.bean.response.DepartEasyVO; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.util.DictUtil; import org.jeecg.common.system.vo.DictModel; @@ -50,6 +52,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -93,6 +96,8 @@ public class AedEquipmentMangerServiceImpl extends ServiceImpl queryManagerPageList(Integer pageNo, Integer pageSize, String name, Integer type, String orgCode, String mfrs, String model, String hostSerialNum) { @@ -580,4 +585,66 @@ public class AedEquipmentMangerServiceImpl extends ServiceImpl selectAedAllBack() { return list(); } + + @Override + public void syncAnYanAedData() { + //通过安眼接口查询AED数据 ps:重要说明 ,此更新接口是完全以安眼接口返回的AED数据为基准,本系统自行维护或者修改的数据都会被覆盖掉(安眼有的数据才会被覆盖) + List anYanAedInfos = anYanClient.queryAnYanAedInfo(); + if(ObjectUtil.isNotEmpty(anYanAedInfos)){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(AedEquipmentManger::getPublishFlag, 1); //只处理已布点的数据 + List equipmentMangerList = list(wrapper); + List saveOrUpdateBatchList = new ArrayList<>(); + //通过安眼平台返回的单位名称去反查本系统的orgCode + Map> orgMap = sysBaseAPI.queryDeptByName( anYanAedInfos.stream().map(AnYanAedInfo::getThirdOfficeName).collect(Collectors.toSet())); + for (AnYanAedInfo anYanAedInfo : anYanAedInfos) { + try { + AedEquipmentManger equipmentManger = equipmentMangerList.stream().filter(re -> anYanAedInfo.getId().equals(re.getAyId())).findFirst().orElse(new AedEquipmentManger()); + equipmentManger.setName("自动体外除颤仪"); + equipmentManger.setPublishFlag(0); + if(StrUtil.isNotEmpty(anYanAedInfo.getLat()) && StrUtil.isNotEmpty(anYanAedInfo.getLon())){ + equipmentManger.setGeoCollectType(1); + equipmentManger.setPublishFlag(1); + BigDecimal lon = BigDecimal.valueOf(Double.parseDouble(anYanAedInfo.getLon())).setScale(6, RoundingMode.HALF_UP); + BigDecimal lat = BigDecimal.valueOf(Double.parseDouble(anYanAedInfo.getLat())).setScale(6, RoundingMode.HALF_UP); + equipmentManger.setLongitude(lon); + equipmentManger.setLatitude(lat); + equipmentManger.setInstallTime(anYanAedInfo.getCreateDate()); + } + //处理所属部门 + List departEasyVOS = orgMap.get(anYanAedInfo.getThirdOfficeName()); + if(ObjectUtil.isNotEmpty(departEasyVOS)){ + String orgCode = departEasyVOS.stream() + .filter(de -> anYanAedInfo.getSecondOfficeName().equals(de.getParentName())) + .map(DepartEasyVO::getOrgCode) + .findFirst().orElse(""); + equipmentManger.setDepartCode(orgCode); + } + equipmentManger.setInstallAddress(anYanAedInfo.getProvidePlace()); + equipmentManger.setManageUserMobile(anYanAedInfo.getTel()); + equipmentManger.setUpdateTime(new Date()); + saveOrUpdate(equipmentManger); //更新信息 + saveOrUpdateBatchList.add(equipmentManger); + aedCacheNewManager.deleteCache(equipmentManger.getId()); //删除缓存 + aedUtils.removeGeo(equipmentManger.getId()); //删除位置信息 + if(equipmentManger.getPublishFlag() == 1){ + //添加位置信息 + aedUtils.addGeo(equipmentManger.getLongitude().doubleValue(), equipmentManger.getLatitude().doubleValue(), equipmentManger.getId()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + //处理需要删除的数据(本次接口没查到的直接删除 , 以安眼接口返回为准) + List anYanAedIds = saveOrUpdateBatchList.stream().map(AedEquipmentManger::getAyId).collect(Collectors.toList()); + List deleteList = equipmentMangerList.stream().filter(hos -> !anYanAedIds.contains(hos.getAyId())).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(deleteList)){ + for(AedEquipmentManger manger : deleteList){ + removeById(manger); + aedCacheNewManager.deleteCache(manger.getId()); + aedUtils.removeGeo(manger.getId()); + } + } + } + } } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/task/LargeScreenJob.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/LargeScreenJob.java similarity index 71% rename from health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/task/LargeScreenJob.java rename to health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/LargeScreenJob.java index 3301691..4300c5f 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/task/LargeScreenJob.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/task/LargeScreenJob.java @@ -1,5 +1,6 @@ -package com.renkang.emergency.largeScreen.task; +package com.renkang.emergency.task; +import com.renkang.emergency.aed.service.IAedEquipmentMangerService; import com.renkang.emergency.largeScreen.service.ILargeScreenService; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class LargeScreenJob { private final ILargeScreenService largeScreenService; + private final IAedEquipmentMangerService aedEquipmentMangerService; /** * 同步安眼系统数据,缓存redis @@ -41,4 +43,17 @@ public class LargeScreenJob { return ReturnT.FAIL; } } + + /** + * 同步安眼系统中的油aed数据 + */ + @XxlJob(value = "syncAnYanAedData") + public ReturnT syncAnYanAedData() { + try { + aedEquipmentMangerService.syncAnYanAedData(); + return ReturnT.SUCCESS; + } catch (Exception e) { + return ReturnT.FAIL; + } + } } diff --git a/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/bean/response/DepartEasyVO.java b/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/bean/response/DepartEasyVO.java new file mode 100644 index 0000000..05128bd --- /dev/null +++ b/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/bean/response/DepartEasyVO.java @@ -0,0 +1,23 @@ +package org.jeecg.bean.response; + +import lombok.Data; + +@Data +public class DepartEasyVO { + /** + * 单位code + */ + private String orgCode; + /** + * 机构/部门名称 + */ + private String orgName; + /** + * 父级单位code + */ + private String parentCode; + /** + * 父级单位名称 + */ + private String parentName; +} diff --git a/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 7d7a8c4..ed0e939 100644 --- a/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -751,6 +751,15 @@ public interface ISysBaseAPI extends CommonAPI { @PostMapping("/sys/sysDepart/queryDepartNameByOrgCodes") Map queryDepartNameByOrgCodes(@RequestBody Set orgCodeSet); + + /** + * 根据单位名称反查单位code (使用于导入通过单位名称补全单位code , 如果单位名称重复通过上级单位的code或者名称二次比对) + * @param orgNameSet codes + * @return <'部门名称',[匹配到的部门信息]> + */ + @PostMapping("/sys/sysDepart/queryDeptByName") + Map> queryDeptByName(@RequestBody Set orgNameSet); + // /** // * 39根据多个部门编码(逗号分隔),查询返回多个部门信息 // * @param ids diff --git a/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java b/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java index 5a2efaa..d33558d 100644 --- a/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java +++ b/jeecg-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java @@ -422,6 +422,11 @@ public class SysBaseAPIFallback implements ISysBaseAPI { return null; } + @Override + public Map> queryDeptByName(Set orgNameSet) { + return null; + } + @Override public List queryDepartsByIds(String ids) { return null; diff --git a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index 3002123..d7aa338 100644 --- a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; +import org.jeecg.bean.response.DepartEasyVO; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; @@ -913,6 +914,16 @@ public class SysDepartController { return sysDepartService.queryDepartNameByOrgCodes(orgCodeSet); } + /** + * 根据单位名称反查单位code (使用于导入通过单位名称补全单位code , 如果单位名称重复通过上级单位的code或者名称二次比对) + * @param orgNameSet codes + * @return <'部门名称',[匹配到的部门信息]> + */ + @PostMapping("/queryDeptByName") + public Map> queryDeptByName(@RequestBody Set orgNameSet){ + return sysDepartService.queryDeptByName(orgNameSet); + } + @GetMapping("/departDataInit") public void departDataInit(){ sysDepartService.departDataInit(); diff --git a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java index bdf55ad..60625d4 100644 --- a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java +++ b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.bean.response.DepartEasyVO; import org.jeecg.common.system.bean.response.BaseUser; import org.jeecg.common.system.vo.SysDepartGps; import org.jeecg.common.system.vo.SysDepartModel; @@ -266,4 +267,11 @@ public interface ISysDepartService extends IService { Map queryDepartNameByOrgCodes(Set orgCodeSet); void departDataInit(); + + /** + * 根据单位名称反查单位code + * @param orgNameSet + * @return + */ + Map> queryDeptByName(Set orgNameSet); } diff --git a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java index 773ec95..0b303a3 100644 --- a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -21,13 +21,13 @@ import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; +import org.jeecg.bean.response.DepartEasyVO; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.FillRuleConstant; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.exception.ExceptionAssertsUtil; import org.jeecg.common.system.bean.response.BaseUser; -import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.SysDepartGps; import org.jeecg.common.system.vo.SysDepartModel; @@ -44,8 +44,8 @@ import org.jeecg.modules.system.manager.UserCacheManager; import org.jeecg.modules.system.mapper.*; import org.jeecg.modules.system.model.DepartIdModel; import org.jeecg.modules.system.service.ISysDepartService; -import org.jeecg.untils.CoordinateConverter; import org.jeecg.modules.system.util.FindsDepartsChildrenUtil; +import org.jeecg.untils.CoordinateConverter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,6 +54,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.*; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -1244,6 +1245,40 @@ public class SysDepartServiceImpl extends ServiceImpl> queryDeptByName(Set orgNameSet) { + Map> resultMap = new HashMap<>(); + if(ObjectUtil.isNotEmpty(orgNameSet)){ + orgNameSet = orgNameSet.stream().map(s -> s.replaceAll(" ","")).collect(Collectors.toSet()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(SysDepart::getOrgCode,SysDepart::getDepartName,SysDepart::getParentId); + queryWrapper.in(SysDepart::getDepartName,orgNameSet); + queryWrapper.eq(SysDepart::getDelFlag,0); + List departList = departMapper.selectList(queryWrapper); + if(departList.size() > 0){ + Map parentMap = departMapper.selectBatchIds( + departList.stream().map(SysDepart::getParentId).collect(Collectors.toSet())) + .stream().collect(Collectors.toMap(SysDepart::getId, Function.identity())); + Map> deptMap = departList.stream().collect(Collectors.groupingBy(SysDepart::getDepartName)); + deptMap.forEach((name,value) ->{ + List easyVOS = new ArrayList<>(); + value.forEach(dept ->{ + DepartEasyVO departEasyVO = new DepartEasyVO(); + departEasyVO.setOrgCode(dept.getOrgCode()); + departEasyVO.setOrgName(dept.getDepartName()); + SysDepart parent= parentMap.get(dept.getParentId()); + if(null != parent){ + departEasyVO.setParentCode(parent.getOrgCode()); + departEasyVO.setParentName(parent.getDepartName()); + } + }); + resultMap.put(name,easyVOS); + }); + } + } + return resultMap; + } + @Override public void cancelDepartManager(String orgCode, List userIds) { List sysUsers = sysUserMapper.selectBatchIds(userIds); @@ -1695,7 +1730,6 @@ public class SysDepartServiceImpl extends ServiceImpl