Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
S0025136190 1 year ago
parent
commit
90a7f95be1
25 changed files with 237 additions and 103 deletions
  1. 19 1
      Backend/sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java
  2. 2 2
      Backend/sample/src/main/java/com/dji/sample/manage/controller/UserController.java
  3. 24 0
      Backend/sample/src/main/java/com/dji/sample/manage/model/dto/DeviceTypeDTO.java
  4. 4 4
      Backend/sample/src/main/java/com/dji/sample/manage/model/param/DeviceBoundQueryParam.java
  5. 4 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceDictionaryService.java
  6. 3 1
      Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java
  7. 2 2
      Backend/sample/src/main/java/com/dji/sample/manage/service/IUserService.java
  8. 26 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceDictionaryServiceImpl.java
  9. 1 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceOprLogsServiceImpl.java
  10. 25 27
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
  11. 3 3
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/UserServiceImpl.java
  12. 3 3
      Web/src/api/manage.ts
  13. 26 0
      Web/src/assets/icons/jk_icon_white.svg
  14. 8 4
      Web/src/components/devices/changeRecord/index.vue
  15. 10 5
      Web/src/components/devices/deviceList/index.vue
  16. 8 4
      Web/src/components/devices/feedbackRecord/index.vue
  17. 7 1
      Web/src/hooks/use-mouse-tool.ts
  18. 3 3
      Web/src/pages/page-pilot/pilot-home.vue
  19. 13 5
      Web/src/pages/page-web/projects/media/detail/components/FileInfo.vue
  20. 1 1
      Web/src/pages/page-web/projects/media/detail/components/Search.vue
  21. 10 12
      Web/src/pages/page-web/projects/media/detail/index.vue
  22. 8 4
      Web/src/pages/page-web/projects/media/index/index.vue
  23. 3 4
      Web/src/pages/page-web/projects/member/components/Search.vue
  24. 16 13
      Web/src/pages/page-web/projects/member/index.vue
  25. 8 4
      Web/src/pages/page-web/projects/trajectory/index.vue

+ 19 - 1
Backend/sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java

@@ -3,7 +3,10 @@ package com.dji.sample.manage.controller;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
 import com.dji.sample.manage.model.dto.DevicePayloadDTO;
+import com.dji.sample.manage.model.dto.DeviceTypeDTO;
+import com.dji.sample.manage.model.param.DeviceBoundQueryParam;
 import com.dji.sample.manage.model.param.DeviceOprLogsQueryParam;
+import com.dji.sample.manage.service.IDeviceDictionaryService;
 import com.dji.sample.manage.service.IDevicePayloadService;
 import com.dji.sample.manage.service.IDeviceService;
 import com.dji.sdk.common.HttpResultResponse;
@@ -36,6 +39,9 @@ public class DeviceController {
     @Autowired
     private IDevicePayloadService devicePayloadService;
 
+    @Autowired
+    private IDeviceDictionaryService deviceDictionaryService;
+
     /**
      * Get the topology list of all online devices in one workspace.
      * @param workspaceId
@@ -96,10 +102,11 @@ public class DeviceController {
      */
     @GetMapping("/{workspace_id}/devices/bound")
     public HttpResultResponse<PaginationData<DeviceDTO>> getBoundDevicesWithDomain(
+            DeviceBoundQueryParam deviceBoundQueryParam,
             @PathVariable("workspace_id") String workspaceId, Integer domain,
             @RequestParam(defaultValue = "1") Long page,
             @RequestParam(value = "page_size", defaultValue = "50") Long pageSize) {
-        PaginationData<DeviceDTO> devices = deviceService.getBoundDevicesWithDomain(workspaceId, page, pageSize, domain);
+        PaginationData<DeviceDTO> devices = deviceService.getBoundDevicesWithDomain(workspaceId, page, pageSize, domain,deviceBoundQueryParam);
 
         return HttpResultResponse.success(devices);
     }
@@ -173,4 +180,15 @@ public class DeviceController {
         List<DevicePayloadDTO> payloadList = devicePayloadService.getDevicePayloadEntities();
         return HttpResultResponse.success(payloadList);
     }
+
+    /**
+     * 获取拍摄负责信息
+     * @param workspaceId
+     * @return
+     */
+    @GetMapping("/{workspace_id}/getDeviceType")
+    public HttpResultResponse getDeviceType(@PathVariable("workspace_id") String workspaceId) {
+        List<DeviceTypeDTO> resultList = deviceDictionaryService.getDeviceType();
+        return HttpResultResponse.success(resultList);
+    }
 }

