#
vincentlu
2026-04-07 7958b0e136e96d2730c2df17a46046d1bbe74358
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
package com.zy.acs.manager.manager.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zy.acs.manager.manager.entity.Agv;
import com.zy.acs.manager.manager.entity.AgvModel;
import com.zy.acs.manager.manager.mapper.AgvModelMapper;
import com.zy.acs.manager.manager.service.AgvModelService;
import com.zy.acs.manager.manager.service.AgvService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
 
import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
 
@Service("agvModelService")
public class AgvModelServiceImpl extends ServiceImpl<AgvModelMapper, AgvModel> implements AgvModelService {
 
    public static final Map<Long, AgvModel> AGV_ID_MODEL_CACHE = new ConcurrentHashMap<>();
    public static final Map<String, AgvModel> AGV_NO_MODEL_CACHE = new ConcurrentHashMap<>();
 
    @Autowired
    private AgvService agvService;
 
    @PostConstruct
    public void init() {
        for (Agv agv : agvService.list()) {
            AgvModel agvModel = this.getById(agv.getAgvModel());
            this.cacheAgvModel(agv, agvModel);
        }
    }
 
    @Override
    public AgvModel selectByType(String type) {
        return this.getOne(new LambdaQueryWrapper<AgvModel>().eq(AgvModel::getType, type));
    }
 
    @Override
    public AgvModel getByAgvId(Long agvId) {
        if (agvId == null) {
            return null;
        }
        AgvModel agvModel = AGV_ID_MODEL_CACHE.get(agvId);
        if (agvModel == null) {
            Agv agv = agvService.getById(agvId);
            if (agv == null || agv.getAgvModel() == null) {
                return null;
            }
            agvModel = this.getById(agv.getAgvModel());
            if (agvModel != null) {
                this.cacheAgvModel(agv, agvModel);
            }
        }
        return this.copyModel(agvModel);
    }
 
    @Override
    public AgvModel getByAgvNo(String agvNo) {
        if (agvNo == null) {
            return null;
        }
        AgvModel agvModel = AGV_NO_MODEL_CACHE.get(agvNo);
        if (agvModel == null) {
            Agv agv = agvService.selectByUuid(agvNo);
            if (agv == null || agv.getAgvModel() == null) {
                return null;
            }
            agvModel = this.getById(agv.getAgvModel());
            if (agvModel != null) {
                this.cacheAgvModel(agv, agvModel);
            }
        }
        return this.copyModel(agvModel);
    }
 
    @Override
    public void refreshCacheByModelId(Long modelId) {
        if (modelId == null) {
            return;
        }
        AgvModel latestModel = this.getById(modelId);
        if (latestModel == null) {
            AGV_ID_MODEL_CACHE.entrySet().removeIf(entry -> this.hitModel(entry.getValue(), modelId));
            AGV_NO_MODEL_CACHE.entrySet().removeIf(entry -> this.hitModel(entry.getValue(), modelId));
            return;
        }
        for (Map.Entry<Long, AgvModel> entry : AGV_ID_MODEL_CACHE.entrySet()) {
            AgvModel cachedModel = entry.getValue();
            if (this.hitModel(cachedModel, modelId)) {
                AGV_ID_MODEL_CACHE.put(entry.getKey(), this.copyModel(latestModel));
            }
        }
        for (Map.Entry<String, AgvModel> entry : AGV_NO_MODEL_CACHE.entrySet()) {
            AgvModel cachedModel = entry.getValue();
            if (this.hitModel(cachedModel, modelId)) {
                AGV_NO_MODEL_CACHE.put(entry.getKey(), this.copyModel(latestModel));
            }
        }
    }
 
    @Override
    public void evictCacheByAgv(Long agvId, String agvNo) {
        if (agvId != null) {
            AGV_ID_MODEL_CACHE.remove(agvId);
        }
        if (agvNo != null) {
            AGV_NO_MODEL_CACHE.remove(agvNo);
        }
    }
 
    @Override
    public Boolean isSingleBasket(Long agvId) {
        AgvModel model = this.getByAgvId(agvId);
        return model.getBackpack() <= 1;
    }
 
    private void cacheAgvModel(Agv agv, AgvModel agvModel) {
        if (agv == null || agvModel == null) {
            return;
        }
        AGV_ID_MODEL_CACHE.put(agv.getId(), this.copyModel(agvModel));
        AGV_NO_MODEL_CACHE.put(agv.getUuid(), this.copyModel(agvModel));
    }
 
    private boolean hitModel(AgvModel agvModel, Long modelId) {
        return agvModel != null && Objects.equals(agvModel.getId(), modelId);
    }
 
    private AgvModel copyModel(AgvModel agvModel) {
        if (agvModel == null) {
            return null;
        }
        AgvModel target = new AgvModel();
        BeanUtils.copyProperties(agvModel, target);
        return target;
    }
 
}