package com.zhgd.xmgl.call; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.util.pass.HttpUtils; import com.zhgd.xmgl.call.api.PoliceCameraManufacturer; import com.zhgd.xmgl.call.util.Mcs8Util; import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraItem; import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraItemFile; import com.zhgd.xmgl.modules.policecamera.entity.ProjectPoliceCameraConfig; import com.zhgd.xmgl.modules.policecamera.entity.WorkTicketHistory; import com.zhgd.xmgl.modules.policecamera.entity.bo.Mcs8FileBo; import com.zhgd.xmgl.modules.policecamera.entity.bo.Mcs8FileSignedUrlBo; import com.zhgd.xmgl.modules.policecamera.entity.vo.WorkTicketVo; import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemFileService; import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemService; import com.zhgd.xmgl.modules.policecamera.service.IWorkTicketHistoryService; import com.zhgd.xmgl.util.PathUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Scope; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.io.File; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Mcs8Call implements PoliceCameraManufacturer { @Lazy @Autowired private Mcs8Call mcs8Call; private ProjectPoliceCameraConfig config; @Lazy @Autowired private IPoliceCameraItemFileService policeCameraItemFileService; @Lazy @Autowired private IPoliceCameraItemService policeCameraItemService; @Lazy @Autowired private IWorkTicketHistoryService workTicketHistoryService; public void setConfig(ProjectPoliceCameraConfig config) { this.config = config; } @Override public void beginWork(WorkTicketVo ticket, String workNo, int no) { if (CollUtil.isEmpty(ticket.getItemList())) { throw new OpenAlertException("请先绑定设备"); } Mcs8Util.addTask(config, StrUtil.format("{}-{}-{}", ticket.getConstructionAreaNames(), ticket.getWorkTicketNumber(), "第" + no + "次作业"), workNo); String taskId = Mcs8Util.getTaskIdByWorkNo(config, workNo); Mcs8Util.updateTaskDest(config, ticket.getItemList(), taskId); Mcs8Util.updateTaskStatus(config, 0, taskId); } @Override public void endWork(WorkTicketVo ticket, String workNo) { if (CollUtil.isEmpty(ticket.getItemList())) { throw new OpenAlertException("请先绑定设备"); } String taskId = Mcs8Util.getTaskIdByWorkNo(config, workNo); Mcs8Util.updateTaskStatus(config, 2, taskId); } @Override public void pullFile(Date begin, Date end) { Map cameraItemMap = policeCameraItemService.list(null).stream().collect(Collectors.toMap(PoliceCameraItem::getDevSn, Function.identity(), (o1, o2) -> o1)); int page = 1; int pageSize = 1000; List bos = new ArrayList<>(); do { JSONObject jsonObject = Mcs8Util.getRecordFileList(config, page, pageSize, begin, end); bos = BeanUtil.copyToList(jsonObject.getJSONArray("data"), Mcs8FileBo.class); for (Mcs8FileBo bo : bos) { mcs8Call.downloadFileAndSaveAsync(bo, cameraItemMap); } page++; } while (CollUtil.isNotEmpty(bos) && bos.size() == pageSize); } @Async("policeCameraManufacturerDownLoadExecutor") public void downloadFileAndSaveAsync(Mcs8FileBo bo, Map cameraItemMap) { int count = policeCameraItemFileService.count(new LambdaQueryWrapper() .eq(PoliceCameraItemFile::getExternalId, bo.getId())); if (count > 0) { return; } Mcs8FileSignedUrlBo signedUrl = Mcs8Util.getSignedUrl(config, bo.getId()); PoliceCameraItem item = cameraItemMap.get(bo.getDevId()); WorkTicketHistory history = workTicketHistoryService.getById(bo.getWorkNo()); if (item != null) { HashMap headers = new HashMap<>(); headers.put("token", Mcs8Util.getToken(config.getIp(), config.getPort(), config.getAccount(), config.getPassword())); File downloadFile = HttpUtils.downloadFile(signedUrl.getPubUrl(), PathUtil.getBasePath(), headers); if (downloadFile != null) { PoliceCameraItemFile file = new PoliceCameraItemFile(); file.setItemId(item.getItemId()); file.setHistoryId(Optional.ofNullable(history).map(WorkTicketHistory::getId).orElse(null)); file.setExternalId(bo.getId()); file.setProjectSn(item.getProjectSn()); file.setFileType(bo.getFType()); file.setUploadTime(bo.getUpLoadTime()); file.setFileName(bo.getFileName()); file.setFileUrl(downloadFile.getName()); file.setFileTime(bo.getFileTime()); file.setFileLen(bo.getFileLen()); file.setDuration(bo.getDuration()); file.setStartTime(bo.getStartTime()); file.setEndTime(bo.getEndTime()); count = policeCameraItemFileService.count(new LambdaQueryWrapper() .eq(PoliceCameraItemFile::getExternalId, bo.getId())); if (count > 0) { return; } policeCameraItemFileService.save(file); } } } @Override public void updateStatus() { List itemList = policeCameraItemService.list(new LambdaQueryWrapper() .eq(PoliceCameraItem::getProjectSn, config.getProjectSn())); Integer page = 1; int pageSize = 1000; JSONArray devList = new JSONArray(); JSONArray tempList = new JSONArray(); do { tempList = Mcs8Util.getDevList(config, page, pageSize); devList.addAll(tempList); page++; } while (CollUtil.isNotEmpty(tempList) && tempList.size() == pageSize); Map devSnMap = devList.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("deviceId"), o -> (JSONObject) o, (o1, o2) -> o1)); for (PoliceCameraItem item : itemList) { JSONObject jsonObject = devSnMap.get(item.getDevSn()); if (jsonObject != null) { item.setDeviceState(jsonObject.getInteger("status") == 1 ? 1 : 2); } else { item.setDeviceState(2); } policeCameraItemService.updateById(item); } } }