Browse Source

Merge branch 'feature-迪维-dsx' into test

dengsixing 1 năm trước cách đây
mục cha
commit
4092a3afd7

+ 43 - 5
src/main/java/com/fdkankan/openApi/controller/www/SceneMarkShapeController.java

@@ -4,6 +4,9 @@ import cn.dev33.satoken.annotation.SaIgnore;
 import com.fdkankan.openApi.aop.RedisLimit;
 import com.fdkankan.openApi.aop.ValidateApi;
 import com.fdkankan.openApi.controller.BaseController;
+import com.fdkankan.openApi.dto.SceneJsonDTO;
+import com.fdkankan.openApi.dto.SceneMarkShapesDTO;
+import com.fdkankan.openApi.service.www.ISceneMarkShapeBoxService;
 import com.fdkankan.openApi.service.www.ISceneMarkShapeService;
 import com.fdkankan.openApi.vo.www.SceneMarkShapeParamVO;
 import com.fdkankan.openApi.vo.www.SceneMarkShapeVO;
@@ -11,10 +14,10 @@ import com.fdkankan.web.response.ResultData;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
 /**
  * <p>
  *  标注信息前端控制器
@@ -30,6 +33,8 @@ public class SceneMarkShapeController extends BaseController
 {
     @Autowired
     private ISceneMarkShapeService sceneMarkShapeService;
+    @Autowired
+    private ISceneMarkShapeBoxService sceneMarkShapeBoxService;
 
     /**
      * 根据场景码和图片名称获取数据
@@ -50,9 +55,42 @@ public class SceneMarkShapeController extends BaseController
     @PostMapping("/saveOrEdit")
     @RedisLimit(limitCount = 100, period = 1)
     @ValidateApi(method = "scene:saveOrEdit")
-    public ResultData saveOrEdit(@RequestBody  @Validated  SceneMarkShapeVO param) {
+    public ResultData saveOrEdit(@RequestBody @Validated SceneMarkShapeVO param) {
         this.checkScene(param.getNum());
         return sceneMarkShapeService.saveOrEdit(param);
     }
 
+    /**
+     *
+     */
+    @SaIgnore
+    @RedisLimit(limitCount = 100, period = 1)
+    @PostMapping("/planeCovert")
+    @ValidateApi(method = "scene:planeCovert")
+    public ResultData planeCovert(@RequestBody @Valid SceneMarkShapesDTO param) {
+        this.checkScene(param.getNum());
+        sceneMarkShapeService.saveOrEditBatch(param);
+        sceneMarkShapeBoxService.planeCovert(param.getNum());
+        return ResultData.ok();
+    }
+
+    @SaIgnore
+    @RedisLimit(limitCount = 100, period = 1)
+    @PostMapping("/saveExternalBoxes")
+    @ValidateApi(method = "scene:saveExternalBoxes")
+    public ResultData saveExternalBoxes(@RequestBody @Valid SceneJsonDTO param) {
+        this.checkScene(param.getNum());
+        sceneMarkShapeBoxService.saveExternalBox(param);
+        return ResultData.ok();
+    }
+
+
+    @SaIgnore
+    @GetMapping("/getShapBox")
+    @ValidateApi(method = "scene:getShapBox")
+    public ResultData getShapBox(@RequestParam("num") String num) {
+        this.checkScene(num);
+        return ResultData.ok(sceneMarkShapeBoxService.getShapBox(num));
+    }
+
 }

+ 24 - 0
src/main/java/com/fdkankan/openApi/dto/SceneJsonDTO.java

@@ -0,0 +1,24 @@
+package com.fdkankan.openApi.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.openApi.vo.BaseSceneParamVo;
+import lombok.Data;
+import lombok.NonNull;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class SceneJsonDTO {
+
+    @NotBlank(message = "场景码不能为空")
+    private String num;
+
+    @NotEmpty(message = "数据不能为空")
+    private List<JSONObject> data;
+
+
+
+}

+ 38 - 0
src/main/java/com/fdkankan/openApi/dto/SceneMarkShapeBoxPostDTO.java

