package org.yzh.file.endpoint; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import io.github.yezhihao.netmc.core.annotation.Endpoint; import io.github.yezhihao.netmc.core.annotation.Mapping; import io.github.yezhihao.netmc.session.Session; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.yzh.protocol.commons.JSATL12; import org.yzh.protocol.jsatl12.DataPacket; import org.yzh.protocol.jsatl12.T1210; import org.yzh.protocol.jsatl12.T1211; import org.yzh.protocol.jsatl12.T9212; import org.yzh.web.service.FileService; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @Slf4j @Endpoint @Component @RequiredArgsConstructor public class JSATL12Endpoint { private final FileService fileService; private final Cache> cache = Caffeine.newBuilder().expireAfterAccess(20, TimeUnit.MINUTES).build(); @Mapping(types = JSATL12.报警附件信息消息, desc = "报警附件信息消息") public void alarmFileInfoList(T1210 message, Session session) { session.register(message.getDeviceId(), message); List items = message.getItems(); if (items == null) return; Map fileInfos = cache.get(message.getClientId(), s -> new HashMap<>((int) (items.size() / 0.75) + 1)); for (T1210.Item item : items) fileInfos.put(item.getName(), item.setParent(message)); fileService.createDir(message); } @Mapping(types = JSATL12.文件信息上传, desc = "文件信息上传") public void alarmFileInfo(T1211 message, Session session) { if (!session.isRegistered()) session.register(message); } @Mapping(types = JSATL12.文件数据上传, desc = "文件数据上传") public Object alarmFile(DataPacket dataPacket, Session session) { Map fileInfos = cache.getIfPresent(session.getClientId()); if (fileInfos != null) { T1210.Item fileInfo = fileInfos.get(dataPacket.getName().trim()); if (fileInfo != null) { if (dataPacket.getOffset() == 0 && dataPacket.getLength() >= fileInfo.getSize()) { fileService.writeFileSingle(fileInfo.getParent(), dataPacket); } else { fileService.writeFile(fileInfo.getParent(), dataPacket); } } } return null; } @Mapping(types = JSATL12.文件上传完成消息, desc = "文件上传完成消息") public T9212 alarmFileComplete(T1211 message) { Map fileInfos = cache.getIfPresent(message.getClientId()); T1210.Item fileInfo = fileInfos.get(message.getName()); T9212 result = new T9212(); result.setName(message.getName()); result.setType(message.getType()); int[] items = fileService.checkFile(fileInfo.getParent(), message); if (items == null) { fileInfos.remove(message.getName()); if (fileInfos.isEmpty()) { cache.invalidate(message.getClientId()); } result.setResult(0); } else { result.setItems(items); result.setResult(1); } return result; } }