|
@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
|
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
import com.jiagutech.ams.constant.UserConstants; |
|
|
|
|
|
import com.jiagutech.ams.event.JobFinishEvent; |
|
|
import com.jiagutech.ams.event.JobFinishEvent; |
|
|
import com.jiagutech.ams.exception.BizCode; |
|
|
import com.jiagutech.ams.exception.BizCode; |
|
|
import com.jiagutech.ams.exception.BusinessException; |
|
|
import com.jiagutech.ams.exception.BusinessException; |
|
@ -16,27 +15,32 @@ import com.jiagutech.ams.model.*; |
|
|
import com.jiagutech.ams.model.common.PageRequest; |
|
|
import com.jiagutech.ams.model.common.PageRequest; |
|
|
import com.jiagutech.ams.model.common.PageResult; |
|
|
import com.jiagutech.ams.model.common.PageResult; |
|
|
import com.jiagutech.ams.model.dto.*; |
|
|
import com.jiagutech.ams.model.dto.*; |
|
|
|
|
|
import com.jiagutech.ams.model.mapping.JobMapping; |
|
|
|
|
|
import com.jiagutech.ams.model.mapping.TrackMapping; |
|
|
import com.jiagutech.ams.model.request.JobCreateRequest; |
|
|
import com.jiagutech.ams.model.request.JobCreateRequest; |
|
|
import com.jiagutech.ams.model.request.JobPageRequest; |
|
|
import com.jiagutech.ams.model.request.JobPageRequest; |
|
|
import com.jiagutech.ams.model.response.JobCreateResponse; |
|
|
|
|
|
import com.jiagutech.ams.model.response.JobItem; |
|
|
|
|
|
import com.jiagutech.ams.model.response.JobPolyItem; |
|
|
|
|
|
|
|
|
import com.jiagutech.ams.model.request.JobSegmentRequest; |
|
|
|
|
|
import com.jiagutech.ams.model.response.*; |
|
|
import com.jiagutech.ams.rest.TrackRestClient; |
|
|
import com.jiagutech.ams.rest.TrackRestClient; |
|
|
import com.jiagutech.ams.utils.ExcelUtil; |
|
|
import com.jiagutech.ams.utils.ExcelUtil; |
|
|
import com.jiagutech.ams.utils.LoginUtil; |
|
|
import com.jiagutech.ams.utils.LoginUtil; |
|
|
|
|
|
import com.jiagutech.ams.utils.Pro4jUtil; |
|
|
|
|
|
import com.jiagutech.ams.utils.TrackUtil; |
|
|
import jakarta.servlet.http.HttpServletResponse; |
|
|
import jakarta.servlet.http.HttpServletResponse; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.context.ApplicationContext; |
|
|
import org.springframework.context.ApplicationContext; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
|
|
import java.time.Duration; |
|
|
|
|
|
import java.time.Instant; |
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
import java.util.Collection; |
|
|
|
|
|
import java.util.Collections; |
|
|
import java.util.Collections; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
import java.util.Optional; |
|
|
import java.util.Optional; |
|
|
import java.util.function.Predicate; |
|
|
import java.util.function.Predicate; |
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @ClassName JobServiceImpl |
|
|
* @ClassName JobServiceImpl |
|
@ -63,7 +67,10 @@ public class JobServiceImpl implements JobService { |
|
|
private final TrackImageMapper trackImageMapper; |
|
|
private final TrackImageMapper trackImageMapper; |
|
|
|
|
|
|
|
|
private final ApplicationContext applicationContext; |
|
|
private final ApplicationContext applicationContext; |
|
|
|
|
|
|
|
|
|
|
|
@Value("${zhong-nong.client.key_id}") |
|
|
|
|
|
private String keyId; |
|
|
|
|
|
@Value("${zhong-nong.client.secret_key}") |
|
|
|
|
|
private String secretKey; |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public JobCreateResponse createJob(JobCreateRequest jobCreateRequest) { |
|
|
public JobCreateResponse createJob(JobCreateRequest jobCreateRequest) { |
|
@ -98,7 +105,7 @@ public class JobServiceImpl implements JobService { |
|
|
JobPageRequest requestParam = pageRequest.getRequest(); |
|
|
JobPageRequest requestParam = pageRequest.getRequest(); |
|
|
QueryWrapper<JobItem> queryWrapper = buildQueryWrapper(requestParam); |
|
|
QueryWrapper<JobItem> queryWrapper = buildQueryWrapper(requestParam); |
|
|
queryWrapper.orderByDesc("j.start_time"); |
|
|
queryWrapper.orderByDesc("j.start_time"); |
|
|
Page<JobItem> page = new Page(pageRequest.getPageNum(), pageRequest.getPageSize()); |
|
|
|
|
|
|
|
|
Page<JobItem> page = new Page<>(pageRequest.getPageNum(), pageRequest.getPageSize()); |
|
|
Page<JobItem> result = jobMapper.jobPage(page, queryWrapper); |
|
|
Page<JobItem> result = jobMapper.jobPage(page, queryWrapper); |
|
|
return PageResult.of((int) result.getTotal(), (int) result.getSize(), (int) result.getCurrent(), result.getRecords()); |
|
|
return PageResult.of((int) result.getTotal(), (int) result.getSize(), (int) result.getCurrent(), result.getRecords()); |
|
|
} |
|
|
} |
|
@ -120,6 +127,7 @@ public class JobServiceImpl implements JobService { |
|
|
@Override |
|
|
@Override |
|
|
public void exportJobs(JobPageRequest jobPageRequest, HttpServletResponse response) { |
|
|
public void exportJobs(JobPageRequest jobPageRequest, HttpServletResponse response) { |
|
|
QueryWrapper<JobItem> queryWrapper = buildQueryWrapper(jobPageRequest); |
|
|
QueryWrapper<JobItem> queryWrapper = buildQueryWrapper(jobPageRequest); |
|
|
|
|
|
queryWrapper.in("finish_type", 1, 3); |
|
|
List<JobItem> jobItems = jobMapper.jobList(queryWrapper); |
|
|
List<JobItem> jobItems = jobMapper.jobList(queryWrapper); |
|
|
ExcelUtil.exportExcel(jobItems, "作业记录", JobItem.class, response); |
|
|
ExcelUtil.exportExcel(jobItems, "作业记录", JobItem.class, response); |
|
|
} |
|
|
} |
|
@ -127,6 +135,7 @@ public class JobServiceImpl implements JobService { |
|
|
@Override |
|
|
@Override |
|
|
public void exportByFarmer(JobPageRequest jobPageRequest, HttpServletResponse response) { |
|
|
public void exportByFarmer(JobPageRequest jobPageRequest, HttpServletResponse response) { |
|
|
QueryWrapper<JobItem> queryWrapper = buildQueryWrapper(jobPageRequest); |
|
|
QueryWrapper<JobItem> queryWrapper = buildQueryWrapper(jobPageRequest); |
|
|
|
|
|
queryWrapper.in("finish_type", 1, 3); |
|
|
List<JobItem> jobItems = jobMapper.jobListCountByFarmer(queryWrapper); |
|
|
List<JobItem> jobItems = jobMapper.jobListCountByFarmer(queryWrapper); |
|
|
List<JobPolyItem> jobPolyItems = JobMapping.INSTANCE.jobItemListToJobPolyItemList(jobItems); |
|
|
List<JobPolyItem> jobPolyItems = JobMapping.INSTANCE.jobItemListToJobPolyItemList(jobItems); |
|
|
ExcelUtil.exportExcel(jobPolyItems, "作业记录", JobPolyItem.class, response); |
|
|
ExcelUtil.exportExcel(jobPolyItems, "作业记录", JobPolyItem.class, response); |
|
@ -135,32 +144,47 @@ public class JobServiceImpl implements JobService { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public List<TrackItem> getTrackList(Long jobId) { |
|
|
public List<TrackItem> getTrackList(Long jobId) { |
|
|
if (jobId != null) { |
|
|
|
|
|
JobDTO job = jobMapper.selectById(jobId); |
|
|
|
|
|
DeviceDTO deviceDTO = deviceMapper.selectById(job.getDeviceId()); |
|
|
|
|
|
if (ObjectUtil.isEmpty(job) || ObjectUtil.isEmpty(deviceDTO)) { |
|
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
|
} |
|
|
|
|
|
List<Locus> locusList = trackRestClient.getTractorByDroneIdAndTime(deviceDTO.getBoxNum(), job.getStartTime(), job.getEndTime()); |
|
|
|
|
|
QueryWrapper<TrackImageDTO> query = Wrappers.query(); |
|
|
|
|
|
List<TrackImageDTO> trackImageDTOS = trackImageMapper.selectList( |
|
|
|
|
|
query.eq("device_id", job.getDeviceId()) |
|
|
|
|
|
.between("ts", job.getStartTime(), job.getEndTime()) |
|
|
|
|
|
); |
|
|
|
|
|
if (locusList == null && CollectionUtil.isEmpty(locusList)) { |
|
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
List<TrackItem> trackItems = new ArrayList<>(locusList.size()); |
|
|
|
|
|
|
|
|
assert jobId != null; |
|
|
|
|
|
JobDTO job = jobMapper.selectById(jobId); |
|
|
|
|
|
DeviceDTO deviceDTO = deviceMapper.selectById(job.getDeviceId()); |
|
|
|
|
|
if (ObjectUtil.isEmpty(job) || ObjectUtil.isEmpty(deviceDTO)) { |
|
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
|
} |
|
|
|
|
|
long endTime; |
|
|
|
|
|
if (job.getStatus() == 1) { |
|
|
|
|
|
endTime = System.currentTimeMillis(); |
|
|
|
|
|
} else { |
|
|
|
|
|
endTime = job.getEndTime(); |
|
|
|
|
|
} |
|
|
|
|
|
List<Locus> locusList = trackRestClient.getTractorByDroneIdAndTime(deviceDTO.getBoxNum(), job.getStartTime(), endTime); |
|
|
|
|
|
QueryWrapper<TrackImageDTO> query = Wrappers.query(); |
|
|
|
|
|
List<TrackImageDTO> trackImageDTOS = trackImageMapper.selectList( |
|
|
|
|
|
query.eq("device_id", job.getDeviceId()) |
|
|
|
|
|
.between("ts", job.getStartTime(), job.getEndTime()) |
|
|
|
|
|
); |
|
|
|
|
|
List<TrackItem> trackItems; |
|
|
|
|
|
if (CollectionUtil.isNotEmpty(locusList)) { |
|
|
|
|
|
trackItems = new ArrayList<>(locusList.size()); |
|
|
for (Locus locus : locusList) { |
|
|
for (Locus locus : locusList) { |
|
|
TrackItem trackItem = TrackMapping.INSTANCE.convertToTrackItemByLocus(locus); |
|
|
TrackItem trackItem = TrackMapping.INSTANCE.convertToTrackItemByLocus(locus); |
|
|
Optional<TrackImageDTO> imageDTOOptional = trackImageDTOS.stream().filter(t -> t.getTs().equals(locus.getTimestamp())).findFirst(); |
|
|
Optional<TrackImageDTO> imageDTOOptional = trackImageDTOS.stream().filter(t -> t.getTs().equals(locus.getTimestamp())).findFirst(); |
|
|
imageDTOOptional.ifPresent(trackImageDTO -> trackItem.setImageUrl(trackImageDTO.getImageUrl())); |
|
|
imageDTOOptional.ifPresent(trackImageDTO -> trackItem.setImageUrl(trackImageDTO.getImageUrl())); |
|
|
trackItems.add(trackItem); |
|
|
trackItems.add(trackItem); |
|
|
} |
|
|
} |
|
|
return trackItems; |
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
ZhongNongTrackData tracks = trackRestClient.getZhongNongTracks(keyId, secretKey, deviceDTO.getBoxNum(), job.getStartTime(), endTime); |
|
|
|
|
|
log.info("中农云获取到的轨迹数量:{}", tracks != null ? tracks.getVehicleLocusList().size() : 0); |
|
|
|
|
|
TrackMapping mapping = TrackMapping.INSTANCE; |
|
|
|
|
|
assert tracks != null; |
|
|
|
|
|
trackItems = mapping.convertToTrackItemsByZhongNongTracks(tracks.getVehicleLocusList()); |
|
|
|
|
|
for (TrackItem trackItem : trackItems) { |
|
|
|
|
|
Optional<TrackImageDTO> imageDTOOptional = trackImageDTOS.stream().filter(t -> t.getTs().equals(trackItem.getTimestamp())).findFirst(); |
|
|
|
|
|
imageDTOOptional.ifPresent(trackImageDTO -> trackItem.setImageUrl(trackImageDTO.getImageUrl())); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
return List.of(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return trackItems; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
@ -178,7 +202,7 @@ public class JobServiceImpl implements JobService { |
|
|
|
|
|
|
|
|
private QueryWrapper<JobItem> buildQueryWrapper(JobPageRequest requestParam) { |
|
|
private QueryWrapper<JobItem> buildQueryWrapper(JobPageRequest requestParam) { |
|
|
|
|
|
|
|
|
QueryWrapper queryWrapper = Wrappers.query(); |
|
|
|
|
|
|
|
|
QueryWrapper<JobItem> queryWrapper = Wrappers.query(); |
|
|
if (requestParam != null) { |
|
|
if (requestParam != null) { |
|
|
if (requestParam.getStartTimeBegin() != 0l && requestParam.getStartTimeEnd() != 0l) { |
|
|
if (requestParam.getStartTimeBegin() != 0l && requestParam.getStartTimeEnd() != 0l) { |
|
|
queryWrapper.between("j.start_time", requestParam.getStartTimeBegin(), requestParam.getStartTimeEnd()); |
|
|
queryWrapper.between("j.start_time", requestParam.getStartTimeBegin(), requestParam.getStartTimeEnd()); |
|
@ -235,4 +259,73 @@ public class JobServiceImpl implements JobService { |
|
|
List<Locus> tractorByDroneIdAndTime = trackRestClient.getTractorByDroneIdAndTime(droneId, startTime, endTime); |
|
|
List<Locus> tractorByDroneIdAndTime = trackRestClient.getTractorByDroneIdAndTime(droneId, startTime, endTime); |
|
|
return TrackMapping.INSTANCE.convertToTrackItemsByLocus(tractorByDroneIdAndTime); |
|
|
return TrackMapping.INSTANCE.convertToTrackItemsByLocus(tractorByDroneIdAndTime); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Transactional |
|
|
|
|
|
@Override |
|
|
|
|
|
public void segmentJob(JobSegmentRequest jobSegmentRequest) { |
|
|
|
|
|
long originalJobId = jobSegmentRequest.getOriginalJobId(); |
|
|
|
|
|
JobDTO originalJob = jobMapper.selectById(originalJobId); |
|
|
|
|
|
if (originalJob != null) { |
|
|
|
|
|
DeviceDTO deviceDTO = deviceMapper.selectById(originalJob.getDeviceId()); |
|
|
|
|
|
int count = 0; |
|
|
|
|
|
for (JobSegmentRequest.JobSegment jobSegment : jobSegmentRequest.getSegments()) { |
|
|
|
|
|
JobDTO jobDTO = new JobDTO(); |
|
|
|
|
|
|
|
|
|
|
|
jobDTO.setJobType(originalJob.getJobType()) |
|
|
|
|
|
.setFinishedType(3) |
|
|
|
|
|
.setStatus(2) |
|
|
|
|
|
.setDeptId(originalJob.getDeptId()) |
|
|
|
|
|
.setRegionCode(originalJob.getRegionCode()) |
|
|
|
|
|
.setDeviceId(originalJob.getDeviceId()) |
|
|
|
|
|
.setOperatorId(jobSegment.getOperatorId()) |
|
|
|
|
|
.setFarmerId(jobSegment.getFarmerId()) |
|
|
|
|
|
.setStartTime(jobSegment.getStartTime()) |
|
|
|
|
|
.setEndTime(jobSegment.getEndTime()); |
|
|
|
|
|
Instant instant1 = Instant.ofEpochMilli(jobDTO.getStartTime()); |
|
|
|
|
|
Instant instant2 = Instant.ofEpochMilli(jobDTO.getEndTime()); |
|
|
|
|
|
Duration duration = Duration.between(instant1, instant2); |
|
|
|
|
|
jobDTO.setDuration((int) duration.toSeconds()); |
|
|
|
|
|
calculateArea(jobDTO, deviceDTO); |
|
|
|
|
|
if (jobMapper.insert(jobDTO) > 1) { |
|
|
|
|
|
count++; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (count == jobSegmentRequest.getSegments().size()) { |
|
|
|
|
|
jobMapper.deleteById(originalJobId); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void calculateArea(JobDTO jobDTO, DeviceDTO deviceDTO) { |
|
|
|
|
|
double breadth = 0; |
|
|
|
|
|
|
|
|
|
|
|
log.info("从中农云中获取轨迹"); |
|
|
|
|
|
List<TrackItem> tracks = trackRestClient.getTracksFromZhongNong(deviceDTO.getBoxNum(), jobDTO.getStartTime(), jobDTO.getEndTime()); |
|
|
|
|
|
if (CollectionUtil.isNotEmpty(tracks)) { |
|
|
|
|
|
for (TrackItem track : tracks) { |
|
|
|
|
|
if (track.getBreadth() > 0) { |
|
|
|
|
|
breadth = track.getBreadth(); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
float areaByPoly = Pro4jUtil.calculateAreaByCGCS2000(tracks); |
|
|
|
|
|
float areaByBreadth = TrackUtil.calcAreaByBlockData(tracks, breadth); |
|
|
|
|
|
log.info("作业面积:多边形计算的面积={},宽幅(当前宽幅:{})计算的面积={}", areaByPoly, breadth, areaByBreadth); |
|
|
|
|
|
jobDTO.setArea(areaByBreadth); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public List<ChartMultiItem> getJobChart() { |
|
|
|
|
|
LoginUser loginUser = LoginUtil.getLoginUser(); |
|
|
|
|
|
String regionPath = loginUser.getRegionPath(); |
|
|
|
|
|
if (org.apache.commons.lang3.StringUtils.isNotBlank(regionPath)) { |
|
|
|
|
|
int level = regionPath.split("->").length; |
|
|
|
|
|
return jobMapper.selectChart(level, regionPath); |
|
|
|
|
|
} |
|
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|