@@ -0,0 +1,38 @@
+package com.fdkankan.openApi.dto;
+
+import com.fdkankan.openApi.entity.www.SceneMarkShape;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/1/19
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneMarkShapeBoxPostDTO {
+
+    /**
+     * 场景码
+     */
+    @NotBlank(message = "场景码不能为空")
+    private String sceneNum;
+
+    /**
+     * 图片名称路径
+     */
+    private List<SceneMarkShape> imgBoxsList;
+
+
+}

+ 48 - 0
src/main/java/com/fdkankan/openApi/dto/SceneMarkShapeDTO.java

@@ -0,0 +1,48 @@
+package com.fdkankan.openApi.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 场景标记多边形识别数据
+ * </p>
+ *
+ * @author Xiewj
+ * @date 2023/3/30
+ */
+@Data
+public class SceneMarkShapeDTO {
+
+      /**
+       * 主键
+       */
+      private Long id;
+
+      @NotNull(message = "版本号不能为空")
+      private String version;
+
+      @NotEmpty(message = "标注数据不能为空")
+      private List<JSONObject> shapes;
+
+      @NotBlank(message = "场景路径图片名称不能为空")
+      private String imagePath;
+      @NotNull(message = "图片尺寸不能为空")
+      private Integer imageHeight;
+      @NotNull(message = "图片尺寸不能为空")
+      private Integer imageWidth;
+
+      private String num;
+
+      private Date createTime;
+
+      private Date updateTime;
+
+
+}

+ 29 - 0
src/main/java/com/fdkankan/openApi/dto/SceneMarkShapesDTO.java

@@ -0,0 +1,29 @@
+package com.fdkankan.openApi.dto;
+
+import com.fdkankan.openApi.vo.www.SceneMarkShapeVO;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * <p>
+ * 场景标记多边形识别数据
+ * </p>
+ *
+ * @author Xiewj
+ * @date 2023/3/30
+ */
+@Data
+public class SceneMarkShapesDTO {
+
+
+      @NotNull(message = "场景码不能为空")
+      private String num;
+
+      @NotEmpty(message = "list不能为空")
+      private List<SceneMarkShapeDTO> list;
+
+
+}

+ 57 - 0
src/main/java/com/fdkankan/openApi/entity/www/SceneMarkShapeBox.java

@@ -0,0 +1,57 @@
+package com.fdkankan.openApi.entity.www;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 场景标记多边形识别数据
+ * </p>
+ *
+ * @author Xiewj
+ * @date 2023/3/30
+ */
+@Data
+@TableName(value = "t_scene_mark_shape_box",autoResultMap = true)
+@Accessors(chain = true)
+public class SceneMarkShapeBox implements Serializable {
+
+      /**
+       * 主键
+       */
+      @TableId(value = "id", type = IdType.AUTO)
+      private Long id;
+
+      @TableField(typeHandler = FastjsonTypeHandler.class, value = "boxes")
+      private List<JSONObject> boxes;
+
+      @TableField(typeHandler = FastjsonTypeHandler.class, value = "bounding_box")
+      private JSONObject boundingBox;
+
+      @TableField("scene_num")
+      private String sceneNum;
+
+      @TableField("create_time")
+      private Date createTime;
+
+      @TableField("update_time")
+      private Date updateTime;
+
+      /**
+       * 记录的状态,A: 生效,I: 禁用
+       */
+      @TableField("rec_status")
+      @TableLogic(value = "A", delval = "I")
+      private String recStatus;
+
+      //第三方
+      @TableField(typeHandler = FastjsonTypeHandler.class, value = "external_boxes")
+      private List<JSONObject> externalBoxes;
+}

+ 2 - 1
src/main/java/com/fdkankan/openApi/exception/OpenApiGlobalExceptionHandler.java

