liusuyi
2025-10-13 9f2c6b21bcfce0ddb912792b5431088d225cdc71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package com.ard.work.service.impl;
 
import com.ard.common.utils.DateUtils;
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.ITyService;
import com.ard.work.service.IArdDroneService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Stack;
import java.util.stream.Collectors;
 
/**
 * 无人机盒子Service业务层处理
 *
 * @author ruoyi
 * @date 2025-03-04
 */
@Service
public class ArdDroneServiceImpl implements IArdDroneService {
 
    @Resource
    private ArdDroneInfoMapper ArdDroneInfoMapper;
 
    @Resource
    private ITyService tyService;
 
    /**
     * 查询无人机盒子
     *
     * @param id 无人机盒子主键
     * @return 无人机盒子
     */
    @Override
    public ArdDroneInfo selectArdDroneById(String id) {
        return ArdDroneInfoMapper.selectArdDroneById(id);
    }
 
    @Override
    public ArdDroneInfo selectArdDroneByboxSn(String boxSn) {
        return ArdDroneInfoMapper.selectArdDroneByBoxSn(boxSn);
    }
 
    /**
     * 查询无人机盒子列表
     *
     * @param ArdDroneInfo 无人机盒子
     * @return 无人机盒子
     */
    @Override
    public List<ArdDroneInfo> selectArdDroneList(ArdDroneInfo ArdDroneInfo) {
        return ArdDroneInfoMapper.selectArdDroneList(ArdDroneInfo);
    }
 
    /**
     * 新增无人机盒子
     *
     * @param ArdDroneInfo 无人机盒子
     * @return 结果
     */
    @Override
    public int insertArdDrone(ArdDroneInfo ArdDroneInfo) {
        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);
    }
 
    /**
     * 同步盒子属性
     *
     * @return 结果
     */
    @Scheduled(fixedRate = 1000 * 10)
    public void syncBoxInfo() {
        List<ArdDroneInfo> ArdDroneeListEntity = selectArdDroneList(new ArdDroneInfo());
        // 将本地列表转换为Map,方便快速查找
        Map<String, ArdDroneInfo> 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());
        }
        // 更新其他属性
    }
}