diff --git a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java index edc91d2..2b9a2e6 100644 --- a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java +++ b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/TerminalPhotoController.java @@ -108,8 +108,8 @@ public class TerminalPhotoController extends BaseController { @RequestMapping("/getTakePicStatus") @Log(title = "主动拍照下发状态查询", type = "查询") public ResponseReult getTakePicStatus(@Validated ReturnedPhotoVo vo) { - try{ - if (workingMap.containsKey(vo.getRequestid())){ + try { + if (workingMap.containsKey(vo.getRequestid())) { throw new ApiException("相同请求正在处理中, 请刷新页面更新"); } workingMap.put(vo.getRequestid(), "1"); @@ -119,8 +119,7 @@ public class TerminalPhotoController extends BaseController { } else { return ResponseReult.error(serviceBody.getCode(), serviceBody.getMsg()); } - } - finally { + } finally { workingMap.remove(vo.getRequestid()); } } @@ -129,7 +128,7 @@ public class TerminalPhotoController extends BaseController { @ApiResponses({@ApiResponse(code = 200, message = "请求成功"), @ApiResponse(code = 400, message = "请求参数没填好"), @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")}) @RequestMapping("/getTakePicPhotoStatus") @Log(title = "主动拍照下照片状态查询", type = "查询") - public ResponseReult getTakePicPhotoStatus( @Validated ReturnedPhotoVo vo) { + public ResponseReult getTakePicPhotoStatus(@Validated ReturnedPhotoVo vo) { try { if (workingMap.containsKey(vo.getRequestid())) { throw new ApiException("相同请求正在处理中, 请刷新页面更新"); @@ -198,7 +197,7 @@ public class TerminalPhotoController extends BaseController { private void buildPhotoStat(List termList, List list, TerminalPhotoSelectVo vo) throws Exception { for (StatTerm statTerm : termList) { List scheduleList = cameraScheduleService.list(statTerm.getTermId()); - statTerm.initScheduleList(scheduleList, vo.getStarttime().getTime() , vo.getEndtime().getTime() , vo.getInterval()); + statTerm.initScheduleList(scheduleList, vo.getStarttime().getTime(), vo.getEndtime().getTime(), vo.getInterval()); } if (list != null) { for (TerminalPhotoSelectListModel.PhotoBean photo : list) { diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java new file mode 100644 index 0000000..c757040 --- /dev/null +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/model/PhotoPrepareModel.java @@ -0,0 +1,18 @@ +package com.shxy.xymanager_common.model; + +import com.shxy.xymanager_common.entity.TerminalPhoto; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +@Data +public class PhotoPrepareModel { + MultipartFile file; + String cmdid; + Integer termId; + String hexC; + TerminalPhoto record; + Long photoId; + Long time; + String suffix; + String fileName; +} diff --git a/xymanager_dao/src/main/resources/mappers/TerminalPhotoDao.xml b/xymanager_dao/src/main/resources/mappers/TerminalPhotoDao.xml index 501981b..72c09f5 100644 --- a/xymanager_dao/src/main/resources/mappers/TerminalPhotoDao.xml +++ b/xymanager_dao/src/main/resources/mappers/TerminalPhotoDao.xml @@ -65,8 +65,8 @@ - - + + diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java new file mode 100644 index 0000000..71b0049 --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/AsyncService.java @@ -0,0 +1,106 @@ +package com.shxy.xymanager_service.impl; + +import com.shxy.xymanager_common.entity.TerminalPhoto; +import com.shxy.xymanager_common.entity.TerminalPhotoExample; +import com.shxy.xymanager_common.model.PhotoPrepareModel; +import com.shxy.xymanager_common.util.DateUtil; +import com.shxy.xymanager_dao.dao.TerminalPhotoDao; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Date; +import java.util.List; + +import static com.shxy.xymanager_service.impl.TerminalPhotoServiceImpl.C_PATH; + +@Service +@Slf4j +public class AsyncService { + + @Resource + TerminalPhotoDao terminalPhotoDao; + + @Async + public void savePreparePhotos(List list) { + for (PhotoPrepareModel item : list) { + this.saveOnePreparePhoto(item); + } + } + + private void saveOnePreparePhoto(PhotoPrepareModel item) { + TerminalPhoto record = item.getRecord(); + String cmdid = item.getCmdid(); + MultipartFile file = item.getFile(); + String hexC = item.getHexC(); + Integer termId = item.getTermId(); + Long photoId = item.getPhotoId(); + Long time = item.getTime(); + String suffix = item.getSuffix(); + String fileName = item.getFileName(); + + int length = cmdid.length(); + Date now = new Date(); + String folder = DateUtil.format(now, "yyyy/MM/dd") + "/" + cmdid.substring(length - 2); + File dir = new File(C_PATH + folder); + dir.mkdirs(); + Date photoTime = new Date(time * 1000); + String strTime = DateUtil.format(photoTime, "yyyyMMddHHmmss"); + String filename = cmdid + "_" + record.getChannelId() + "_" + hexC + "_" + strTime + "." + suffix; + String filePath = folder + "/" + filename; + + File dest = new File(C_PATH + filePath); + try { + file.transferTo(dest); + log.info("成功上传一张图片" + filePath); + } catch (IOException e) { + log.error("保存上传的图片失败, cmdid=" + cmdid + ", fileName=" + fileName); + return; + } + + record.setTermId(termId); + record.setMediaType(0); + record.setPath(filePath); + record.setRecvTime(BigInteger.valueOf(now.getTime() / 1000)); + record.setRecvEndTime(BigInteger.valueOf(now.getTime() / 1000)); + record.setCreateTime(now); + record.setFlags(0); + record.setIsMark(0); + try { + BufferedImage image = ImageIO.read(dest); + if (image != null) { + int width = image.getWidth(); + int height = image.getHeight(); + record.setWidth(width); + record.setHeight(height); + } + } catch (IOException ignore) { + } + try { + long fileSize = Files.size(Paths.get(C_PATH + filePath)); + record.setFileSize((int) fileSize); + } catch (IOException ignore) { + } + TerminalPhotoExample example = new TerminalPhotoExample(); + TerminalPhotoExample.Criteria criteria = example.createCriteria(); + criteria.andTermIdEqualTo(termId); + criteria.andOrginalIdEqualTo(photoId.intValue()); + List list = terminalPhotoDao.selectByExample(example); + if (CollectionUtils.isEmpty(list)) { + terminalPhotoDao.insert(record); + } else { + record.setId(list.get(0).getId()); + terminalPhotoDao.updateByPrimaryKey(record); + } + } +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java index 16db1d7..125de0a 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalPhotoServiceImpl.java @@ -89,6 +89,8 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService { TerminalExtService terminalExtService; @Resource MqttService mqttService; + @Resource + AsyncService asyncService; @Autowired RequestResultsDao requestResultsDao; @@ -105,7 +107,7 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService { private String photoAddress; //服务器中的位置 - private static final String C_PATH = "/home/xymp/photos/"; + public static final String C_PATH = "/home/xymp/photos/"; /** * 根据装置id和通道id获取图片 @@ -432,13 +434,16 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService { if (term == null) { throw new ApiException(cmdid + "该装置不存在"); } + List list = new ArrayList<>(); for (MultipartFile file : files) { - this.uploadOnePhoto(file, cmdid, term.getId()); + PhotoPrepareModel item = this.preparePhoto(file, cmdid, term.getId()); + list.add(item); } + asyncService.savePreparePhotos(list); } - private void uploadOnePhoto(MultipartFile file, String cmdid, Integer termId) throws Exception { - + private PhotoPrepareModel preparePhoto(MultipartFile file, String cmdid, Integer termId) throws Exception { + PhotoPrepareModel item = new PhotoPrepareModel(); String suffix; String hexC = ""; Long photoId; @@ -458,55 +463,19 @@ public class TerminalPhotoServiceImpl implements TerminalPhotoService { record.setPresetId(preset); record.setPhotoTime(BigInteger.valueOf(time)); record.setOrginalId(BigInteger.valueOf(photoId)); + item.setRecord(record); + item.setHexC(hexC); + item.setPhotoId(photoId); + item.setTime(time); + item.setSuffix(suffix); + item.setFileName(fileName); + item.setFile(file); + item.setCmdid(cmdid); + item.setTermId(termId); } catch (Exception ex) { throw new ApiException("文件名不符合规范,解析失败"); } - int length = cmdid.length(); - Date now = new Date(); - String folder = DateUtil.format(now, "yyyy/MM/dd") + "/" + cmdid.substring(length - 2); - File dir = new File(C_PATH + folder); - dir.mkdirs(); - Date photoTime = new Date(time * 1000); - String strTime = DateUtil.format(photoTime, "yyyyMMddHHmmss"); - String filename = cmdid + "_" + record.getChannelId() + "_" + hexC + "_" + strTime + "." + suffix; - String filePath = folder + "/" + filename; - - File dest = new File(C_PATH + filePath); - file.transferTo(dest); - log.info("成功上传一张图片" + filePath); - - record.setTermId(termId); - record.setMediaType(0); - record.setPath(filePath); - record.setRecvTime(BigInteger.valueOf(now.getTime() / 1000)); - record.setRecvEndTime(BigInteger.valueOf(now.getTime() / 1000)); - record.setCreateTime(now); - record.setFlags(0); - record.setIsMark(0); - try { - BufferedImage image = ImageIO.read(dest); - if (image != null) { - int width = image.getWidth(); - int height = image.getHeight(); - record.setWidth(width); - record.setHeight(height); - } - } catch (IOException ignore) { - } - long fileSize = Files.size(Paths.get(C_PATH + filePath)); - record.setFileSize((int) fileSize); - - TerminalPhotoExample example = new TerminalPhotoExample(); - TerminalPhotoExample.Criteria criteria = example.createCriteria(); - criteria.andTermIdEqualTo(termId); - criteria.andOrginalIdEqualTo(photoId.intValue()); - List list = terminalPhotoDao.selectByExample(example); - if (CollectionUtils.isEmpty(list)) { - terminalPhotoDao.insert(record); - } else { - record.setId(list.get(0).getId()); - terminalPhotoDao.updateByPrimaryKey(record); - } + return item; } /** diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java index 0d8f11b..9816d30 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/TerminalPhotoService.java @@ -24,7 +24,7 @@ public interface TerminalPhotoService { * @return */ - ServiceBody getTerminalPhotoList(String requestIp,TerminalAndChannelIdAndTimeVo vo); + ServiceBody getTerminalPhotoList(String requestIp, TerminalAndChannelIdAndTimeVo vo); /** * 图片查询 @@ -35,7 +35,7 @@ public interface TerminalPhotoService { */ ServiceBody getPhotoList(String requestIp, TerminalPhotoSelectVo vo, List termList); - /** + /** * 根据装置id获取图片接口提供给第三方 * * @return @@ -79,7 +79,7 @@ public interface TerminalPhotoService { ServiceBody addOrUpdatePhotoParams(PhotoParamsVo vo); - ServiceBody getLastedPhotoQueryParam(ReturnedPhotoParamsVo vo); + ServiceBody getLastedPhotoQueryParam(ReturnedPhotoParamsVo vo); ServiceBody selectPhotoTimeGet(TerminalPhotoTimeGetVo vo); @@ -95,6 +95,7 @@ public interface TerminalPhotoService { /** * 删除 + * * @param vo * @return */ @@ -103,6 +104,7 @@ public interface TerminalPhotoService { /** * 图片上传 + * * @param file * @param termid * @param cmdid @@ -116,9 +118,9 @@ public interface TerminalPhotoService { ServiceBody getTestTerminalPhotoList(String requestIp); - ServiceBody takeAlarm(TerminalPhotoTestVo vo); + ServiceBody takeAlarm(TerminalPhotoTestVo vo); void uploadPhotos(MultipartFile[] files, String cmdid) throws Exception; - + }