@@ -36,6 +36,7 @@ public class OpenApiGlobalExceptionHandler extends GlobalExceptionHandler {
     @ResponseStatus(HttpStatus.BAD_REQUEST) // 这里非常关键,这是修改的状态吗
     public ResultData ApiBusinessExceptionHandler(ApiBusinessException e) {
         log.error("业务异常code:{},message:{}", e.getCode(), e.getMessage());
-        return ResultData.error(e.getCode(), e.getMessage());
+        ResultData error = ResultData.error(e.getCode(), e.getMessage());
+        return error;
     }
 }

+ 21 - 0
src/main/java/com/fdkankan/openApi/httpclient/client/ShapesBoxClient.java

@@ -0,0 +1,21 @@
+package com.fdkankan.openApi.httpclient.client;
+
+
+import com.dtflys.forest.annotation.JSONBody;
+import com.dtflys.forest.annotation.Post;
+import com.dtflys.forest.annotation.Var;
+import com.fdkankan.web.response.ResultData;
+
+public interface ShapesBoxClient {
+
+
+    /**
+     * 在方法上加上@DownloadFile注解
+     * dir属性表示文件下载到哪个目录
+     * filename属性表示文件下载成功后以什么名字保存,如果不填,这默认从URL中取得文件名
+     * OnProgress参数为监听上传进度的回调函数
+     */
+
+    @Post("${url}")
+    ResultData post(@Var("url") String url,@JSONBody String body);
+}

+ 7 - 0
src/main/java/com/fdkankan/openApi/mapper/www/IMarkShapeMapper.java

@@ -3,8 +3,12 @@ package com.fdkankan.openApi.mapper.www;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fdkankan.openApi.entity.www.SceneMarkShape;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+import java.util.Set;
+
 /**
  * @author Xiewj
  * @date 2021/11/22
@@ -12,5 +16,8 @@ import org.springframework.stereotype.Component;
 @Mapper
 @Component("MarkShapeMapper")
 public interface IMarkShapeMapper extends BaseMapper<SceneMarkShape> {
+
+    List<SceneMarkShape> selectByNumAndImagePaths(@Param("num")String num, @Param("imagePaths") Set<String> imagePaths);
+
 }
 

+ 16 - 0
src/main/java/com/fdkankan/openApi/mapper/www/MarkShapeBoxMapper.java

@@ -0,0 +1,16 @@
+package com.fdkankan.openApi.mapper.www;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.openApi.entity.www.SceneMarkShapeBox;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Xiewj
+ * @date 2023-8-31 10:43:49
+ */
+@Mapper
+@Component("MarkShapeBoxMapper")
+public interface MarkShapeBoxMapper extends BaseMapper<SceneMarkShapeBox> {
+}
+

+ 29 - 0
src/main/java/com/fdkankan/openApi/service/www/ISceneMarkShapeBoxService.java

@@ -0,0 +1,29 @@
+package com.fdkankan.openApi.service.www;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.openApi.dto.SceneJsonDTO;
+import com.fdkankan.openApi.entity.www.SceneMarkShapeBox;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Xiewj on 2023年8月31日10:42:44
+ */
+public interface ISceneMarkShapeBoxService extends IService<SceneMarkShapeBox> {
+
+    SceneMarkShapeBox findBySceneNum(String sceneNum);
+
+    SceneMarkShapeBox planeCovert(String sceneNum);
+
+    void saveExternalBox(SceneJsonDTO param);
+
+    Map<String, Object> getShapBox(String num);
+
+//    String covertToShapeBox(String sceneNum);
+}

+ 7 - 0
src/main/java/com/fdkankan/openApi/service/www/ISceneMarkShapeService.java

@@ -2,6 +2,8 @@ package com.fdkankan.openApi.service.www;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.openApi.dto.SceneJsonDTO;
+import com.fdkankan.openApi.dto.SceneMarkShapesDTO;
 import com.fdkankan.openApi.entity.www.SceneMarkShape;
 import com.fdkankan.openApi.vo.www.SceneMarkShapeParamVO;
 import com.fdkankan.openApi.vo.www.SceneMarkShapeReDetectParamVO;
