| | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.LinkedHashMap; |
| | | |
| | | @Slf4j |
| | | @Service |
| | |
| | | private final SysRegionMapper sysRegionMapper; |
| | | private final ClinicMapper clinicMapper; |
| | | private final VzanHttpUtil vzanHttpUtil; |
| | | private volatile Map<String, SysRegion> regionCache; |
| | | |
| | | public ProvincialAgentAppService(ProvincialAgentMapper agentMapper, AgentRegionMapper regionMapper, |
| | | SysRegionMapper sysRegionMapper, ClinicMapper clinicMapper, VzanHttpUtil vzanHttpUtil) { |
| | |
| | | |
| | | private void saveRegions(ProvincialAgent agent, ProvincialAgentSaveRequest request) { |
| | | if (request.getRegions() == null) return; |
| | | List<AgentRegion> regions = new ArrayList<AgentRegion>(); |
| | | for (ProvincialAgentSaveRequest.RegionItem item : request.getRegions()) { |
| | | if (item == null || trim(item.getRegionCode()) == null) continue; |
| | | RegionInfo info = resolveRegion(item.getRegionCode()); |
| | |
| | | region.setRegionCode(trim(item.getRegionCode())); |
| | | region.setRegionName(info.name); |
| | | region.setRegionLevel(info.path.size()); |
| | | regionMapper.insert(region); |
| | | regions.add(region); |
| | | } |
| | | if (!regions.isEmpty()) { |
| | | regionMapper.insertBatch(regions); |
| | | } |
| | | } |
| | | |
| | |
| | | private RegionInfo resolveRegion(String code) { |
| | | List<String> path = new ArrayList<String>(); |
| | | List<String> names = new ArrayList<String>(); |
| | | SysRegion current = sysRegionMapper.selectByCode(code); |
| | | SysRegion current = getRegionCache().get(code); |
| | | while (current != null) { |
| | | path.add(0, current.getCode()); |
| | | names.add(0, current.getName()); |
| | | current = current.getParentId() == null || current.getParentId() == 0 ? null : sysRegionMapper.selectById(current.getParentId()); |
| | | current = current.getParentId() == null || current.getParentId() == 0 ? null : getRegionById(current.getParentId()); |
| | | } |
| | | if (path.isEmpty()) { |
| | | path.add(code); |
| | |
| | | return new RegionInfo(path, String.join("", names)); |
| | | } |
| | | |
| | | private Map<String, SysRegion> getRegionCache() { |
| | | Map<String, SysRegion> cache = regionCache; |
| | | if (cache == null) { |
| | | synchronized (this) { |
| | | cache = regionCache; |
| | | if (cache == null) { |
| | | cache = new LinkedHashMap<String, SysRegion>(); |
| | | for (SysRegion region : sysRegionMapper.selectAllOrdered()) cache.put(region.getCode(), region); |
| | | regionCache = cache; |
| | | } |
| | | } |
| | | } |
| | | return cache; |
| | | } |
| | | |
| | | private SysRegion getRegionById(Long id) { |
| | | for (SysRegion region : getRegionCache().values()) if (id.equals(region.getId())) { |
| | | return region; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private String trim(String value) { |
| | | if (value == null) return null; |
| | | String trimmed = value.trim(); |