package com.ard.work.service.impl; import com.alibaba.fastjson2.JSONObject; import com.ard.common.utils.DateUtils; import com.ard.common.utils.uuid.IdUtils; import com.ard.system.authorize.service.AuthorizeService; import com.ard.work.domain.entity.ArdDroneInfo; import com.ard.work.domain.receiver.BoxInfoReceiver; import com.ard.work.mapper.ArdDroneInfoMapper; import com.ard.work.service.IArdDroneInfoService; import com.ard.work.service.ITyService; import com.ard.work.util.UtilMethod; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** * 无人机盒子Service业务层处理 * * @author ruoyi * @date 2025-03-04 */ @Service public class ArdDroneInfoServiceImpl implements IArdDroneInfoService { @Resource private ArdDroneInfoMapper ArdDroneInfoMapper; @Resource private ITyService tyService; UtilMethod utilMethod = new UtilMethod(); /** * 查询无人机盒子 * * @param id 无人机盒子主键 * @return 无人机盒子 */ @Override public ArdDroneInfo selectArdDroneById(String id) { return ArdDroneInfoMapper.selectArdDroneById(id); } /** * 查询无人机盒子 * * @param boxSn 盒子编码 * @return 无人机盒子 */ @Override public ArdDroneInfo selectArdDroneByboxSn(String boxSn) { return ArdDroneInfoMapper.selectArdDroneByBoxSn(boxSn); } /** * 查询无人机盒子列表 * * @param ArdDroneInfo 无人机盒子 * @return 无人机盒子 */ @Override public List selectArdDroneList(ArdDroneInfo ArdDroneInfo) { return ArdDroneInfoMapper.selectArdDroneList(ArdDroneInfo); } /** * 新增无人机盒子 * * @param ardDroneInfo 无人机盒子 * @return 结果 */ @Override public int insertArdDrone(ArdDroneInfo ardDroneInfo) { ardDroneInfo.setId(IdUtils.fastUUID()); ardDroneInfo.setCreateTime(DateUtils.getNowDate()); return ArdDroneInfoMapper.insertArdDrone(ardDroneInfo); } /** * 修改无人机盒子 * * @param ArdDroneInfo 无人机盒子 * @return 结果 */ @Override public int updateArdDrone(ArdDroneInfo ArdDroneInfo) { ArdDroneInfo.setUpdateTime(DateUtils.getNowDate()); return ArdDroneInfoMapper.updateArdDrone(ArdDroneInfo); } /** * 批量删除无人机盒子 * * @param ids 需要删除的无人机盒子主键 * @return 结果 */ @Override public int deleteArdDroneByIds(String[] ids) { return ArdDroneInfoMapper.deleteArdDroneByIds(ids); } /** * 删除无人机盒子信息 * * @param id 无人机盒子主键 * @return 结果 */ @Override public int deleteArdDroneById(String id) { return ArdDroneInfoMapper.deleteArdDroneById(id); } /** * 批量新增无人机盒子 * * @param ids 无人机盒子主键集合 * @return 结果 */ @Override public int insertArdDroneLs(String[] ids) { // 获取无人机盒子信息 List drone = new ArrayList<>(); for (String id : ids) { ArdDroneInfo ardDrone = ArdDroneInfoMapper.selectArdDroneById(id); drone.add(ardDrone); } // 检验数量droneNum是否合规。 utilMethod.authorizationVerification(drone.size()); // 插入 if (!drone.isEmpty()) { return ArdDroneInfoMapper.insertArdDroneLs(drone); } return 0; } /** * 同步盒子属性 * * @return 结果 */ @Scheduled(fixedRate = 1000 * 10) public void syncBoxInfo() { List ArdDroneeListEntity = selectArdDroneList(new ArdDroneInfo()); // 将本地列表转换为Map,方便快速查找 Map localArdDroneMap = ArdDroneeListEntity.stream() .collect(Collectors.toMap(ArdDroneInfo::getBoxSn, drone -> drone)); //遍历接口最新获取的无人机盒子信息 tyService.getBoxList().forEach(remoteArdDrone -> { ArdDroneInfo localArdDroneInfo = localArdDroneMap.get(remoteArdDrone.getBoxSn()); if (localArdDroneInfo != null) { if (!localArdDroneInfo.isSameAs(remoteArdDrone)) { // 修改无人机(只更新变化的属性) updateChangedAttributes(localArdDroneInfo, remoteArdDrone); updateArdDrone(localArdDroneInfo); } } }); } // 更新变化的属性 private void updateChangedAttributes(ArdDroneInfo localBoxInfo, BoxInfoReceiver remoteArdDrone) { if (!Objects.equals(localBoxInfo.getBoxName(), remoteArdDrone.getBoxName())) { localBoxInfo.setBoxName(remoteArdDrone.getBoxName()); } if (!Objects.equals(localBoxInfo.getBoxVersion(), remoteArdDrone.getBoxVersion())) { localBoxInfo.setBoxVersion(remoteArdDrone.getBoxVersion()); } if (!Objects.equals(localBoxInfo.getLastTaskId(), remoteArdDrone.getLastTaskId())) { localBoxInfo.setLastTaskId(remoteArdDrone.getLastTaskId()); } if (!Objects.equals(localBoxInfo.getOnLine(), remoteArdDrone.getOnLine())) { localBoxInfo.setOnLine(remoteArdDrone.getOnLine()); } // 更新其他属性 } }