@@ -31,5 +33,10 @@ public interface ISceneMarkShapeService extends IService<SceneMarkShape> {
 
     ResultData saveOrEdit(SceneMarkShapeVO param);
 
+    ResultData saveOrEditBatch(SceneMarkShapesDTO param);
+
     ResultData getShapesInfo(SceneMarkShapeParamVO param);
+
+    List<SceneMarkShape> findByNum(String num);
+
 }

+ 150 - 0
src/main/java/com/fdkankan/openApi/service/www/impl/SceneMarkShapeBoxServiceImpl.java

@@ -0,0 +1,150 @@
+package com.fdkankan.openApi.service.www.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.openApi.dto.SceneJsonDTO;
+import com.fdkankan.openApi.dto.SceneMarkShapeBoxPostDTO;
+import com.fdkankan.openApi.entity.www.SceneMarkShape;
+import com.fdkankan.openApi.entity.www.SceneMarkShapeBox;
+import com.fdkankan.openApi.httpclient.client.ShapesBoxClient;
+import com.fdkankan.openApi.mapper.www.MarkShapeBoxMapper;
+import com.fdkankan.openApi.service.www.ISceneMarkShapeBoxService;
+import com.fdkankan.openApi.service.www.ISceneMarkShapeService;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+
+/**
+ * Created by Xiewj on 2023-8-31 10:44:46
+ */
+@Slf4j
+@Service
+@DS("www")
+public class SceneMarkShapeBoxServiceImpl extends ServiceImpl<MarkShapeBoxMapper, SceneMarkShapeBox> implements ISceneMarkShapeBoxService {
+
+    @Autowired
+    ISceneMarkShapeService sceneMarkShapeService;
+    @Resource
+    ShapesBoxClient shapesBoxClient;
+
+    @Value("${4dkk.nodeService.basePath}")
+    private String planeCovertBasePathUrl;
+    @Value("${4dkk.nodeService.api.planeCovert}")
+    private String planeCovert;
+
+
+//    @Autowired
+//    SceneShapeEnumService sceneShapeEnumService;
+
+    @Override
+    public SceneMarkShapeBox findBySceneNum(String sceneNum) {
+        LambdaQueryWrapper<SceneMarkShapeBox> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(SceneMarkShapeBox::getSceneNum,sceneNum);
+        return getOne(wrapper);
+    }
+
+    @Override
+    public SceneMarkShapeBox planeCovert(String sceneNum) {
+        List<SceneMarkShape> sceneMarkShapes =  sceneMarkShapeService.findByNum(sceneNum);
+        SceneMarkShapeBoxPostDTO sceneMarkShapeBoxPostVO =new SceneMarkShapeBoxPostDTO(sceneNum,sceneMarkShapes);
+        ResultData res = shapesBoxClient.post(planeCovertBasePathUrl + planeCovert, JSONObject.toJSONString(sceneMarkShapeBoxPostVO));
+        log.info("请求node转换服务-{}",res);
+        if (res.getCode()==200){
+            JSONObject resData = (JSONObject)res.getData();
+            SceneMarkShapeBox data= JSONObject.parseObject(resData.toJSONString(),SceneMarkShapeBox.class);
+            SceneMarkShapeBox sceneMarkShapeBox = findBySceneNum(sceneNum);
+            if (ObjectUtil.isNotNull(sceneMarkShapeBox)){
+                log.info("存在shapesBox数据进行替换");
+                sceneMarkShapeBox.setBoxes(data.getBoxes());
+                sceneMarkShapeBox.setBoundingBox(data.getBoundingBox());
+                updateById(sceneMarkShapeBox);
+                return sceneMarkShapeBox;
+            }else {
+                log.info("不存在shapesBox数据进行保存");
+                save(data);
+                return data;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void saveExternalBox(SceneJsonDTO param) {
+        SceneMarkShapeBox sceneMarkShapeBox = this.findBySceneNum(param.getNum());
+        sceneMarkShapeBox.setExternalBoxes(param.getData());
+        this.saveOrUpdate(sceneMarkShapeBox);
+    }
+
+    @Override
+    public Map<String, Object> getShapBox(String num) {
+        SceneMarkShapeBox sceneMarkShapeBox = this.findBySceneNum(num);
+        if(Objects.isNull(sceneMarkShapeBox)){
+            return null;
+        }
+        Map<String, Object> result = new HashMap<>();
+        result.put("boundingBox", sceneMarkShapeBox.getBoundingBox());
+        if(Objects.nonNull(sceneMarkShapeBox.getExternalBoxes())){
+            result.put("boxes", sceneMarkShapeBox.getExternalBoxes());
+        }else {
+            result.put("boxes", sceneMarkShapeBox.getBoxes());
+        }
+        return result;
+    }
+
+    //    @Override
+//    public String covertToShapeBox(String sceneNum) {
+//        SceneMarkShapeBox sceneMarkShapeBox = planeCovert(sceneNum);
+//        if (ObjectUtil.isNotNull(sceneMarkShapeBox)){
+//            JSONObject shapeBox=new JSONObject();
+//            JSONArray decoration=new JSONArray();
+//            List<JSONObject> boxes = sceneMarkShapeBox.getBoxes();
+//            JSONObject boundingBox = sceneMarkShapeBox.getBoundingBox();
+//            JSONArray max = boundingBox.getJSONArray("max");
+//            JSONArray min = boundingBox.getJSONArray("min");
+//            ShapeBoxVO shapeBoxVO=new ShapeBoxVO();
+//            Point3D maxp=new Point3D(max.getDouble(0),max.getDouble(1),max.getDouble(2));
+//            Point3D minp=new Point3D(min.getDouble(0),min.getDouble(1),min.getDouble(2));
+//            shapeBoxVO.setBoundingBox( new ShapeBoxVO.BoundingBox(maxp,minp));
+//            for (JSONObject box : boxes) {
+//                List<CubeUtil.Point> points=new ArrayList<>();
+//                JSONArray pointsJson = box.getJSONArray("points");
+//                for (Object o : pointsJson) {
+//                    JSONArray point = JSONArray.parseArray(JSONObject.toJSON(o).toString());
+//                    points.add(new CubeUtil.Point(point.getDouble(0), point.getDouble(1), point.getDouble(2)));
+//                }
+//                CubeUtil cubeUtil = new CubeUtil(points);
+//                String category=box.getString("category");
+//                JSONArray quaternion=box.getJSONArray("quaternion");
+//                SceneShapeEnum sceneShapeEnum = sceneShapeEnumService.findByClassName(category);
+//                if (ObjectUtil.isNotNull(sceneShapeEnum)){
+//                    cubeUtil.setResource_id(sceneShapeEnum.getResourceId());
+//                    cubeUtil.setType_id(sceneShapeEnum.getTypeId());
+//                }
+//                if (CollectionUtil.isNotEmpty(quaternion)){
+//                    cubeUtil.setQuaternion(quaternion);
+//                }
+//                decoration.add(cubeUtil);
+//            }
+//            if (decoration.size() >0){
+//                shapeBoxVO.setDecoration(decoration);
+//            }
+//            String srcPath = String.format(ConstantFilePath.SCENE_VIEW_DATA_USER,sceneNum) + "shapeBox.json" ;
+//            return fileStorageTemplate.uploadFileBytes(srcPath, JSONObject.toJSONString(shapeBoxVO).getBytes());
+//        }
+//        return "";
+//    }
+}

+ 30 - 4
src/main/java/com/fdkankan/openApi/service/www/impl/SceneMarkShapeServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fdkankan.openApi.service.www.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.ObjectUtil;
@@ -15,6 +16,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.openApi.dto.SceneJsonDTO;
+import com.fdkankan.openApi.dto.SceneMarkShapesDTO;
 import com.fdkankan.openApi.entity.www.SceneMarkShape;
 import com.fdkankan.openApi.mapper.www.IMarkShapeMapper;
 import com.fdkankan.openApi.service.www.ISceneMarkShapeService;
@@ -32,10 +35,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -76,6 +77,23 @@ public class SceneMarkShapeServiceImpl extends ServiceImpl<IMarkShapeMapper, Sce
     }
 
     @Override
+    public ResultData saveOrEditBatch(SceneMarkShapesDTO param) {
+
+        Set<String> imagePaths = param.getList().stream().map(v -> v.getImagePath()).collect(Collectors.toSet());
+        List<SceneMarkShape> sceneMarkShapes = this.baseMapper.selectByNumAndImagePaths(param.getNum(), imagePaths);
+        Map<String, Long> imagePathIdMap = sceneMarkShapes.stream().collect(Collectors.toMap(SceneMarkShape::getImagePath, SceneMarkShape::getId));
+
+        List<SceneMarkShape> sceneMarkShapeList = BeanUtil.copyToList(param.getList(), SceneMarkShape.class);
+        if(CollUtil.isNotEmpty(imagePathIdMap)){
+            sceneMarkShapeList.stream().forEach(v->{
+                v.setId(imagePathIdMap.get(v.getImagePath()));
+            });
+        }
+        return ResultData.ok(this.saveOrUpdateBatch(sceneMarkShapeList));
+    }
+
+
+    @Override
     public ResultData getShapesInfo(SceneMarkShapeParamVO param) {
         SceneMarkShape res=  findByNumAndImagePath(param.getNum(),param.getImagePath());
         SceneMarkShapeVO vo=new SceneMarkShapeVO();
@@ -215,4 +233,12 @@ public class SceneMarkShapeServiceImpl extends ServiceImpl<IMarkShapeMapper, Sce
             save(sceneMarkShape);
         }
     }
+
+    @Override
+    public List<SceneMarkShape> findByNum(String num) {
+        LambdaQueryWrapper<SceneMarkShape> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(SceneMarkShape::getNum,num);
+        return list(wrapper);
+    }
+
 }

