diff --git a/.gitignore b/.gitignore index 0f4c0f6..be15a4e 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ buildNumber.properties .idea/ .DS_Store +/.fleet/ diff --git a/common/src/main/java/com/jiagutech/ams/annotation/RateLimiter.java b/common/src/main/java/com/jiagutech/ams/annotation/RateLimiter.java index ed4f8a4..495077c 100644 --- a/common/src/main/java/com/jiagutech/ams/annotation/RateLimiter.java +++ b/common/src/main/java/com/jiagutech/ams/annotation/RateLimiter.java @@ -9,7 +9,6 @@ import java.lang.annotation.*; /** * 限流注解 * - * @author Lion Li */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) diff --git a/common/src/main/java/com/jiagutech/ams/model/dto/DeptDTO.java b/common/src/main/java/com/jiagutech/ams/model/dto/DeptDTO.java index 1ba0159..d79611b 100644 --- a/common/src/main/java/com/jiagutech/ams/model/dto/DeptDTO.java +++ b/common/src/main/java/com/jiagutech/ams/model/dto/DeptDTO.java @@ -4,21 +4,29 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; +import lombok.experimental.Accessors; +import java.io.Serial; import java.io.Serializable; /** + * @author zhangyeguang * @ClassName DeptDTO - * @author: zhangyeguang - * @create: 2024-09-01 10:22 + * @create 2024-09-01 10:22 * @Version 1.0 * @description: **/ @Data +@Accessors(chain = true) @TableName("ams_dept") public class DeptDTO implements Serializable { + @Serial private static final long serialVersionUID = 1L; @JsonSerialize(using = ToStringSerializer.class) private Long id; private String name; + + private Long regionCode; + + private String regionPath; } diff --git a/common/src/main/java/com/jiagutech/ams/model/dto/RegionDTO.java b/common/src/main/java/com/jiagutech/ams/model/dto/RegionDTO.java index df7db70..6bad098 100644 --- a/common/src/main/java/com/jiagutech/ams/model/dto/RegionDTO.java +++ b/common/src/main/java/com/jiagutech/ams/model/dto/RegionDTO.java @@ -5,9 +5,9 @@ import lombok.Data; /** * @ClassName RegionDTO - * @author: zhangyeguang - * @create: 2024-09-02 17:59 - * @Version 1.0 + * @author zhangyeguang + * @create 2024-09-02 17:59 + * @version 1.0 * @description: **/ @Data diff --git a/common/src/main/java/com/jiagutech/ams/model/dto/RoleDTO.java b/common/src/main/java/com/jiagutech/ams/model/dto/RoleDTO.java index f797021..d32f77b 100644 --- a/common/src/main/java/com/jiagutech/ams/model/dto/RoleDTO.java +++ b/common/src/main/java/com/jiagutech/ams/model/dto/RoleDTO.java @@ -10,9 +10,9 @@ import java.io.Serializable; /** * @ClassName RoleDTO - * @author: zhangyeguang + * @author zhangyeguang * @create: 2024-09-01 09:29 - * @Version 1.0 + * @version 1.0 * @description: **/ @Data diff --git a/common/src/main/java/com/jiagutech/ams/model/dto/UserDTO.java b/common/src/main/java/com/jiagutech/ams/model/dto/UserDTO.java index c56dbbe..f72480a 100644 --- a/common/src/main/java/com/jiagutech/ams/model/dto/UserDTO.java +++ b/common/src/main/java/com/jiagutech/ams/model/dto/UserDTO.java @@ -26,6 +26,7 @@ public class UserDTO { private String regionPath; private String regionName; private String contactPhone; + private String identityCardNum; } \ No newline at end of file diff --git a/common/src/main/java/com/jiagutech/ams/model/dto/UserDeptDTO.java b/common/src/main/java/com/jiagutech/ams/model/dto/UserDeptDTO.java index a47a2a5..84ab8ae 100644 --- a/common/src/main/java/com/jiagutech/ams/model/dto/UserDeptDTO.java +++ b/common/src/main/java/com/jiagutech/ams/model/dto/UserDeptDTO.java @@ -1,7 +1,5 @@ package com.jiagutech.ams.model.dto; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.experimental.Accessors; diff --git a/common/src/main/java/com/jiagutech/ams/model/dto/UserRoleDTO.java b/common/src/main/java/com/jiagutech/ams/model/dto/UserRoleDTO.java index 1566e1f..a10176e 100644 --- a/common/src/main/java/com/jiagutech/ams/model/dto/UserRoleDTO.java +++ b/common/src/main/java/com/jiagutech/ams/model/dto/UserRoleDTO.java @@ -1,7 +1,5 @@ package com.jiagutech.ams.model.dto; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.experimental.Accessors; diff --git a/common/src/main/java/com/jiagutech/ams/utils/TraceIdUtil.java b/common/src/main/java/com/jiagutech/ams/utils/TraceIdUtil.java new file mode 100644 index 0000000..7c2c039 --- /dev/null +++ b/common/src/main/java/com/jiagutech/ams/utils/TraceIdUtil.java @@ -0,0 +1,26 @@ +package com.jiagutech.ams.utils; + +import java.nio.ByteBuffer; +import java.util.Base64; +import java.util.UUID; + +public class TraceIdUtil { + private static final ThreadLocal TRACE_ID = new InheritableThreadLocal<>(); + + public static void setTraceId(String traceId) { + TRACE_ID.set(traceId); + } + + public static String getTraceId() { + return TRACE_ID.get(); + } + + public static void clear() { + TRACE_ID.remove(); + } + + public static String generateTraceId() { + UUID uuid = UUID.randomUUID(); + return Long.toHexString(uuid.getMostSignificantBits()); + } +} diff --git a/social/pom.xml b/social/pom.xml index 35d62a7..b152511 100644 --- a/social/pom.xml +++ b/social/pom.xml @@ -109,6 +109,8 @@ esdk-obs-java 3.20.6.1 + + \ No newline at end of file diff --git a/social/src/main/java/com/jiagutech/ams/controller/DeviceController.java b/social/src/main/java/com/jiagutech/ams/controller/DeviceController.java index a7b856b..7f15217 100644 --- a/social/src/main/java/com/jiagutech/ams/controller/DeviceController.java +++ b/social/src/main/java/com/jiagutech/ams/controller/DeviceController.java @@ -6,7 +6,8 @@ import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; import com.jiagutech.ams.model.common.R; import com.jiagutech.ams.model.dto.DeviceDTO; -import com.jiagutech.ams.model.request.JobPageRequest; +import com.jiagutech.ams.model.request.DeviceRequest; +import com.jiagutech.ams.model.response.ChartItem; import com.jiagutech.ams.model.response.DeviceDetail; import com.jiagutech.ams.model.response.DeviceInfo; import com.jiagutech.ams.service.DeviceService; @@ -44,13 +45,12 @@ public class DeviceController { @Operation(summary = "设备列表") @PostMapping("/page") - @SaCheckRole(value = {"manager", "admin"}, mode = SaMode.OR) - public R> page(@RequestBody PageRequest pageRequest) { + @SaCheckRole(value = {"manager", "admin", "gov"}, mode = SaMode.OR) + public R> page(@RequestBody PageRequest pageRequest) { return R.ok(deviceService.page(pageRequest)); } - @Operation(summary = "获取所有设备列表") @GetMapping("/list") public R> list() { @@ -63,4 +63,17 @@ public class DeviceController { return R.ok(deviceService.deviceDetail(deviceId)); } + @Operation(summary = "获取最近一次绑定的农机") + @GetMapping("/latest") + @SaCheckRole(value = "machinist") + public R latestDeviceInfo() { + return R.ok(deviceService.latestDeviceInfo()); + } + + @GetMapping("/chart") + @Operation(summary = "获取设备统计图表") + @SaCheckRole(value = "gov") + public R> chart() { + return R.ok(deviceService.chart()); + } } diff --git a/social/src/main/java/com/jiagutech/ams/controller/JobController.java b/social/src/main/java/com/jiagutech/ams/controller/JobController.java index d60ed7b..1329b34 100644 --- a/social/src/main/java/com/jiagutech/ams/controller/JobController.java +++ b/social/src/main/java/com/jiagutech/ams/controller/JobController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.collection.CollectionUtil; import com.jiagutech.ams.listener.JobFinishListener; +import com.jiagutech.ams.model.request.JobSegmentRequest; import com.jiagutech.ams.model.TrackImageVO; import com.jiagutech.ams.model.TrackItem; import com.jiagutech.ams.model.common.PageRequest; @@ -13,9 +14,12 @@ import com.jiagutech.ams.model.dto.JobTypeDTO; import com.jiagutech.ams.model.request.JobCreateRequest; import com.jiagutech.ams.model.request.JobPageRequest; import com.jiagutech.ams.model.request.JobStatusRequest; +import com.jiagutech.ams.model.response.ChartItem; +import com.jiagutech.ams.model.response.ChartMultiItem; import com.jiagutech.ams.model.response.JobCreateResponse; import com.jiagutech.ams.model.response.JobItem; import com.jiagutech.ams.service.JobService; +import com.jiagutech.ams.utils.Pro4jUtil; import com.jiagutech.ams.utils.TrackUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -105,6 +109,14 @@ public class JobController { return R.ok(); } + + @Operation(summary = "切分作业记录") + @PostMapping("/segment") + public R segmentJob(@RequestBody JobSegmentRequest jobSegmentRequest) { + jobService.segmentJob(jobSegmentRequest); + return R.ok(); + } + @GetMapping("/tracksByZhongnong") @Operation(summary = "从中农云获取作业轨迹列表") public R> getTracksByZhongnongList(@RequestParam("deviceId") String deviceId, @@ -128,18 +140,22 @@ public class JobController { @RequestParam long endTime, @RequestParam float breadth) { - List tracks = jobService.getTracks(deviceId, startTime, endTime); List tracks1 = jobFinishListener.getTracks(deviceId, startTime, endTime); - float noFilter = TrackUtil.calcAreaByBlockDataNoFilter(tracks, breadth); - float byFilter = TrackUtil.calcAreaByBlockData(tracks); float zhongnongArea = TrackUtil.calcAreaByBlockDataNoFilter(tracks1, breadth); float zhongnongArea1 = TrackUtil.calcAreaByBlockData(tracks1, breadth); Map areas = new HashMap<>(4); - areas.put("noFilter", noFilter); - areas.put("byFilter", byFilter); areas.put("zhongnongArea", zhongnongArea); areas.put("zhongnongArea1", zhongnongArea1); + float v = Pro4jUtil.calculateAreaByCGCS2000(tracks1); + areas.put("polygonArea", v); return R.ok(areas); } + @SaCheckRole("gov") + @Operation(summary = "作业统计图表") + @GetMapping("/chart") + public R> getJobChart() { + return R.ok(jobService.getJobChart()); + } + } diff --git a/social/src/main/java/com/jiagutech/ams/controller/MessageDataController.java b/social/src/main/java/com/jiagutech/ams/controller/MessageDataController.java index 5c87aa2..b733d9c 100644 --- a/social/src/main/java/com/jiagutech/ams/controller/MessageDataController.java +++ b/social/src/main/java/com/jiagutech/ams/controller/MessageDataController.java @@ -21,7 +21,7 @@ public class MessageDataController { private final MessageDataService messageDataService; @PostMapping("/machineryRealtimeData") - public R addRealTimeData(@RequestBody List realTimeDatas) { + public R addRealTimeData(@RequestBody List realTimeDatas) { //if (checkSign(request,response)) { log.info("RealTimeData:{}", JSONObject.toJSONString(realTimeDatas)); messageDataService.addRealTimeData(realTimeDatas); @@ -30,7 +30,7 @@ public class MessageDataController { } @PostMapping(value = "/machineryImage", consumes = "multipart/form-data") - public R machineryImage(@ModelAttribute MachImage machImage) { + public R machineryImage(@ModelAttribute MachImage machImage) { log.info("workRecord:{}", machImage.getVehicleId()); messageDataService.machineryImage(machImage); @@ -39,7 +39,7 @@ public class MessageDataController { } @PostMapping("/machineryAreaDataList") - public R addWorkData(@RequestBody List workRecords) { + public R addWorkData(@RequestBody List workRecords) { log.info("WorkRecord:{}", JSONObject.toJSONString(workRecords)); messageDataService.addWorkData(workRecords); diff --git a/social/src/main/java/com/jiagutech/ams/listener/JobFinishListener.java b/social/src/main/java/com/jiagutech/ams/listener/JobFinishListener.java index d4dcbe7..9376069 100644 --- a/social/src/main/java/com/jiagutech/ams/listener/JobFinishListener.java +++ b/social/src/main/java/com/jiagutech/ams/listener/JobFinishListener.java @@ -5,18 +5,16 @@ import com.jiagutech.ams.event.JobFinishEvent; import com.jiagutech.ams.mapper.DeviceMapper; import com.jiagutech.ams.mapper.JobMapper; import com.jiagutech.ams.model.TrackItem; -import com.jiagutech.ams.model.TrackMapping; -import com.jiagutech.ams.model.ZhongNongTrackData; import com.jiagutech.ams.model.dto.DeviceDTO; import com.jiagutech.ams.model.dto.JobDTO; import com.jiagutech.ams.rest.TrackRestClient; import com.jiagutech.ams.service.JobService; +import com.jiagutech.ams.utils.Pro4jUtil; import com.jiagutech.ams.utils.TrackUtil; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -47,11 +45,6 @@ public class JobFinishListener { private final TrackRestClient trackRestClient; private final JobService jobService; - @Value("${zhong-nong.client.key_id}") - private String keyId; - @Value("${zhong-nong.client.secret_key}") - private String secretKey; - @Async @EventListener(JobFinishEvent.class) @@ -76,7 +69,7 @@ public class JobFinishListener { public List getTracks(String deviceId, long startTime, long endTime) { - List trackList = getTracksFromZhongNong(deviceId, startTime, endTime); + List trackList = trackRestClient.getTracksFromZhongNong(deviceId, startTime, endTime); log.info("tracks length={}", trackList.size()); return trackList; } @@ -99,6 +92,9 @@ public class JobFinishListener { log.info("从td-engine中获取轨迹"); List tracks = jobService.getTracks(deviceDTO.getBoxNum(), jobDTO.getStartTime(), jobDTO.getEndTime()); double breadth = 0; + + log.info("从中农云中获取轨迹"); + tracks = trackRestClient.getTracksFromZhongNong(deviceDTO.getBoxNum(), jobDTO.getStartTime(), jobDTO.getEndTime()); if (CollectionUtil.isNotEmpty(tracks)) { for (TrackItem track : tracks) { if (track.getBreadth() > 0) { @@ -107,11 +103,10 @@ public class JobFinishListener { } } } - log.info("从中农云中获取轨迹"); - tracks = getTracksFromZhongNong(deviceDTO.getBoxNum(), jobDTO.getStartTime(), jobDTO.getEndTime()); - - - jobDTO.setArea(TrackUtil.calcAreaByBlockData(tracks, breadth)); + float areaByPoly = Pro4jUtil.calculateAreaByCGCS2000(tracks); + float areaByBreadth = TrackUtil.calcAreaByBlockData(tracks, breadth); + log.info("作业面积:多边形计算的面积={},宽幅(当前宽幅:{})计算的面积={}", areaByPoly, breadth, areaByBreadth); + jobDTO.setArea(areaByBreadth); TrackItem trackItem = tracks.get(tracks.size() - 1); jobDTO.setLat(trackItem.getLat()).setLng(trackItem.getLng()); deviceDTO.setLat(trackItem.getLat()).setLng(trackItem.getLng()).setUpdateTime(trackItem.getTimestamp()); @@ -120,16 +115,6 @@ public class JobFinishListener { } - private List getTracksFromZhongNong(String vehicleId, Long startTime, Long endTime) { - ZhongNongTrackData tracks = trackRestClient.getZhongNongTracks(keyId, secretKey, vehicleId, startTime, endTime); - log.info("中农云获取到的轨迹数量:{}", tracks != null ? tracks.getVehicleLocusList().size() : 0); - TrackMapping mapping = TrackMapping.INSTANCE; - assert tracks != null; - List items = mapping.convertToTrackItemsByZhongNongTracks(tracks.getVehicleLocusList()); - items.get(0).setBreadth(tracks.getBreadth()); - return items; - } - @SneakyThrows private String signature(String keyId, long timestamp, String secretKey) { diff --git a/social/src/main/java/com/jiagutech/ams/mapper/DeviceMapper.java b/social/src/main/java/com/jiagutech/ams/mapper/DeviceMapper.java index 34c6e61..7c9e073 100644 --- a/social/src/main/java/com/jiagutech/ams/mapper/DeviceMapper.java +++ b/social/src/main/java/com/jiagutech/ams/mapper/DeviceMapper.java @@ -2,7 +2,9 @@ package com.jiagutech.ams.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jiagutech.ams.model.dto.DeviceDTO; +import com.jiagutech.ams.model.response.ChartItem; import com.jiagutech.ams.model.response.DeviceDetail; import com.jiagutech.ams.model.response.DeviceInfo; import org.apache.ibatis.annotations.Param; @@ -14,4 +16,8 @@ public interface DeviceMapper extends BaseMapper { List queryDeviceList(Long detpId); DeviceDetail selectDetail(@Param("ew") QueryWrapper queryWrapper); + + Page deivcePage(Page page, @Param("ew") QueryWrapper queryWrapper); + + List selectChart(@Param("level") int level, @Param("regionPath") String regionPath); } diff --git a/social/src/main/java/com/jiagutech/ams/mapper/JobMapper.java b/social/src/main/java/com/jiagutech/ams/mapper/JobMapper.java index a9b28a4..4eaa38c 100644 --- a/social/src/main/java/com/jiagutech/ams/mapper/JobMapper.java +++ b/social/src/main/java/com/jiagutech/ams/mapper/JobMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jiagutech.ams.model.dto.JobDTO; +import com.jiagutech.ams.model.response.ChartMultiItem; import com.jiagutech.ams.model.response.JobItem; import org.apache.ibatis.annotations.Param; @@ -19,4 +20,8 @@ public interface JobMapper extends BaseMapper { List jobListCountByFarmer(@Param("ew") QueryWrapper wrapper); List inJob(@Param("ew") QueryWrapper queryWrapper); + + List inProcessJob(@Param("ew") QueryWrapper queryWrapper); + + List selectChart(@Param("level") int level, @Param("regionPath") String regionPath); } diff --git a/social/src/main/java/com/jiagutech/ams/model/dto/DeviceDTO.java b/social/src/main/java/com/jiagutech/ams/model/dto/DeviceDTO.java index 397ded2..eef7826 100644 --- a/social/src/main/java/com/jiagutech/ams/model/dto/DeviceDTO.java +++ b/social/src/main/java/com/jiagutech/ams/model/dto/DeviceDTO.java @@ -31,6 +31,8 @@ public class DeviceDTO { private Long deptId; + private String deptName; + private Double lat; private Double lng; diff --git a/social/src/main/java/com/jiagutech/ams/model/dto/JobDTO.java b/social/src/main/java/com/jiagutech/ams/model/dto/JobDTO.java index 0afa55c..b0b0b12 100644 --- a/social/src/main/java/com/jiagutech/ams/model/dto/JobDTO.java +++ b/social/src/main/java/com/jiagutech/ams/model/dto/JobDTO.java @@ -45,4 +45,6 @@ public class JobDTO { private Double lng; + private Integer finishedType; + } diff --git a/social/src/main/java/com/jiagutech/ams/model/DeviceMapping.java b/social/src/main/java/com/jiagutech/ams/model/mapping/DeviceMapping.java similarity index 90% rename from social/src/main/java/com/jiagutech/ams/model/DeviceMapping.java rename to social/src/main/java/com/jiagutech/ams/model/mapping/DeviceMapping.java index 2ca723a..abfd7a4 100644 --- a/social/src/main/java/com/jiagutech/ams/model/DeviceMapping.java +++ b/social/src/main/java/com/jiagutech/ams/model/mapping/DeviceMapping.java @@ -1,4 +1,4 @@ -package com.jiagutech.ams.model; +package com.jiagutech.ams.model.mapping; import com.jiagutech.ams.model.dto.DeviceDTO; import com.jiagutech.ams.model.response.DeviceInfo; diff --git a/social/src/main/java/com/jiagutech/ams/model/JobMapping.java b/social/src/main/java/com/jiagutech/ams/model/mapping/JobMapping.java similarity index 94% rename from social/src/main/java/com/jiagutech/ams/model/JobMapping.java rename to social/src/main/java/com/jiagutech/ams/model/mapping/JobMapping.java index f16e7e4..518b8b7 100644 --- a/social/src/main/java/com/jiagutech/ams/model/JobMapping.java +++ b/social/src/main/java/com/jiagutech/ams/model/mapping/JobMapping.java @@ -1,4 +1,4 @@ -package com.jiagutech.ams.model; +package com.jiagutech.ams.model.mapping; import com.jiagutech.ams.model.dto.JobDTO; import com.jiagutech.ams.model.request.JobCreateRequest; diff --git a/social/src/main/java/com/jiagutech/ams/model/SortieMapping.java b/social/src/main/java/com/jiagutech/ams/model/mapping/SortieMapping.java similarity index 90% rename from social/src/main/java/com/jiagutech/ams/model/SortieMapping.java rename to social/src/main/java/com/jiagutech/ams/model/mapping/SortieMapping.java index 920f762..6b4ff79 100644 --- a/social/src/main/java/com/jiagutech/ams/model/SortieMapping.java +++ b/social/src/main/java/com/jiagutech/ams/model/mapping/SortieMapping.java @@ -1,5 +1,6 @@ -package com.jiagutech.ams.model; +package com.jiagutech.ams.model.mapping; +import com.jiagutech.ams.model.UavSortie; import com.jiagutech.ams.model.dto.SortieDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/social/src/main/java/com/jiagutech/ams/model/TrackImageMapping.java b/social/src/main/java/com/jiagutech/ams/model/mapping/TrackImageMapping.java similarity index 77% rename from social/src/main/java/com/jiagutech/ams/model/TrackImageMapping.java rename to social/src/main/java/com/jiagutech/ams/model/mapping/TrackImageMapping.java index f732927..087c7d2 100644 --- a/social/src/main/java/com/jiagutech/ams/model/TrackImageMapping.java +++ b/social/src/main/java/com/jiagutech/ams/model/mapping/TrackImageMapping.java @@ -1,5 +1,6 @@ -package com.jiagutech.ams.model; +package com.jiagutech.ams.model.mapping; +import com.jiagutech.ams.model.TrackImageVO; import com.jiagutech.ams.model.request.MachImage; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/social/src/main/java/com/jiagutech/ams/model/TrackMapping.java b/social/src/main/java/com/jiagutech/ams/model/mapping/TrackMapping.java similarity index 88% rename from social/src/main/java/com/jiagutech/ams/model/TrackMapping.java rename to social/src/main/java/com/jiagutech/ams/model/mapping/TrackMapping.java index 7bc9924..25286b4 100644 --- a/social/src/main/java/com/jiagutech/ams/model/TrackMapping.java +++ b/social/src/main/java/com/jiagutech/ams/model/mapping/TrackMapping.java @@ -1,5 +1,9 @@ -package com.jiagutech.ams.model; +package com.jiagutech.ams.model.mapping; +import com.jiagutech.ams.model.Locus; +import com.jiagutech.ams.model.TrackImageVO; +import com.jiagutech.ams.model.TrackItem; +import com.jiagutech.ams.model.ZhongNongTrack; import com.jiagutech.ams.model.dto.TrackImageDTO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/social/src/main/java/com/jiagutech/ams/model/request/DeviceRequest.java b/social/src/main/java/com/jiagutech/ams/model/request/DeviceRequest.java new file mode 100644 index 0000000..b18095d --- /dev/null +++ b/social/src/main/java/com/jiagutech/ams/model/request/DeviceRequest.java @@ -0,0 +1,15 @@ +package com.jiagutech.ams.model.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(name = "设备列表请求条件") +public class DeviceRequest { + @Schema(description = "区域编码") + private Long regionCode; + @Schema(description = "合作社ID") + private Integer deptId; + @Schema(description = "设备车牌") + private String licensePlate; +} diff --git a/social/src/main/java/com/jiagutech/ams/model/request/JobSegmentRequest.java b/social/src/main/java/com/jiagutech/ams/model/request/JobSegmentRequest.java new file mode 100644 index 0000000..94bf4c4 --- /dev/null +++ b/social/src/main/java/com/jiagutech/ams/model/request/JobSegmentRequest.java @@ -0,0 +1,39 @@ +package com.jiagutech.ams.model.request; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.jiagutech.ams.utils.StringToLongDeserializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(name = "切分作业请求") +public class JobSegmentRequest { + + @Schema(description = "原始作业ID", example = "123456789") + @JsonDeserialize(using = StringToLongDeserializer.class) + private long originalJobId; + @Schema(description = "切分作业内容") + private List segments; + + @Data + @Schema(name = "切分作业内容") + public static class JobSegment { + @Schema(description = "作业开始时间", example = "123456789") + private Long startTime; + @Schema(description = "作业结束时间", example = "123456789") + private Long endTime; + + + @Schema(description = "操作员ID", example = "123456789") + @JsonDeserialize(using = StringToLongDeserializer.class) + private long operatorId; + + @Schema(description = "农户ID", example = "123456789") + @JsonDeserialize(using = StringToLongDeserializer.class) + private long farmerId; +// @Schema(description = "地块面积", example = "123456789") +// private Float area; + } +} diff --git a/social/src/main/java/com/jiagutech/ams/model/response/ChartItem.java b/social/src/main/java/com/jiagutech/ams/model/response/ChartItem.java new file mode 100644 index 0000000..1691085 --- /dev/null +++ b/social/src/main/java/com/jiagutech/ams/model/response/ChartItem.java @@ -0,0 +1,12 @@ +package com.jiagutech.ams.model.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ChartItem { + private Long code; + private String name; + private Integer count; +} diff --git a/social/src/main/java/com/jiagutech/ams/model/response/ChartMultiItem.java b/social/src/main/java/com/jiagutech/ams/model/response/ChartMultiItem.java new file mode 100644 index 0000000..c19edb3 --- /dev/null +++ b/social/src/main/java/com/jiagutech/ams/model/response/ChartMultiItem.java @@ -0,0 +1,13 @@ +package com.jiagutech.ams.model.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ChartMultiItem { + private Long code; + private String name; + private Integer count; + private Float value; +} diff --git a/social/src/main/java/com/jiagutech/ams/model/response/JobItem.java b/social/src/main/java/com/jiagutech/ams/model/response/JobItem.java index affa9e1..879ebdf 100644 --- a/social/src/main/java/com/jiagutech/ams/model/response/JobItem.java +++ b/social/src/main/java/com/jiagutech/ams/model/response/JobItem.java @@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** @@ -13,6 +14,7 @@ import lombok.Data; * @Version 1.0 * @description: **/ +@Schema(name = "作业记录") @Data public class JobItem { @ExcelIgnore @@ -70,5 +72,7 @@ public class JobItem { private String licensePlate; @ExcelProperty(value = "盒子编号") private String boxNum; + @Schema(description = "作业完成类型,1=手动完成,2=自动完成,3=人工处理完成") + private Integer finishedType; } diff --git a/social/src/main/java/com/jiagutech/ams/rest/TrackRestClient.java b/social/src/main/java/com/jiagutech/ams/rest/TrackRestClient.java index 4fc3503..b47e1b2 100644 --- a/social/src/main/java/com/jiagutech/ams/rest/TrackRestClient.java +++ b/social/src/main/java/com/jiagutech/ams/rest/TrackRestClient.java @@ -3,10 +3,13 @@ package com.jiagutech.ams.rest; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.TypeReference; import com.jiagutech.ams.model.Locus; +import com.jiagutech.ams.model.TrackItem; import com.jiagutech.ams.model.ZhongNongTrackData; +import com.jiagutech.ams.model.mapping.TrackMapping; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -30,7 +33,10 @@ public class TrackRestClient { @Value("${center-track.client.url}") private String centerBaseUrl; - + @Value("${zhong-nong.client.key_id}") + private String keyId; + @Value("${zhong-nong.client.secret_key}") + private String secretKey; public List getTractorByDroneIdAndTime(String droneid, Long startTime, Long endTime) { Map map = new HashMap<>(); @@ -42,12 +48,12 @@ public class TrackRestClient { }); } - - public String saveTractor(List tracks) { + @Async + public void saveTractor(List tracks) { String s = JSON.toJSONString(tracks); - log.info("传参==>" + s); +// log.info("传参==>" + s); String result = restTemplate.postForObject(centerBaseUrl + "/track/saveTractor", s, String.class); - return result; + log.info("轨迹保存完成:{}", result); } public ZhongNongTrackData getZhongNongTracks(String keyId, String secretKey, String droneId, Long startTime, Long endTime) { @@ -61,4 +67,14 @@ public class TrackRestClient { return JSON.parseObject(res, ZhongNongTrackData.class); } + public List getTracksFromZhongNong( String vehicleId, Long startTime, Long endTime) { + ZhongNongTrackData tracks = getZhongNongTracks(keyId, secretKey, vehicleId, startTime, endTime); + log.info("中农云获取到的轨迹数量:{}", tracks != null ? tracks.getVehicleLocusList().size() : 0); + TrackMapping mapping = TrackMapping.INSTANCE; + assert tracks != null; + List items = mapping.convertToTrackItemsByZhongNongTracks(tracks.getVehicleLocusList()); + log.info("breadth={}", tracks.getBreadth()); + items.get(0).setBreadth(tracks.getBreadth()); + return items; + } } diff --git a/social/src/main/java/com/jiagutech/ams/service/DeviceService.java b/social/src/main/java/com/jiagutech/ams/service/DeviceService.java index 1c81258..718f783 100644 --- a/social/src/main/java/com/jiagutech/ams/service/DeviceService.java +++ b/social/src/main/java/com/jiagutech/ams/service/DeviceService.java @@ -3,6 +3,8 @@ package com.jiagutech.ams.service; import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; import com.jiagutech.ams.model.dto.DeviceDTO; +import com.jiagutech.ams.model.request.DeviceRequest; +import com.jiagutech.ams.model.response.ChartItem; import com.jiagutech.ams.model.response.DeviceDetail; import com.jiagutech.ams.model.response.DeviceInfo; @@ -11,9 +13,13 @@ import java.util.List; public interface DeviceService { List onlineAndRound(double maxLng, double maxLat, double minLng, double minLat); - PageResult page(PageRequest pageRequest); + PageResult page(PageRequest pageRequest); List deviceList(); DeviceDetail deviceDetail(Integer deviceId); + + DeviceInfo latestDeviceInfo(); + + List chart(); } diff --git a/social/src/main/java/com/jiagutech/ams/service/DeviceServiceImpl.java b/social/src/main/java/com/jiagutech/ams/service/DeviceServiceImpl.java index ef3440c..f62c761 100644 --- a/social/src/main/java/com/jiagutech/ams/service/DeviceServiceImpl.java +++ b/social/src/main/java/com/jiagutech/ams/service/DeviceServiceImpl.java @@ -3,24 +3,31 @@ package com.jiagutech.ams.service; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jiagutech.ams.mapper.DeviceMapper; -import com.jiagutech.ams.model.DeviceMapping; +import com.jiagutech.ams.mapper.JobMapper; +import com.jiagutech.ams.model.mapping.DeviceMapping; import com.jiagutech.ams.model.LoginUser; import com.jiagutech.ams.model.TrackDataJG; import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; import com.jiagutech.ams.model.dto.DeviceDTO; +import com.jiagutech.ams.model.dto.JobDTO; import com.jiagutech.ams.model.dto.RoleDTO; +import com.jiagutech.ams.model.request.DeviceRequest; +import com.jiagutech.ams.model.response.ChartItem; import com.jiagutech.ams.model.response.DeviceDetail; import com.jiagutech.ams.model.response.DeviceInfo; import com.jiagutech.ams.utils.LoginUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; import java.util.*; import java.util.function.Consumer; @@ -40,6 +47,7 @@ public class DeviceServiceImpl implements DeviceService { public static final String TRACK_PREFIX_REDIS_KEY = "mtrack:*"; private final StringRedisTemplate stringRedisTemplate; private final DeviceMapper deviceMapper; + private final JobMapper jobMapper; @Override public List onlineAndRound(double maxLng, double maxLat, double minLng, double minLat) { @@ -89,13 +97,41 @@ public class DeviceServiceImpl implements DeviceService { } @Override - public PageResult page(PageRequest pageRequest) { + public PageResult page(PageRequest pageRequest) { Page page = new Page(pageRequest.getPageNum(), pageRequest.getPageSize()); + QueryWrapper queryWrapper = buildQueryWrapper(pageRequest.getRequest()); + + Page result = deviceMapper.deivcePage(page, queryWrapper); + return PageResult.of((int) result.getTotal(), pageRequest.getPageSize(), (int) result.getCurrent(), result.getRecords()); + } + + private QueryWrapper buildQueryWrapper(DeviceRequest deviceRequest) { QueryWrapper queryWrapper = Wrappers.query(); + if (!ObjectUtils.isEmpty(deviceRequest)) { + if (deviceRequest.getRegionCode() != null && deviceRequest.getRegionCode() != 0L) { + queryWrapper.eq("dp.region_code", deviceRequest.getRegionCode()); + } + if (deviceRequest.getDeptId() != null && deviceRequest.getDeptId() != 0L) { + queryWrapper.eq("d.dept_id", deviceRequest.getDeptId()); + } + if (StringUtils.isNotBlank(deviceRequest.getLicensePlate())) { + queryWrapper.like("d.license_plate", deviceRequest.getLicensePlate()); + } + } LoginUser loginUser = LoginUtil.getLoginUser(); - queryWrapper.eq("dept_id", loginUser.getDept().getId()); - Page result = deviceMapper.selectPage(page, queryWrapper); - return PageResult.of((int) result.getTotal(), (int) pageRequest.getPageSize(), (int) result.getCurrent(), result.getRecords()); + Predicate predicate1 = r -> r.getKey().equals("manager"); + Predicate predicate2 = r -> r.getKey().equals("gov"); + + boolean hasManager = loginUser.getRoles().stream().anyMatch(predicate1); + boolean hasGov = loginUser.getRoles().stream().anyMatch(predicate2); + if (hasManager) { + queryWrapper.eq("d.dept_id", loginUser.getDept().getId()); + } + if (hasGov && loginUser.getRegionPath() != null) { + queryWrapper.likeRight("dp.region_path", loginUser.getRegionPath()); + } + queryWrapper.orderByAsc("d.dept_id").orderByDesc("d.update_time"); + return queryWrapper; } @Override @@ -147,4 +183,40 @@ public class DeviceServiceImpl implements DeviceService { } return deviceDetail; } + + @Override + public DeviceInfo latestDeviceInfo() { + QueryWrapper queryWrapper = Wrappers.query(); + LoginUser loginUser = LoginUtil.getLoginUser(); + Assert.notNull(loginUser, "用户未登录"); + Long userId = loginUser.getUserId(); + queryWrapper.eq("operator_id", userId); + queryWrapper.orderByDesc("start_time"); + queryWrapper.last("limit 1"); + JobDTO jobDTO = jobMapper.selectOne(queryWrapper); + if (ObjectUtil.isEmpty(jobDTO)) { + return null; + } + DeviceDTO deviceDTO = deviceMapper.selectById(jobDTO.getDeviceId()); + DeviceInfo deviceInfo = DeviceMapping.INSTANCE.convertDeviceInfo(deviceDTO); + if (Boolean.TRUE.equals(stringRedisTemplate.hasKey("mtrack:" + deviceDTO.getBoxNum()))) { + deviceInfo.setStatus(1); + } else { + deviceInfo.setStatus(2); + } + + return deviceInfo; + } + + + @Override + public List chart() { + LoginUser loginUser = LoginUtil.getLoginUser(); + String regionPath = loginUser.getRegionPath(); + if (StringUtils.isNotBlank(regionPath)) { + int level = regionPath.split("->").length; + return deviceMapper.selectChart(level, regionPath); + } + return Collections.emptyList(); + } } diff --git a/social/src/main/java/com/jiagutech/ams/service/JobService.java b/social/src/main/java/com/jiagutech/ams/service/JobService.java index 90c3c1c..bfd5219 100644 --- a/social/src/main/java/com/jiagutech/ams/service/JobService.java +++ b/social/src/main/java/com/jiagutech/ams/service/JobService.java @@ -8,6 +8,9 @@ import com.jiagutech.ams.model.dto.JobTypeDTO; import com.jiagutech.ams.model.dto.TrackImageDTO; import com.jiagutech.ams.model.request.JobCreateRequest; import com.jiagutech.ams.model.request.JobPageRequest; +import com.jiagutech.ams.model.request.JobSegmentRequest; +import com.jiagutech.ams.model.response.ChartItem; +import com.jiagutech.ams.model.response.ChartMultiItem; import com.jiagutech.ams.model.response.JobCreateResponse; import com.jiagutech.ams.model.response.JobItem; import jakarta.servlet.http.HttpServletResponse; @@ -34,6 +37,9 @@ public interface JobService { void saveJobImages(TrackImageVO trackImageDTO); - List getTracks(String droneId,long startTime,long endTime); + List getTracks(String droneId, long startTime, long endTime); + void segmentJob(JobSegmentRequest jobSegmentRequest); + + List getJobChart(); } diff --git a/social/src/main/java/com/jiagutech/ams/service/JobServiceImpl.java b/social/src/main/java/com/jiagutech/ams/service/JobServiceImpl.java index b389cbf..9b52a96 100644 --- a/social/src/main/java/com/jiagutech/ams/service/JobServiceImpl.java +++ b/social/src/main/java/com/jiagutech/ams/service/JobServiceImpl.java @@ -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.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jiagutech.ams.constant.UserConstants; import com.jiagutech.ams.event.JobFinishEvent; import com.jiagutech.ams.exception.BizCode; 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.PageResult; 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.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.utils.ExcelUtil; import com.jiagutech.ams.utils.LoginUtil; +import com.jiagutech.ams.utils.Pro4jUtil; +import com.jiagutech.ams.utils.TrackUtil; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; 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.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * @ClassName JobServiceImpl @@ -63,7 +67,10 @@ public class JobServiceImpl implements JobService { private final TrackImageMapper trackImageMapper; private final ApplicationContext applicationContext; - + @Value("${zhong-nong.client.key_id}") + private String keyId; + @Value("${zhong-nong.client.secret_key}") + private String secretKey; @Override public JobCreateResponse createJob(JobCreateRequest jobCreateRequest) { @@ -98,7 +105,7 @@ public class JobServiceImpl implements JobService { JobPageRequest requestParam = pageRequest.getRequest(); QueryWrapper queryWrapper = buildQueryWrapper(requestParam); queryWrapper.orderByDesc("j.start_time"); - Page page = new Page(pageRequest.getPageNum(), pageRequest.getPageSize()); + Page page = new Page<>(pageRequest.getPageNum(), pageRequest.getPageSize()); Page result = jobMapper.jobPage(page, queryWrapper); return PageResult.of((int) result.getTotal(), (int) result.getSize(), (int) result.getCurrent(), result.getRecords()); } @@ -120,6 +127,7 @@ public class JobServiceImpl implements JobService { @Override public void exportJobs(JobPageRequest jobPageRequest, HttpServletResponse response) { QueryWrapper queryWrapper = buildQueryWrapper(jobPageRequest); + queryWrapper.in("finish_type", 1, 3); List jobItems = jobMapper.jobList(queryWrapper); ExcelUtil.exportExcel(jobItems, "作业记录", JobItem.class, response); } @@ -127,6 +135,7 @@ public class JobServiceImpl implements JobService { @Override public void exportByFarmer(JobPageRequest jobPageRequest, HttpServletResponse response) { QueryWrapper queryWrapper = buildQueryWrapper(jobPageRequest); + queryWrapper.in("finish_type", 1, 3); List jobItems = jobMapper.jobListCountByFarmer(queryWrapper); List jobPolyItems = JobMapping.INSTANCE.jobItemListToJobPolyItemList(jobItems); ExcelUtil.exportExcel(jobPolyItems, "作业记录", JobPolyItem.class, response); @@ -135,32 +144,47 @@ public class JobServiceImpl implements JobService { @Override public List 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 locusList = trackRestClient.getTractorByDroneIdAndTime(deviceDTO.getBoxNum(), job.getStartTime(), job.getEndTime()); - QueryWrapper query = Wrappers.query(); - List 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 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 locusList = trackRestClient.getTractorByDroneIdAndTime(deviceDTO.getBoxNum(), job.getStartTime(), endTime); + QueryWrapper query = Wrappers.query(); + List trackImageDTOS = trackImageMapper.selectList( + query.eq("device_id", job.getDeviceId()) + .between("ts", job.getStartTime(), job.getEndTime()) + ); + List trackItems; + if (CollectionUtil.isNotEmpty(locusList)) { + trackItems = new ArrayList<>(locusList.size()); for (Locus locus : locusList) { TrackItem trackItem = TrackMapping.INSTANCE.convertToTrackItemByLocus(locus); Optional imageDTOOptional = trackImageDTOS.stream().filter(t -> t.getTs().equals(locus.getTimestamp())).findFirst(); imageDTOOptional.ifPresent(trackImageDTO -> trackItem.setImageUrl(trackImageDTO.getImageUrl())); 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 imageDTOOptional = trackImageDTOS.stream().filter(t -> t.getTs().equals(trackItem.getTimestamp())).findFirst(); + imageDTOOptional.ifPresent(trackImageDTO -> trackItem.setImageUrl(trackImageDTO.getImageUrl())); + } } - return List.of(); + + return trackItems; + } @Override @@ -178,7 +202,7 @@ public class JobServiceImpl implements JobService { private QueryWrapper buildQueryWrapper(JobPageRequest requestParam) { - QueryWrapper queryWrapper = Wrappers.query(); + QueryWrapper queryWrapper = Wrappers.query(); if (requestParam != null) { if (requestParam.getStartTimeBegin() != 0l && requestParam.getStartTimeEnd() != 0l) { queryWrapper.between("j.start_time", requestParam.getStartTimeBegin(), requestParam.getStartTimeEnd()); @@ -235,4 +259,73 @@ public class JobServiceImpl implements JobService { List tractorByDroneIdAndTime = trackRestClient.getTractorByDroneIdAndTime(droneId, startTime, endTime); 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 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 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(); + } } diff --git a/social/src/main/java/com/jiagutech/ams/service/MessageDataServiceImpl.java b/social/src/main/java/com/jiagutech/ams/service/MessageDataServiceImpl.java index b06beb9..0d0f680 100644 --- a/social/src/main/java/com/jiagutech/ams/service/MessageDataServiceImpl.java +++ b/social/src/main/java/com/jiagutech/ams/service/MessageDataServiceImpl.java @@ -1,10 +1,16 @@ package com.jiagutech.ams.service; import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jiagutech.ams.mapper.DeviceMapper; +import com.jiagutech.ams.mapper.JobMapper; import com.jiagutech.ams.model.Locus; import com.jiagutech.ams.model.TrackDataJG; -import com.jiagutech.ams.model.TrackImageMapping; import com.jiagutech.ams.model.UavSortie; +import com.jiagutech.ams.model.dto.DeviceDTO; +import com.jiagutech.ams.model.dto.JobDTO; +import com.jiagutech.ams.model.mapping.TrackImageMapping; import com.jiagutech.ams.model.request.MachImage; import com.jiagutech.ams.model.request.RealTimeData; import com.jiagutech.ams.model.request.WorkRecord; @@ -16,7 +22,15 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Duration; +import java.time.Instant; +import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.concurrent.TimeUnit; @@ -30,6 +44,8 @@ public class MessageDataServiceImpl implements MessageDataService { private final JobService jobService; private final TrackRestClient trackRestClient; + private final JobMapper jobMapper; + private final DeviceMapper deviceMapper; public void addRealTimeData(List realTimeDatas) { for (RealTimeData realTimeData : realTimeDatas) { @@ -58,14 +74,85 @@ public class MessageDataServiceImpl implements MessageDataService { } + /** + * 优先判断是否有正在作业时相匹配的记录,如果有则选择结束当前作业, + * 再判断是否有相匹配的自动完成的作业,如果有则更新此作业数据 + * 最后添加或更新不完整的完全由中农云切分的作业 + * + * @param workRecords + */ @Override public void addWorkData(List workRecords) { + for (WorkRecord workRecord : workRecords) { List locus = workRecord.getLocus(); //轨迹插入 - if (locus.size() > 0) { + if (!locus.isEmpty()) { trackRestClient.saveTractor(locus); } + String vehicleId = workRecord.getVehicleId(); + DeviceDTO deviceDTO = deviceMapper.selectOne(Wrappers.query(DeviceDTO.class).eq("box_num", vehicleId)); + QueryWrapper wrapper = Wrappers.query(); + long startBegin = workRecord.getStartAt() - 5 * 60 * 1000; + long endBegin = workRecord.getStartAt() + 5 * 60 * 1000; + wrapper.eq("device_id", deviceDTO.getId()); + wrapper.gt("start_time", startBegin); + wrapper.lt("start_time", endBegin); + wrapper.orderByDesc("start_time"); + wrapper.last("limit 1"); + JobDTO job = jobMapper.selectOne(wrapper); + if (!ObjectUtils.isEmpty(job)) { + if (job.getStatus() == 1) { + BigDecimal b = BigDecimal.valueOf(workRecord.getWorkArea()); + job.setArea(b.setScale(2, RoundingMode.HALF_UP).floatValue()); + job.setEndTime(workRecord.getEndAt()); + Instant instant1 = Instant.ofEpochMilli(job.getStartTime()); + Instant instant2 = Instant.ofEpochMilli(workRecord.getEndAt()); + Duration duration = Duration.between(instant1, instant2); + job.setDuration((int) duration.toSeconds()); + job.setFinishedType(2); + job.setJobType(workRecord.getModule().intValue()); + jobMapper.updateById(job); + continue; + } + if (job.getFinishedType() == 2 && job.getStatus() == 2) { + job.setEndTime(workRecord.getEndAt()); + job.setArea(workRecord.getWorkArea().floatValue()); + Instant instant1 = Instant.ofEpochMilli(job.getStartTime()); + Instant instant2 = Instant.ofEpochMilli(workRecord.getEndAt()); + Duration duration = Duration.between(instant1, instant2); + job.setDuration((int) duration.toSeconds()); + jobMapper.updateById(job); + continue; + } + if (job.getFinishedType() == 1 && job.getStatus() == 2) { + job.setJobType(workRecord.getModule().intValue()); + jobMapper.updateById(job); + continue; + } + if (job.getOperatorId() == null || job.getOperatorId() == 0) { + job.setEndTime(workRecord.getEndAt()); + BigDecimal b = BigDecimal.valueOf(workRecord.getWorkArea()); + job.setArea(b.setScale(2, RoundingMode.HALF_UP).floatValue()); + jobMapper.updateById(job); + } + } else { + JobDTO jobDTO = new JobDTO(); + jobDTO.setDeviceId(deviceDTO.getId()); + jobDTO.setStartTime(workRecord.getStartAt()); + jobDTO.setEndTime(workRecord.getEndAt()); + BigDecimal b = BigDecimal.valueOf(workRecord.getWorkArea()); + jobDTO.setArea(b.setScale(2, RoundingMode.HALF_UP).floatValue()); + jobDTO.setStatus(2); + jobDTO.setDeptId(deviceDTO.getDeptId()); + jobDTO.setJobType(workRecord.getModule().intValue()); + Instant instant1 = Instant.ofEpochMilli(workRecord.getStartAt()); + Instant instant2 = Instant.ofEpochMilli(workRecord.getEndAt()); + Duration duration = Duration.between(instant1, instant2); + jobDTO.setDuration((int) duration.toSeconds()); + jobMapper.insert(jobDTO); + } + } } diff --git a/social/src/main/java/com/jiagutech/ams/utils/Pro4jUtil.java b/social/src/main/java/com/jiagutech/ams/utils/Pro4jUtil.java new file mode 100644 index 0000000..6752f28 --- /dev/null +++ b/social/src/main/java/com/jiagutech/ams/utils/Pro4jUtil.java @@ -0,0 +1,131 @@ +package com.jiagutech.ams.utils; + +import com.jiagutech.ams.model.TrackItem; +import lombok.extern.slf4j.Slf4j; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Slf4j +public class Pro4jUtil { + + + /** + * 计算地理多边形的面积 + * + * @param polygonLatLon 多边形顶点的经纬度数组,格式:{{纬度1, 经度1}, {纬度2, 经度2}, ...} + * @param targetEPSG 平面投影的 EPSG 编号,例如 "EPSG:32633" 表示 UTM Zone 33N + * @return 多边形面积,单位为平方米 + */ + public static double calculatePolygonArea(double[][] polygonLatLon, String sourceEPSG, String targetEPSG) { + // 1. 初始化投影系统 + CRSFactory crsFactory = new CRSFactory(); + CoordinateReferenceSystem sourceCRS = crsFactory.createFromName(sourceEPSG); + CoordinateReferenceSystem targetCRS = crsFactory.createFromName(targetEPSG); // 平面投影 + log.info("sourceCRS: {}, targetCRS: {}", sourceCRS, targetCRS); + // 2. 初始化坐标转换器 + BasicCoordinateTransform transform = new BasicCoordinateTransform(sourceCRS, targetCRS); + + // 3. 转换多边形的经纬度为平面坐标 + ProjCoordinate srcCoord = new ProjCoordinate(); + ProjCoordinate destCoord = new ProjCoordinate(); + double[][] polygonXY = new double[polygonLatLon.length][2]; + + for (int i = 0; i < polygonLatLon.length; i++) { + srcCoord.x = polygonLatLon[i][1]; // 经度 + srcCoord.y = polygonLatLon[i][0]; // 纬度 + transform.transform(srcCoord, destCoord); + polygonXY[i][0] = destCoord.x; + polygonXY[i][1] = destCoord.y; + } + // 4. 确保多边形闭合 + if (!Arrays.equals(polygonXY[0], polygonXY[polygonXY.length - 1])) { + polygonXY = Arrays.copyOf(polygonXY, polygonXY.length + 1); + polygonXY[polygonXY.length - 1] = polygonXY[0]; + } + + // 4. 计算多边形面积 + return calculateAreaFromXY(polygonXY); + } + + /** + * 使用 Shoelace 公式计算平面多边形的面积 + * + * @param polygonXY 多边形顶点的平面坐标数组,格式:{{x1, y1}, {x2, y2}, ...} + * @return 多边形面积,单位与坐标单位一致 + */ + private static double calculateAreaFromXY(double[][] polygonXY) { + double area = 0.0; + int n = polygonXY.length; + + for (int i = 0; i < n - 1; i++) { + area += polygonXY[i][0] * polygonXY[i + 1][1] - polygonXY[i + 1][0] * polygonXY[i][1]; + } + area = Math.abs(area) / 2.0; + return area; + } + + public static float calculateAreaByCGCS2000(List trackItemList) { + + double[][] polygonLatLon = new double[trackItemList.size()][2]; + for (int i = 0; i < trackItemList.size(); i++) { + polygonLatLon[i][0] = trackItemList.get(i).getLat(); + polygonLatLon[i][1] = trackItemList.get(i).getLng(); + } + double area = calculatePolygonArea(polygonLatLon, "EPSG:4490", "EPSG:4543"); + area = area * 0.0015; + + BigDecimal b = new BigDecimal(area); + return b.setScale(2, RoundingMode.HALF_UP).floatValue(); + + } + + public static double haversineDistance(double lat1, double lon1, double lat2, double lon2) { + GeometryFactory geometryFactory = new GeometryFactory(); + + Coordinate coord1 = fromLatLngToPoint(lat1, lon1); + Coordinate coord2 = fromLatLngToPoint(lat2, lon2); + + Point point1 = geometryFactory.createPoint(coord1); + Point point2 = geometryFactory.createPoint(coord2); + + return point1.distance(point2); + } + + private static final double DEG_TO_RAD = Math.PI / 180; + + public static Coordinate fromLatLngToPoint(double lat, double lng) { + double x = lng * 20037508.34 / 180; + double y = Math.log(Math.tan((90 + lat) * DEG_TO_RAD / 2)) / DEG_TO_RAD; + y = y * 20037508.34 / 180; + return new Coordinate(x, y); + } + + public static List removeStationaryPoints(List points, double threshold) { + List filteredPoints = new ArrayList<>(); + filteredPoints.add(points.get(0)); + + for (int i = 1; i < points.size(); i++) { + TrackItem previousPoint = points.get(i - 1); + TrackItem currentPoint = points.get(i); + + double distance = haversineDistance(previousPoint.getLat(), previousPoint.getLng(), currentPoint.getLat(), currentPoint.getLng()); + + if (distance >= threshold) { + filteredPoints.add(currentPoint); + } + } + + return filteredPoints; + } +} diff --git a/social/src/main/resources/mapper/DeviceMapper.xml b/social/src/main/resources/mapper/DeviceMapper.xml index ec3705e..c261494 100644 --- a/social/src/main/resources/mapper/DeviceMapper.xml +++ b/social/src/main/resources/mapper/DeviceMapper.xml @@ -45,4 +45,34 @@ ${ew.getCustomSqlSegment} + + \ No newline at end of file diff --git a/social/src/main/resources/mapper/JobMapper.xml b/social/src/main/resources/mapper/JobMapper.xml index ec041b7..63ad8e9 100644 --- a/social/src/main/resources/mapper/JobMapper.xml +++ b/social/src/main/resources/mapper/JobMapper.xml @@ -14,6 +14,7 @@ dd.box_num, j.operator_id, j.duration, + j.finished_type, FROM_UNIXTIME(j.start_time / 1000, '%Y-%m-%d %H:%i:%s') as start_time_str, u1.nick_name as operator_name, u1.phone as operator_phone, @@ -73,7 +74,7 @@ ${ew.getCustomSqlSegment} order by j.farmer_id,j.start_time - select j.id as job_id, j.start_time, j.end_time, @@ -117,8 +118,39 @@ group by j.farmer_id, j.job_type, t.name, d.id, d.name, u2.nick_name order by j.farmer_id, j.job_type - - + + \ No newline at end of file diff --git a/system/src/main/java/com/jiagutech/ams/controller/DeptController.java b/system/src/main/java/com/jiagutech/ams/controller/DeptController.java index 04dfd9e..e5f9e18 100644 --- a/system/src/main/java/com/jiagutech/ams/controller/DeptController.java +++ b/system/src/main/java/com/jiagutech/ams/controller/DeptController.java @@ -5,6 +5,7 @@ import com.jiagutech.ams.model.DeptItem; import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; import com.jiagutech.ams.model.common.R; +import com.jiagutech.ams.model.request.DeptAddRequest; import com.jiagutech.ams.model.request.DeptPageRequest; import com.jiagutech.ams.service.DeptService; import io.swagger.v3.oas.annotations.tags.Tag; @@ -31,4 +32,11 @@ public class DeptController { return R.ok(deptService.selectPage(pageRequest)); } + @SaCheckRole("gov") + @PutMapping("/add") + public R selectById(@RequestBody DeptAddRequest deptAddRequest) { + return deptService.add(deptAddRequest) ? R.ok() : R.fail("添加合作社失败"); + } + + } diff --git a/system/src/main/java/com/jiagutech/ams/controller/UserController.java b/system/src/main/java/com/jiagutech/ams/controller/UserController.java index fd51f75..d002c91 100644 --- a/system/src/main/java/com/jiagutech/ams/controller/UserController.java +++ b/system/src/main/java/com/jiagutech/ams/controller/UserController.java @@ -6,10 +6,7 @@ import com.jiagutech.ams.model.LoginUser; import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; import com.jiagutech.ams.model.common.R; -import com.jiagutech.ams.model.request.LoginRequest; -import com.jiagutech.ams.model.request.PageUserRequest; -import com.jiagutech.ams.model.request.UserFarmerRequest; -import com.jiagutech.ams.model.request.UserRequest; +import com.jiagutech.ams.model.request.*; import com.jiagutech.ams.model.response.LoginResponse; import com.jiagutech.ams.model.UserDetail; import com.jiagutech.ams.service.UserService; @@ -50,6 +47,12 @@ public class UserController { userService.addUser(user); return R.ok(); } + @Operation(summary = "添加农户") + @PostMapping("/addFarmer") + public R addFarmer(@Validated @RequestBody FarmerAddRequest farmerAddRequest) { + return userService.addFarmer(farmerAddRequest)? R.ok():R.fail("添加农户失败"); + } + @Operation(summary = "获取用户登陆信息") @GetMapping("/getUserInfo") diff --git a/system/src/main/java/com/jiagutech/ams/model/request/DeptAddRequest.java b/system/src/main/java/com/jiagutech/ams/model/request/DeptAddRequest.java new file mode 100644 index 0000000..16ee7fe --- /dev/null +++ b/system/src/main/java/com/jiagutech/ams/model/request/DeptAddRequest.java @@ -0,0 +1,21 @@ +package com.jiagutech.ams.model.request; + +import lombok.Data; + +@Data +public class DeptAddRequest { + + /** + * 合作社名称 + */ + private String deptName; + /** + * 合作社负责人ID + */ + private String managerName ; + + private String managerPhone; + + private String managerPassword; + +} diff --git a/system/src/main/java/com/jiagutech/ams/model/request/FarmerAddRequest.java b/system/src/main/java/com/jiagutech/ams/model/request/FarmerAddRequest.java new file mode 100644 index 0000000..05b4ffc --- /dev/null +++ b/system/src/main/java/com/jiagutech/ams/model/request/FarmerAddRequest.java @@ -0,0 +1,17 @@ +package com.jiagutech.ams.model.request; + +import jakarta.validation.constraints.Pattern; +import lombok.Data; + +@Data +public class FarmerAddRequest { + + private String nickName; + @Pattern(regexp = "^1[34578]\\d{9}$", message = "手机号码格式不正确") + private String phone; + + private String identityCardNum; + + private Long regionCode; + +} diff --git a/system/src/main/java/com/jiagutech/ams/model/request/UserRequest.java b/system/src/main/java/com/jiagutech/ams/model/request/UserRequest.java index 7598cf1..ad634fd 100644 --- a/system/src/main/java/com/jiagutech/ams/model/request/UserRequest.java +++ b/system/src/main/java/com/jiagutech/ams/model/request/UserRequest.java @@ -34,8 +34,6 @@ public class UserRequest { * 用户账号 */ @JsonIgnore - //@NotBlank(message = "用户账号不能为空") - @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") private String userName; /** diff --git a/system/src/main/java/com/jiagutech/ams/service/DeptServcieImpl.java b/system/src/main/java/com/jiagutech/ams/service/DeptServcieImpl.java deleted file mode 100644 index 270dd26..0000000 --- a/system/src/main/java/com/jiagutech/ams/service/DeptServcieImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jiagutech.ams.service; - -import cn.dev33.satoken.stp.StpUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jiagutech.ams.constant.UserConstants; -import com.jiagutech.ams.mapper.DeptMapper; -import com.jiagutech.ams.model.DeptItem; -import com.jiagutech.ams.model.LoginUser; -import com.jiagutech.ams.model.common.PageRequest; -import com.jiagutech.ams.model.common.PageResult; -import com.jiagutech.ams.model.request.DeptPageRequest; -import com.jiagutech.ams.utils.LoginUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -/** - * @ClassName DeptServcieImpl - * @author: zhangyeguang - * @create: 2024-09-02 17:35 - * @Version 1.0 - * @description: - **/ -@Service -@RequiredArgsConstructor -public class DeptServcieImpl implements DeptService { - private final DeptMapper deptMapper; - @Override - public PageResult selectPage(PageRequest pageRequest) { - - DeptPageRequest requestParam = pageRequest.getRequest(); - Page page = new Page(pageRequest.getPageNum(), pageRequest.getPageSize()); - LoginUser loginUser = LoginUtil.getLoginUser(); - - Page result = deptMapper.deptPage(page,requestParam!=null ?requestParam.getDeptName():null, loginUser.getRegionPath()); - return PageResult.of((int) result.getTotal(), (int) result.getSize(), (int) result.getCurrent(), result.getRecords()); - - } - - - -} diff --git a/system/src/main/java/com/jiagutech/ams/service/DeptService.java b/system/src/main/java/com/jiagutech/ams/service/DeptService.java index de2b7b7..7524cad 100644 --- a/system/src/main/java/com/jiagutech/ams/service/DeptService.java +++ b/system/src/main/java/com/jiagutech/ams/service/DeptService.java @@ -3,6 +3,7 @@ package com.jiagutech.ams.service; import com.jiagutech.ams.model.DeptItem; import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; +import com.jiagutech.ams.model.request.DeptAddRequest; import com.jiagutech.ams.model.request.DeptPageRequest; /** @@ -14,4 +15,6 @@ import com.jiagutech.ams.model.request.DeptPageRequest; **/ public interface DeptService { PageResult selectPage(PageRequest pageRequest); + + Boolean add(DeptAddRequest deptAddRequest); } diff --git a/system/src/main/java/com/jiagutech/ams/service/DeptServiceImpl.java b/system/src/main/java/com/jiagutech/ams/service/DeptServiceImpl.java new file mode 100644 index 0000000..ff2290e --- /dev/null +++ b/system/src/main/java/com/jiagutech/ams/service/DeptServiceImpl.java @@ -0,0 +1,75 @@ +package com.jiagutech.ams.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jiagutech.ams.mapper.DeptMapper; +import com.jiagutech.ams.mapper.UserDeptMapper; +import com.jiagutech.ams.mapper.UserMapper; +import com.jiagutech.ams.model.DeptItem; +import com.jiagutech.ams.model.LoginUser; +import com.jiagutech.ams.model.common.PageRequest; +import com.jiagutech.ams.model.common.PageResult; +import com.jiagutech.ams.model.dto.DeptDTO; +import com.jiagutech.ams.model.dto.UserDTO; +import com.jiagutech.ams.model.dto.UserDeptDTO; +import com.jiagutech.ams.model.request.DeptAddRequest; +import com.jiagutech.ams.model.request.DeptPageRequest; +import com.jiagutech.ams.utils.LoginUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author zhangyeguang + * @version 1.0 + * @ClassName DeptServcieImpl + * @create: 2024-09-02 17:35 + * @description: + **/ +@Service +@RequiredArgsConstructor +public class DeptServiceImpl implements DeptService { + private final DeptMapper deptMapper; + private final UserDeptMapper userDeptMapper; + private final UserMapper userMapper; + + @Override + public PageResult selectPage(PageRequest pageRequest) { + + DeptPageRequest requestParam = pageRequest.getRequest(); + Page page = new Page(pageRequest.getPageNum(), pageRequest.getPageSize()); + LoginUser loginUser = LoginUtil.getLoginUser(); + + Page result = deptMapper.deptPage(page, requestParam != null ? requestParam.getDeptName() : null, loginUser.getRegionPath()); + return PageResult.of((int) result.getTotal(), (int) result.getSize(), (int) result.getCurrent(), result.getRecords()); + + } + + @Override + @Transactional + public Boolean add(DeptAddRequest deptAddRequest) { + LoginUser loginUser = LoginUtil.getLoginUser(); + assert loginUser != null; + + DeptDTO deptDTO = new DeptDTO().setName(deptAddRequest.getDeptName()) + .setRegionCode(loginUser.getRegionCode()) + .setRegionPath(loginUser.getRegionPath()); + int row = deptMapper.insert(deptDTO); + if (row > 0) { + UserDTO userDTO = new UserDTO(); + userDTO.setPassword(deptAddRequest.getManagerPassword()); + userDTO.setNickName(deptAddRequest.getManagerName()); + userDTO.setPhone(deptAddRequest.getManagerPhone()); + int insert = userMapper.insert(userDTO); + if (insert > 0) { + UserDeptDTO userDeptDTO = new UserDeptDTO(); + userDeptDTO.setDeptId(deptDTO.getId()); + userDeptDTO.setUserId(userDTO.getId()); + userDeptMapper.insert(userDeptDTO); + return true; + } + } + return false; + } + + +} diff --git a/system/src/main/java/com/jiagutech/ams/service/UserService.java b/system/src/main/java/com/jiagutech/ams/service/UserService.java index abeff43..0573dc8 100644 --- a/system/src/main/java/com/jiagutech/ams/service/UserService.java +++ b/system/src/main/java/com/jiagutech/ams/service/UserService.java @@ -4,10 +4,7 @@ package com.jiagutech.ams.service; import com.jiagutech.ams.model.UserDetail; import com.jiagutech.ams.model.common.PageRequest; import com.jiagutech.ams.model.common.PageResult; -import com.jiagutech.ams.model.request.LoginRequest; -import com.jiagutech.ams.model.request.PageUserRequest; -import com.jiagutech.ams.model.request.UserFarmerRequest; -import com.jiagutech.ams.model.request.UserRequest; +import com.jiagutech.ams.model.request.*; import com.jiagutech.ams.model.response.LoginResponse; import java.util.List; @@ -29,4 +26,6 @@ public interface UserService { PageResult getUserPage(PageRequest pageRequest); List getAllFarmersByRegionCode(Long regionCode,String nickName); + + boolean addFarmer(FarmerAddRequest farmerAddRequest); } diff --git a/system/src/main/java/com/jiagutech/ams/service/UserServiceImpl.java b/system/src/main/java/com/jiagutech/ams/service/UserServiceImpl.java index 4827976..02c69d8 100644 --- a/system/src/main/java/com/jiagutech/ams/service/UserServiceImpl.java +++ b/system/src/main/java/com/jiagutech/ams/service/UserServiceImpl.java @@ -28,10 +28,7 @@ import com.jiagutech.ams.model.dto.RoleDTO; import com.jiagutech.ams.model.dto.UserDTO; import com.jiagutech.ams.model.dto.UserDeptDTO; import com.jiagutech.ams.model.dto.UserRoleDTO; -import com.jiagutech.ams.model.request.LoginRequest; -import com.jiagutech.ams.model.request.PageUserRequest; -import com.jiagutech.ams.model.request.UserFarmerRequest; -import com.jiagutech.ams.model.request.UserRequest; +import com.jiagutech.ams.model.request.*; import com.jiagutech.ams.model.response.LoginResponse; import com.jiagutech.ams.utils.LoginUtil; import lombok.RequiredArgsConstructor; @@ -72,16 +69,11 @@ public class UserServiceImpl implements UserService { if (loginRequest.getClientType() == 1) { validateCaptcha(code, uuid); } - Integer clientType = loginRequest.getClientType(); LoginUser user = userMapper.selectLoginUserByPhone(phone); if (user == null) { throw new BusinessException(BizCode.USER_NOT_FOUND); } - Predicate predicate = role -> role.getKey().equals("admin") || role.getKey().equals("manager") || role.getKey().equals("machinist"); - if (clientType == 2 && user.getRoles().stream().noneMatch(predicate)) { - throw new BusinessException(BizCode.LOGIN_TYPE_ERROR); - } boolean checkpw = BCrypt.checkpw(password, user.getPassword()); if (!checkpw) { throw new BusinessException(BizCode.PASSWORD_ERROR); @@ -108,7 +100,7 @@ public class UserServiceImpl implements UserService { public void addUser(UserRequest userRequest) { UserDTO userDTO = UserMapping.INSTANCE.userToUserDTO(userRequest); userDTO.setId(null); - userDTO.setPassword(BCrypt.hashpw(userRequest.getPassword())); + userDTO.setPassword(BCrypt.hashpw(userRequest.getPassword())); if (userDTO.getRegionCode() != null && userDTO.getRegionCode() != 0l) { RegionVO completeRegionInfo = regionMapper.getCompleteRegionInfo(userDTO.getRegionCode()); if (completeRegionInfo != null) { @@ -242,4 +234,24 @@ public class UserServiceImpl implements UserService { throw new BusinessException(BizCode.CAPTCHA_ERROR); } } + + + @Override + public boolean addFarmer(FarmerAddRequest farmerAddRequest) { + UserDTO userDTO = new UserDTO(); + userDTO.setPhone(farmerAddRequest.getPhone()); + userDTO.setNickName(farmerAddRequest.getNickName()); + userDTO.setIdentityCardNum(farmerAddRequest.getIdentityCardNum()); + userDTO.setRegionCode(farmerAddRequest.getRegionCode()); + if (userDTO.getRegionCode() != null && userDTO.getRegionCode() != 0L) { + RegionVO completeRegionInfo = regionMapper.getCompleteRegionInfo(userDTO.getRegionCode()); + if (completeRegionInfo != null) { + userDTO.setRegionPath(completeRegionInfo.getRegionCode()); + userDTO.setRegionName(completeRegionInfo.getRegionName()); + } + } + userMapper.insert(userDTO); + insertUserRoleAndDept(userDTO, "farmer", 0L); + return false; + } } diff --git a/system/src/main/resources/mapper/UserMapper.xml b/system/src/main/resources/mapper/UserMapper.xml index c98a9e8..aace459 100644 --- a/system/src/main/resources/mapper/UserMapper.xml +++ b/system/src/main/resources/mapper/UserMapper.xml @@ -28,9 +28,9 @@ avatar, region_path, region_name - from ams_user + from ams_user u where phone = #{phone} - and del_flag = 0 + and del_flag = 0 and exists(select 1 from ams_user_role ur where ur.user_id = u.id and ur.role_id != 5)