+ 2 - 2
Backend/sample/src/main/java/com/dji/sample/manage/controller/UserController.java

@@ -49,8 +49,8 @@ public class UserController {
     public HttpResultResponse<PaginationData<UserListDTO>> getUsers(@RequestParam(defaultValue = "1") Long page,
                                                                     @RequestParam(value = "page_size", defaultValue = "50") Long pageSize,
                                                                     @PathVariable("workspace_id") String workspaceId,
-                                                                    String username) {
-        PaginationData<UserListDTO> paginationData = userService.getUsersByWorkspaceId(page, pageSize, workspaceId,username);
+                                                                    String searchInfo) {
+        PaginationData<UserListDTO> paginationData = userService.getUsersByWorkspaceId(page, pageSize, workspaceId,searchInfo);
         return HttpResultResponse.success(paginationData);
     }
 

+ 24 - 0
Backend/sample/src/main/java/com/dji/sample/manage/model/dto/DeviceTypeDTO.java

@@ -0,0 +1,24 @@
+package com.dji.sample.manage.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @author huiqing.jiang
+ * @date 2024/8/16
+ * @version 0.1
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class DeviceTypeDTO {
+
+    private String deviceValue;
+
+    private String deviceName;
+
+}

+ 4 - 4
Backend/sample/src/main/java/com/dji/sample/manage/model/param/DeviceBoundQueryParam.java

@@ -22,11 +22,11 @@ public class DeviceBoundQueryParam {
     @JsonProperty("end_time")
     private Long endTime;
 
-    @JsonProperty("device_name")
-    private String deviceName;
+    @JsonProperty("device_type")
+    private String deviceType;
 
-    @JsonProperty("logs_information")
-    private String logsInformation;
+    @JsonProperty("search_info")
+    private String searchInfo;
 
 
 }

+ 4 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceDictionaryService.java

@@ -1,7 +1,9 @@
 package com.dji.sample.manage.service;
 
 import com.dji.sample.manage.model.dto.DeviceDictionaryDTO;
+import com.dji.sample.manage.model.dto.DeviceTypeDTO;
 
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -21,4 +23,6 @@ public interface IDeviceDictionaryService {
      */
     Optional<DeviceDictionaryDTO> getOneDictionaryInfoByTypeSubType(Integer domain, Integer deviceType, Integer subType);
 
+    List<DeviceTypeDTO> getDeviceType();
+
 }

+ 3 - 1
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java

@@ -2,6 +2,7 @@ package com.dji.sample.manage.service;
 
 import com.dji.sample.common.model.CustomClaim;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
+import com.dji.sample.manage.model.param.DeviceBoundQueryParam;
 import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
@@ -130,9 +131,10 @@ public interface IDeviceService {
      * @param page
      * @param pageSize
      * @param domain
+     * @param deviceBoundQueryParam
      * @return
      */
-    PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page, Long pageSize, Integer domain);
+    PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page, Long pageSize, Integer domain, DeviceBoundQueryParam deviceBoundQueryParam);
 
     DeviceDTO setChild(DeviceDTO device);
 

+ 2 - 2
Backend/sample/src/main/java/com/dji/sample/manage/service/IUserService.java

@@ -40,10 +40,10 @@ public interface IUserService {
     /**
      * Query information about all users in a workspace.
      * @param workspaceId   uuid
-     * @param username
+     * @param searchInfo
      * @return
      */
-    PaginationData<UserListDTO> getUsersByWorkspaceId(long page, long pageSize, String workspaceId,String username);
+    PaginationData<UserListDTO> getUsersByWorkspaceId(long page, long pageSize, String workspaceId,String searchInfo);
 
     HttpResultResponse saveApiUser(String clientId,String username, String password);
 

+ 26 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceDictionaryServiceImpl.java

@@ -1,15 +1,21 @@
 package com.dji.sample.manage.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dji.sample.manage.dao.IDeviceDictionaryMapper;
 import com.dji.sample.manage.model.dto.DeviceDictionaryDTO;
+import com.dji.sample.manage.model.dto.DeviceTypeDTO;
 import com.dji.sample.manage.model.entity.DeviceDictionaryEntity;
+import com.dji.sample.manage.model.entity.DeviceEntity;
 import com.dji.sample.manage.service.IDeviceDictionaryService;
+import com.dji.sdk.cloudapi.device.DeviceDomainEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  *
@@ -39,6 +45,26 @@ public class DeviceDictionaryServiceImpl implements IDeviceDictionaryService {
                                         .last(" limit 1 "))));
     }
 