+ 20 - 19
src/main/resources/bootstrap-dev.yml

@@ -3,41 +3,42 @@ spring:
     name: 4dkankan-center-openApi
   cloud:
     nacos:
+      server-addr: 120.24.144.164:8848
+      namespace: 4dkankan-v4-dev
       config:
-        server-addr: 192.168.0.47:8848
         file-extension: yaml
-        namespace: 4dkankan-dev
-        extension-configs:
-          - data-id: 4dkankan-center-openApi.yaml
-            group: DEFAULT_GROUP
-            refresh: true
+        namespace: ${spring.cloud.nacos.namespace}
         shared-configs:
-          - data-id: common-db-config.yaml
+          - data-id: dynamic-db-config.yaml
             group: DEFAULT_GROUP
             refresh: true
 
           - data-id: common-redis-config.yaml
             group: DEFAULT_GROUP
             refresh: true
-          
-          #          - data-id: common-mq-config.yaml
-          #            group: DEFAULT_GROUP
-          #            refresh: true
 
-          - data-id: rabbitmq-config.yaml
+          - data-id: common-config.yaml
             group: DEFAULT_GROUP
             refresh: true
 
-          - data-id: other-config.yaml
+          - data-id: common-fyun-config.yaml
             group: DEFAULT_GROUP
             refresh: true
 
-          - data-id: common-upload-config.yaml
+          - data-id: common-rabbitmq-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: forest-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
       discovery:
-        server-addr: 192.168.0.47:8848
-        namespace: 4dkankan-dev
-        metadata:
-          management:
-            context-path: ${server.servlet.context-path}/actuator
+        namespace: ${spring.cloud.nacos.namespace}
+
+
+
+
+
+
+

+ 17 - 0
src/main/resources/mapper/www/SceneMarkShapeMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.openApi.mapper.www.IMarkShapeMapper">
+
+
+    <select id="selectByNumAndImagePaths" resultType="com.fdkankan.openApi.entity.www.SceneMarkShape">
+        select * from t_scene_mark_shape t
+        where t.rec_status = 'A' and t.num = #{num}
+        <if test="imagePaths != null and imagePaths.size > 0">
+            and t.image_path in
+            <foreach collection="imagePaths" item="imagePath" open="(" close=")" separator=",">
+                #{imagePath}
+            </foreach>
+        </if>
+    </select>
+
+</mapper>