+    @Override
+    public List<DeviceTypeDTO> getDeviceType() {
+        QueryWrapper<DeviceDictionaryEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().in(DeviceDictionaryEntity::getDomain, DeviceDomainEnum.DRONE.getDomain(),DeviceDomainEnum.DOCK.getDomain());
+        List<DeviceDictionaryEntity> entities = mapper.selectList(wrapper);
+        if(entities.size() > 0) {
+            List<DeviceTypeDTO> result = entities.stream()
+                    .map(entity -> {
+                        String combinedFields = entity.getDomain() + "-" + entity.getSubType() + "-" + entity.getDeviceType();
+                        DeviceTypeDTO combinedFieldsEntity = new DeviceTypeDTO();
+                        combinedFieldsEntity.setDeviceValue(combinedFields);
+                        combinedFieldsEntity.setDeviceName(entity.getDeviceName());
+                        return combinedFieldsEntity;
+                    })
+                    .collect(Collectors.toList());
+            return result;
+        }
+        return null;
+    }
+
     /**
      * Convert database entity objects into dictionary data transfer object.
      * @param entity

+ 1 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceOprLogsServiceImpl.java

@@ -56,6 +56,7 @@ public class DeviceOprLogsServiceImpl implements IDeviceOprLogsService {
                 .eq(DeviceOprLogsEntity::getWorkspaceId, workspaceId)
                 .between(Objects.nonNull(param.getBeginTime()) && Objects.nonNull(param.getEndTime()),
                         DeviceOprLogsEntity::getCreateTime, param.getBeginTime(), param.getEndTime())
+                .eq(param!=null && StringUtils.hasText(param.getDeviceName()),DeviceOprLogsEntity::getDeviceName,param.getDeviceName())
                 .and(StringUtils.hasText(param.getLogsInformation()),
                         wrapper -> wrapper .like( DeviceOprLogsEntity::getLogInfo, param.getLogsInformation())
                                 .or().like( DeviceOprLogsEntity::getDeviceSn, param.getLogsInformation())

+ 25 - 27
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java

@@ -1,6 +1,7 @@
 package com.dji.sample.manage.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dji.sample.common.error.CommonErrorEnum;
@@ -10,6 +11,8 @@ import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.service.IWebSocketMessageService;
 import com.dji.sample.control.model.enums.DroneAuthorityEnum;
 import com.dji.sample.manage.dao.IDeviceMapper;
+import com.dji.sample.manage.model.param.DeviceBoundQueryParam;
+import com.dji.sample.media.model.MediaDirEntity;
 import com.dji.sample.manage.model.enums.*;
 import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.*;
@@ -228,17 +231,6 @@ public class DeviceServiceImpl implements IDeviceService {
                 .collect(Collectors.toList());
     }
 
-    @Override
-    public List<DeviceDTO> getDevicesStatus(List<String> snList) {
-        List<DeviceDTO> deviceDTOList = new ArrayList<DeviceDTO>();
-        for (String sn : snList) {
-            DeviceDTO deviceDTO = DeviceDTO.builder().deviceSn(sn).build();
-            getDeviceStatus(deviceDTO);
-            deviceDTOList.add(deviceDTO);
-        }
-        return deviceDTOList;
-    }
-
     @Override
     public List<DeviceDTO> getDevicesTopoForWeb(String workspaceId) {
         List<DeviceDTO> devicesList = this.getDevicesByParams(
@@ -257,7 +249,7 @@ public class DeviceServiceImpl implements IDeviceService {
 
     @Override
     public void spliceDeviceTopo(DeviceDTO gateway) {
-        getDeviceStatus(gateway);
+
         gateway.setStatus(deviceRedisService.checkDeviceOnline(gateway.getDeviceSn()));
 
         // sub device
@@ -266,7 +258,6 @@ public class DeviceServiceImpl implements IDeviceService {
         }
 
         DeviceDTO subDevice = getDevicesByParams(DeviceQueryParam.builder().deviceSn(gateway.getChildDeviceSn()).build()).get(0);
-        getDeviceStatus(subDevice);
         subDevice.setStatus(deviceRedisService.checkDeviceOnline(subDevice.getDeviceSn()));
         gateway.setChildren(subDevice);
 
@@ -274,15 +265,6 @@ public class DeviceServiceImpl implements IDeviceService {
         subDevice.setPayloadsList(payloadService.getDevicePayloadEntitiesByDeviceSn(gateway.getChildDeviceSn()));
     }
 
-    private void getDeviceStatus(DeviceDTO deviceDTO) {
-        Optional<DeviceStatusEnum> deviceStatusOpt = deviceRedisService.getDeviceStatus(deviceDTO.getDeviceSn());
-        if(deviceStatusOpt.isPresent()) {
-            deviceDTO.setStatusText(deviceStatusOpt.get().getText());
-        } else {
-            deviceDTO.setStatusText("设备已离线");
-        }
-    }
-
     @Override
     public Optional<TopologyDeviceDTO> getDeviceTopoForPilot(String sn) {
         if (!StringUtils.hasText(sn)) {
@@ -505,13 +487,29 @@ public class DeviceServiceImpl implements IDeviceService {
 
     @Override
     public PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page,
-                                                               Long pageSize, Integer domain) {
+                                                               Long pageSize, Integer domain, DeviceBoundQueryParam param) {
+
+        QueryWrapper<DeviceEntity> wrapper = new QueryWrapper<>();
+        wrapper.lambda().in(DeviceEntity::getDomain, DeviceDomainEnum.DRONE.getDomain(),DeviceDomainEnum.DOCK.getDomain())
+                .eq(DeviceEntity::getWorkspaceId, workspaceId)
+                .eq(DeviceEntity::getBoundStatus, true)
+                .ge(param != null && param.getBeginTime() != null, DeviceEntity::getCreateTime,param.getBeginTime())
+                .le(param != null && param.getEndTime() != null, DeviceEntity::getCreateTime,param.getEndTime())
+                .and(StringUtils.hasText(param.getSearchInfo()),
+                        wrapper2 -> wrapper2.like( DeviceEntity::getDeviceSn, param.getSearchInfo())
+                                .or().like( DeviceEntity::getNickname, param.getSearchInfo()));
+        if (param != null && StringUtils.hasText(param.getDeviceType())) {
+            String[] deviceType = param.getDeviceType().split("-");
+            String dom = deviceType[0];
+            String sub = deviceType[1];
+            String type = deviceType[2];
+            wrapper.lambda().eq(DeviceEntity::getDomain,dom )
+                    .eq(DeviceEntity::getSubType,sub )
+                    .eq(DeviceEntity::getDeviceType,type );
+        }
 
         Page<DeviceEntity> pagination = mapper.selectPage(new Page<>(page, pageSize),
-                new LambdaQueryWrapper<DeviceEntity>()
-                        .in(DeviceEntity::getDomain, DeviceDomainEnum.DRONE.getDomain(),DeviceDomainEnum.DOCK.getDomain())
-                        .eq(DeviceEntity::getWorkspaceId, workspaceId)
-                        .eq(DeviceEntity::getBoundStatus, true));
+                wrapper);
         List<DeviceDTO> devicesList = pagination.getRecords().stream().map(this::deviceEntityConvertToDTO)
                 .peek(device -> {
                     device.setStatus(deviceRedisService.checkDeviceOnline(device.getDeviceSn()));

+ 3 - 3
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/UserServiceImpl.java

@@ -199,15 +199,15 @@ public class UserServiceImpl implements IUserService {
     }
 
     @Override
-    public PaginationData<UserListDTO> getUsersByWorkspaceId(long page, long pageSize, String workspaceId,String username) {
+    public PaginationData<UserListDTO> getUsersByWorkspaceId(long page, long pageSize, String workspaceId,String searchInfo) {
         LambdaQueryWrapper<UserEntity> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(UserEntity::getWorkspaceId, workspaceId);
         queryWrapper.and(wrapper -> {
             wrapper.eq(UserEntity::getUserType, UserTypeEnum.WEB.getVal());
             wrapper.or().eq(UserEntity::getUserType, UserTypeEnum.PILOT.getVal());
         });
-        if(username != null) {
-            queryWrapper.like(UserEntity::getUsername,username);
+        if(searchInfo != null) {
+            queryWrapper.like(UserEntity::getUsername,searchInfo);
         }
 
         Page<UserEntity> userEntityPage = mapper.selectPage(

+ 3 - 3
Web/src/api/manage.ts

@@ -90,9 +90,9 @@ export const setLivestreamQuality = async function (body: {}): Promise<IWorkspac
   return result.data
 }
 
-export const getAllUsersInfo = async function (wid: string, body: { page: number, page_size: number }): Promise<CommonListResponse<any>> {
-  const url = `${HTTP_PREFIX}/users/${wid}/users?&page=${body.page}&page_size=${body.page_size}`
-  const result = await request.get(url)
+export const getAllUsersInfo = async function (wid: string, body: { page: number, page_size: number, search_info: string }): Promise<CommonListResponse<any>> {
+  const url = `${HTTP_PREFIX}/users/${wid}/users`
+  const result = await request.get(url, { params: body })
   return result.data
 }
 

+ 26 - 0
Web/src/assets/icons/jk_icon_white.svg

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="251px" height="251px" viewBox="0 0 251 251" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>jk_icon</title>
+    <defs>
+        <filter x="-8.0%" y="-5.7%" width="116.0%" height="111.3%" filterUnits="objectBoundingBox" id="filter-1">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <radialGradient cx="13.6659223%" cy="62.3104639%" fx="13.6659223%" fy="62.3104639%" r="131.982363%" gradientTransform="translate(0.136659,0.623105),scale(1.000000,0.378788),rotate(-50.925180),translate(-0.136659,-0.623105)" id="radialGradient-2">
+            <stop stop-color="#00A0C7" offset="0%"></stop>
+            <stop stop-color="#08A84C" offset="100%"></stop>
+        </radialGradient>
+    </defs>
+    <g id="jk_icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <rect id="矩形" x="0" y="0" width="251" height="251" rx="26"></rect>
+        <g id="shjk_logo" filter="url(#filter-1)" transform="translate(51.000000, 12.000000)" fill-rule="nonzero">
+            <path d="M75.4603621,105.845419 C72.6648895,128.402658 82.9600933,131.750898 96.5956723,111.716164 L143.396227,46.0388144 L88.7798308,14 L75.4603621,105.84515 L75.4603621,105.845419 Z M99.429745,131.760611 C92.9618743,138.233803 88.1125313,147.974478 103.598818,157.109304 L150,182.260493 L150,77.0055529 L99.4299233,131.760253 L99.429745,131.760611 Z M78.5169423,179.310393 L88.9154213,212 L149.999777,212 L103.940468,173.115684 C95.6605348,165.758564 89.1120319,162.747002 84.5463057,162.747002 C77.5173526,162.747002 75.1990318,169.900262 78.5168977,179.310393 L78.5169423,179.310393 Z" id="形状" fill="url(#radialGradient-2)"></path>
+            <polygon id="路径" fill="#005D80" points="18.8263249 45.05655 18.8005458 127.045898 0 146.711309 0 212 45.1671295 212 45.1671295 211.996826 64 211.996826 64 0 18.8261456 45.0573099 18.8261456 45.0569523"></polygon>
+        </g>
+    </g>
+</svg>

+ 8 - 4
Web/src/components/devices/changeRecord/index.vue

@@ -29,11 +29,13 @@ import CustomCell from './components/CustomCell.vue';
 import { apis } from '/@/api/custom/index';
 
 interface State {
+  query: any,
   listLoading: boolean,
   list: any[],
 };
 
 const state: State = reactive({
+  query: undefined,
   listLoading: false,
   list: [],
 });
@@ -47,11 +49,11 @@ const paginationConfig = reactive({
   total: 0
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const res = await apis.fetchChangeRecordList({
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize
     });
@@ -137,12 +139,14 @@ const refreshData = async (page: any) => {
 
 // 点击搜索
 const onClickSearch = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 </script>
 

+ 10 - 5
Web/src/components/devices/deviceList/index.vue

@@ -84,9 +84,11 @@ import DeviceFirmwareUpgrade from '/@/components/devices/device-upgrade/DeviceFi
 import DeviceLogUploadRecordDrawer from '/@/components/devices/device-log/DeviceLogUploadRecordDrawer.vue';
 import DeviceHmsDrawer from '/@/components/devices/device-hms/DeviceHmsDrawer.vue';
 import { getBindingDevices, updateDevice, unbindDevice } from '/@/api/manage';
+import { getWorkspaceId } from '/@/utils/index';
 
 interface State {
   workspaceId: string,
+  query: any,
   listLoading: boolean,
   list: any[],
   selectedRowKeys: string[],
@@ -99,7 +101,8 @@ interface State {
 };
 
 const state: State = reactive({
-  workspaceId: localStorage.getItem('workspace_id') || '',
+  workspaceId: getWorkspaceId(),
+  query: undefined,
   listLoading: false,
   list: [],
   selectedRowKeys: [],
@@ -118,11 +121,11 @@ const paginationConfig = reactive({
   total: 0
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const res = await getBindingDevices(state.workspaceId, {
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize,
     });
@@ -236,12 +239,14 @@ const onClickBatchDelete = async () => {
 
 // 点击搜索
 const onClickSearch = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击设备日志

+ 8 - 4
Web/src/components/devices/feedbackRecord/index.vue

@@ -53,6 +53,7 @@ import Drawer from './components/Drawer.vue';
 import { apis } from '/@/api/custom/index';
 
 interface State {
+  query: any,
   listLoading: boolean,
   list: any[],
   currentId: string,
@@ -60,6 +61,7 @@ interface State {
 };
 
 const state: State = reactive({
+  query: undefined,
   listLoading: false,
   list: [],
   currentId: '',
@@ -75,11 +77,11 @@ const paginationConfig = reactive({
   total: 0
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const res = await apis.fetchChangeRecordList({
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize
     });
@@ -177,12 +179,14 @@ const refreshData = async (page: any) => {
 
 // 点击搜索
 const onClickSearch = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击详情

+ 7 - 1
Web/src/hooks/use-mouse-tool.ts

@@ -136,7 +136,13 @@ export function useMouseTool() {
     const AMap = root.$aMap;
     const map = root.$map
 
-    map.remove(map.getLayers());
+    // 移除所有背景图层
+    map.getLayers().forEach((layer: any) => {
+      if (layer instanceof AMap.TileLayer) {
+        map.remove(layer);
+      }
+    });
+
     if (type === 0) {
       // 标准图层
       map.add(new AMap.createDefaultLayer());

+ 3 - 3
Web/src/pages/page-pilot/pilot-home.vue

@@ -4,7 +4,7 @@
       <div style="width:90%; height: 90%; margin: 4vh">
         <a-layout style="height: 20%; margin-top: 3vh; background-color: white; ">
           <a-layout-sider width="25%" theme="light" align="center">
-            <a-avatar :size="60" :src="cloudapi">
+            <a-avatar :size="60" :src="jkIcon">
             </a-avatar>
           </a-layout-sider>
           <a-layout-content style="margin-left: 1vw;">
@@ -79,7 +79,7 @@
         <a-row style="border-bottom: 1px solid #f4f8f9; height: 45px;" align="middle"
           v-if="device.data.online_status && device.data.sn">
           <a-col :span="1"></a-col>
-          <a-col :span="9">Aircraft Sn</a-col>
+          <a-col :span="9">飞行器SN</a-col>
           <a-col :span="13" class="flex-align-end flex-column">
             <span style="color: #737373">{{ device.data.sn }}</span>
           </a-col>
@@ -132,7 +132,7 @@ import { BindBody, bindDevice, getDeviceBySn, getPlatformInfo, getUserInfo, unbi
 import apiPilot, { ApiParam, MapParam, ThingParam, WsParam } from '/@/api/pilot-bridge'
 import { getRoot } from '/@/root'
 import { EBizCode, EComponentName, EDownloadOwner, ELocalStorageKey, ERouterName, EStatusValue } from '/@/types'
-import cloudapi from '/@/assets/icons/cloudapi.png'
+import jkIcon from '/@/assets/icons/jk_icon_white.svg'
 import { RightOutlined, CloudSyncOutlined, SyncOutlined } from '@ant-design/icons-vue'
 import { useMyStore } from '/@/store'
 import { DeviceStatus } from '/@/types/device'

+ 13 - 5
Web/src/pages/page-web/projects/media/detail/components/FileInfo.vue

@@ -154,6 +154,7 @@ import { useGMapManage } from '/@/hooks/use-g-map';
 import { apis } from '/@/api/custom';
 import { downloadFile } from '/@/utils/common';
 import { downloadMediaFile } from '/@/api/media';
+import { wgs84togcj02 } from '/@/vendors/coordtransform'
 import { getWorkspaceId } from '/@/utils/index'
 
 interface Props {
@@ -186,6 +187,7 @@ const state = reactive({
     picture_time: '',
     longitude: '',// 经度
     latitude: '',// 纬度
+    coordinates: [],
   },
   map: null, // 高德地图实例
 })
@@ -198,7 +200,12 @@ const AmapHook = useGMapManage();
 const init = async () => {
   try {
     const res = await apis.fetchFileDetail(state.currentId);
-    state.info = res.data;
+    state.info = {
+      ...res.data,
+      longitude: res.data.longitude ? res.data.longitude.toFixed(6) : '',
+      latitude: res.data.latitude ? res.data.latitude.toFixed(6) : '',
+      coordinates: (res.data.longitude && res.data.latitude) ? wgs84togcj02(res.data.longitude, res.data.latitude) : [],
+    };
     if (res.data.media_type !== 4) {
       state.imgLoading = true;
       const img = new Image();
@@ -207,7 +214,7 @@ const init = async () => {
         state.imgLoading = false;
       };
     }
-    if (state.info.longitude && state.info.latitude) {
+    if (state.info.coordinates.length) {
       const AMap = await AmapHook.asyncInitMap();
       const map = new AMap.Map('photoPositionMap', {
         layers: [new AMap.TileLayer.Satellite()],// 卫星图-图层
@@ -215,14 +222,14 @@ const init = async () => {
         rotateEnable: true,// 开启地图旋转交互
         pitchEnable: true,// 开启地图倾斜交互
         zoom: 17, // 初始化地图层级
-        center: [state.info.longitude, state.info.latitude],// 中心点
+        center: state.info.coordinates,// 中心点
       })
       state.map = map;
       // 创建一个标记并将其添加到地图上
       new AMap.Marker({
         map: map,
         cursor: 'pointer',
-        position: [state.info.longitude, state.info.latitude],
+        position: state.info.coordinates,
       });
     }
   } catch (e) {
@@ -278,7 +285,7 @@ const onClickDeleteMapElement = async () => {
 
 // 点击地图位置重置
 const onClickMapLocationReset = () => {
-  const markerPosition = [state.info.longitude, state.info.latitude];
+  const markerPosition = state.info.coordinates;
   const map: any = state.map;
   map.setCenter(markerPosition);
   map.setZoom(17);
@@ -316,6 +323,7 @@ const onClickSelected = async (id: string) => {
     picture_time: '',
     longitude: '',// 经度
     latitude: '',// 纬度
+    coordinates: [],
   }
   await init()
 }

+ 1 - 1
Web/src/pages/page-web/projects/media/detail/components/Search.vue

@@ -89,7 +89,7 @@ const formModel = reactive({
   rangeDate: [],
   media_type: undefined,
   device_name: undefined,
-  search_info: '',
+  search_info: undefined,
 })
 
 const state = reactive({

+ 10 - 12
Web/src/pages/page-web/projects/media/detail/index.vue

@@ -147,12 +147,12 @@ const paginationConfig = reactive({
   }
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const dirId = router.currentRoute.value.params?.id;
     const res = await apis.fetchFileListByFolder(dirId as string, {
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize,
     });
@@ -258,18 +258,19 @@ const onClickBatchDelete = async () => {
     id: canDeleteList.map(item => item.file_id).join(',')
   }
   await apis.batchDeletePicture(data);
-  await fetchList(state.query)
+  await fetchList()
 }
 
 // 点击搜索
 const onClickSearch = async (query: any) => {
   state.query = query;
-  await fetchList(query);
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击返回
@@ -292,16 +293,14 @@ const onClickLookFile = (record: any) => {
 const fileInfoOnClickClose = async () => {
   state.fileId = '';
   state.fileInfoVisible = false;
-  const query = state.query;
-  await fetchList(query);
+  await fetchList();
 }
 
 // 点击在地图上加载
 const onClickCreateMapElement = async (id: string) => {
   try {
     await apis.createMapElement(id);
-    const query = state.query;
-    await fetchList(query);
+    await fetchList();
     message.success('在地图上加载成功');
   } catch (e: any) {
     console.error(e);
@@ -312,8 +311,7 @@ const onClickCreateMapElement = async (id: string) => {
 const onClickDeleteMapElement = async (id: string) => {
   try {
     await apis.deleteMapElement(id);
-    const query = state.query;
-    await fetchList(query);
+    await fetchList();
     message.success('在地图上取消加载成功');
   } catch (e: any) {
     console.error(e);
@@ -329,7 +327,7 @@ const onClickRechristen = (record: any) => {
 const onClickSave = async (record: any) => {
   delete state.editableData[record.file_id];
   await apis.updateFileName(record.file_id, { file_name: record.file_name })
-  await fetchList(state.query);
+  await fetchList();
 }
 
 // 点击删除

+ 8 - 4
Web/src/pages/page-web/projects/media/index/index.vue

@@ -91,6 +91,7 @@ import { downloadFile } from '/@/utils/common';
 import moment from 'moment';
 
 interface State {
+  query: any,
   listLoading: boolean,
   list: any[],
   selectedRowKeys: string[],
@@ -99,6 +100,7 @@ interface State {
 };
 
 const state: State = reactive({
+  query: undefined,
   listLoading: false,
   list: [],
   selectedRowKeys: [],
@@ -123,11 +125,11 @@ const paginationConfig = reactive({
   }
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const res = await apis.fetchMediaFileList({
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize,
     });
@@ -256,12 +258,14 @@ const onClickBatchDownload = async () => {
 
 // 点击搜索
 const onClickSearch = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击文件夹

+ 3 - 4
Web/src/pages/page-web/projects/member/components/Search.vue

@@ -7,8 +7,8 @@
     </a-col>
     <a-col>
       <a-form ref="formRef" layout="inline" :model="formModel" :colon="false">
-        <a-form-item name="keyword">
-          <a-input style="width: 200px;" placeholder="用户名称" v-model:value="formModel.keyword" />
+        <a-form-item name="search_info">
+          <a-input style="width: 200px;" placeholder="用户名称" v-model:value="formModel.search_info" />
         </a-form-item>
         <a-form-item>
           <a-button style="margin-right: 10px;" @click="handleClicSekarch">
@@ -44,8 +44,7 @@ const props = withDefaults(defineProps<Props>(), {
 const formRef = ref();
 
 const formModel = reactive({
-  device_name: undefined,
-  keyword: '',
+  search_info: undefined,
 })
 
 // 点击查询

+ 16 - 13
Web/src/pages/page-web/projects/member/index.vue

@@ -3,7 +3,7 @@
     <Search :onClickAddUser="onClickAddUser" :onClickSearch="onClickSearch" :onClickReset="onClickReset" />
     <div class="mediaList-table">
       <a-table :scroll="{ x: '100%', y: 500 }" rowKey="user_id" :loading="state.listLoading" :columns="columns"
-        @change="refreshData" :rowClassName="rowClassName" :dataSource="state.list" :pagination="paginationConfig">
+        :rowClassName="rowClassName" :dataSource="state.list" :pagination="paginationConfig">
         <!-- 操作 -->
         <template #action="{ record }">
           <a-tooltip title="显示密码" v-if="!record.password">
@@ -60,14 +60,22 @@ const paginationConfig = reactive({
   showSizeChanger: true,
   pageSize: 20,
   current: 1,
-  total: 0
+  total: 0,
+  onChange: async (current: number) => {
+    paginationConfig.current = current;
+    await fetchList();
+  },
+  onShowSizeChange: async (current: number, pageSize: number) => {
+    paginationConfig.pageSize = pageSize;
+    await fetchList();
+  }
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const res = await getAllUsersInfo(getWorkspaceId(), {
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize,
     });
@@ -141,12 +149,6 @@ const rowClassName = (record: any, index: number) => {
   return className.toString().replaceAll(',', ' ')
 }
 
-const refreshData = async (page: any) => {
-  paginationConfig.current = page?.current!
-  paginationConfig.pageSize = page?.pageSize!
-  await fetchList();
-}
-
 // 点击添加飞行员
 const onClickAddUser = () => {
   state.visible = true;
@@ -156,7 +158,7 @@ const onClickAddUser = () => {
 const addModalOnClickConfirm = async (data: any) => {
   state.visible = false;
   await apis.AddPilot(data);
-  await fetchList(state.query)
+  await fetchList()
 }
 
 // 添加飞行员弹出层-点击取消
@@ -167,12 +169,13 @@ const addModalOnClickCancel = () => {
 // 点击搜索
 const onClickSearch = async (query: any) => {
   state.query = query;
-  await fetchList(query);
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击查看密码

+ 8 - 4
Web/src/pages/page-web/projects/trajectory/index.vue

@@ -28,11 +28,13 @@ import { wgs84togcj02 } from '/@/vendors/coordtransform'
 const store = useMyStore()
 
 interface State {
+  query: any,
   listLoading: boolean,
   list: any[],
 };
 
 const state: State = reactive({
+  query: undefined,
   listLoading: false,
   list: [],
 });
@@ -46,11 +48,11 @@ const paginationConfig = reactive({
   total: 0
 })
 
-const fetchList = async (query?: any) => {
+const fetchList = async () => {
   state.listLoading = true;
   try {
     const res = await apis.fetchTrajectoryList({
-      ...query,
+      ...state.query,
       page: paginationConfig.current,
       page_size: paginationConfig.pageSize
     });
@@ -150,12 +152,14 @@ const refreshData = async (page: any) => {
 
 // 点击搜索
 const onClickSearch = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击重置
 const onClickReset = async (query: any) => {
-  await fetchList(query);
+  state.query = query;
+  await fetchList();
 }
 
 // 点击查看轨迹