欧阳劲驰 преди 2 месеца
родител
ревизия
73c0ca44d4

BIN
libs/aspose-cad-23.9.jar


+ 8 - 1
pom.xml

@@ -328,7 +328,14 @@
             <artifactId>jts-io-common</artifactId>
             <version>1.19.0</version>
         </dependency>
-
+        <!--aspose-cad-->
+        <dependency>
+            <groupId>com.aspose</groupId>
+            <artifactId>aspose-cad</artifactId>
+            <version>23.9</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/libs/aspose-cad-23.9.jar</systemPath>
+        </dependency>
     </dependencies>
 
     <repositories>

+ 150 - 0
src/main/java/com/shkpr/service/alambizplugin/bizservice/GisSurveyCadConvertBizService.java

@@ -0,0 +1,150 @@
+package com.shkpr.service.alambizplugin.bizservice;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.alambizplugin.components.GisSurveyCadConverter;
+import com.shkpr.service.alambizplugin.constants.CadEnum;
+import com.shkpr.service.alambizplugin.constants.GisSurveConvertStatusEnum;
+import com.shkpr.service.alambizplugin.constants.LogFlagBusiType;
+import com.shkpr.service.alambizplugin.dto.GisSurveyCadConvertResult;
+import org.springframework.stereotype.Component;
+import org.springframework.util.concurrent.ListenableFuture;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.time.LocalDateTime;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * cad转换管理service
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Component
+public class GisSurveyCadConvertBizService {
+    /**
+     * 任务缓存
+     */
+    private final static Map<String, ListenableFuture<GisSurveyCadConvertResult>> TASK_CACHE = new ConcurrentHashMap<>();
+    /**
+     * 开始时间缓存
+     */
+    private final static Map<String, LocalDateTime> TIME_CACHE = new ConcurrentHashMap<>();
+    /**
+     * log
+     */
+    private final String mStrClassName;
+    private final String mBizType;
+
+    private final GisSurveyCadConverter cadConverter;
+
+
+    public GisSurveyCadConvertBizService(GisSurveyCadConverter cadConverter) {
+        mStrClassName = "GisSurveyCadConvertBizService";
+        mBizType = LogFlagBusiType.BUSI_GIS_SURVEY.toStrValue();
+        this.cadConverter = cadConverter;
+    }
+
+    /**
+     * ca转换
+     *
+     * @param file       文件
+     * @param convertId  转换id
+     * @param outCadEnum 输出cad类型
+     * @return 转换结果
+     */
+    public GisSurveyCadConvertResult cadConvert(MultipartFile file, String convertId, CadEnum outCadEnum) {
+        //如已有结果,则直接返回
+        GisSurveyCadConvertResult result = getResult(convertId);
+        if (result != null) return result;
+
+        try {
+            //获取输入流
+            InputStream inputStream = file.getInputStream();
+
+            //启动转换
+            startTask(convertId, inputStream, outCadEnum);
+            //返回进行中
+            return GisSurveyCadConvertResult.inProgress(convertId, LocalDateTime.now());
+        } catch (IOException e) {
+            //打印报错信息
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
+                    , String.format("获取输入流失败 转换id:%s error:%s", convertId, e)
+            );
+            return GisSurveyCadConvertResult.fail(convertId);
+        }
+    }
+
+    /**
+     * 获取结果
+     *
+     * @param convertId 转换id
+     * @return 转换结果
+     */
+    public GisSurveyCadConvertResult getResult(String convertId) {
+        //获取已存在的任务
+        ListenableFuture<GisSurveyCadConvertResult> previousFuture = TASK_CACHE.get(convertId);
+
+        //判断完成
+        if (previousFuture != null && previousFuture.isDone()) {
+            try {
+                //获取结果
+                GisSurveyCadConvertResult thirdImportResult = previousFuture.get();
+                //如成功/失败,则直接返回
+                if (Objects.equals(thirdImportResult.getConvertStatus(), GisSurveConvertStatusEnum.FAIL.getCode()) ||
+                        Objects.equals(thirdImportResult.getConvertStatus(), GisSurveConvertStatusEnum.SUCCESS.getCode()))
+                    removeCache(convertId);
+                return thirdImportResult;
+            } catch (InterruptedException | ExecutionException e) {
+                //打印报错信息
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
+                        , String.format("查询转换历史异常 转换id:%s error:%s", convertId, e)
+                );
+                return GisSurveyCadConvertResult.fail(convertId);
+            }
+        }
+
+        //进行中判断(未完成且未清除)
+        if (previousFuture != null && !previousFuture.isDone() && !previousFuture.isCancelled())
+            return GisSurveyCadConvertResult.inProgress(convertId, TIME_CACHE.get(convertId));
+
+        return null;
+    }
+
+    /**
+     * 启动任务
+     *
+     * @param convertId   转换id
+     * @param inputStream 文件输入流
+     * @param cadEnum     cad类型
+     */
+    private void startTask(String convertId, InputStream inputStream, CadEnum cadEnum) {
+        //获取已存在的任务
+        ListenableFuture<GisSurveyCadConvertResult> previousFuture = TASK_CACHE.get(convertId);
+        //已结束判断,删除缓存
+        if (previousFuture != null && (previousFuture.isDone() || previousFuture.isCancelled())) {
+            removeCache(convertId);
+        }
+        //异步执行cad转换查任务
+        ListenableFuture<GisSurveyCadConvertResult> checkFuture = cadConverter.cadConvert(convertId, inputStream, cadEnum);
+        //缓存任务句柄
+        TASK_CACHE.put(convertId, checkFuture);
+        //缓存时间
+        TIME_CACHE.put(convertId, LocalDateTime.now());
+    }
+
+    /**
+     * 清除缓存
+     *
+     * @param convertId 转换id
+     */
+    private void removeCache(String convertId) {
+        TASK_CACHE.remove(convertId);
+        TIME_CACHE.remove(convertId);
+    }
+}

+ 40 - 0
src/main/java/com/shkpr/service/alambizplugin/commproperties/GisSurveyCadConvertProperties.java

@@ -0,0 +1,40 @@
+package com.shkpr.service.alambizplugin.commproperties;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+
+/**
+ * cad转换配置
+ *
+ * @author 欧阳劲驰
+ * @since 0.0.1
+ */
+@Getter
+@Setter
+@ConfigurationProperties(prefix = "cad-convert")
+@Component
+public class GisSurveyCadConvertProperties {
+    /**
+     * 文件生命周期
+     */
+    private Duration fileLifecycle;
+
+    /**
+     * 资源路径
+     */
+    private String resourcePath;
+
+    /**
+     * 栅格化最小宽度
+     */
+    private Integer rasterizationMinWidth;
+
+    /**
+     * 栅格化最小高度
+     */
+    private Integer rasterizationMinHeight;
+}

+ 211 - 0
src/main/java/com/shkpr/service/alambizplugin/components/GisSurveyCadConverter.java

@@ -0,0 +1,211 @@
+package com.shkpr.service.alambizplugin.components;
+
+import com.aspose.cad.Image;
+import com.aspose.cad.ImageOptionsBase;
+import com.aspose.cad.fileformats.cad.CadDrawTypeMode;
+import com.aspose.cad.fileformats.cad.CadImage;
+import com.aspose.cad.imageoptions.*;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.alambizplugin.commproperties.GisSurveyCadConvertProperties;
+import com.shkpr.service.alambizplugin.constants.CadEnum;
+import com.shkpr.service.alambizplugin.constants.GisSurveConvertStatusEnum;
+import com.shkpr.service.alambizplugin.constants.LogFlagBusiType;
+import com.shkpr.service.alambizplugin.dto.GisSurveyCadConvertResult;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.AsyncResult;
+import org.springframework.stereotype.Component;
+import org.springframework.util.concurrent.ListenableFuture;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.Duration;
+import java.time.LocalDateTime;
+
+/**
+ * cad转换器
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Component
+public class GisSurveyCadConverter {
+    /**
+     * log
+     */
+    private final String mStrClassName;
+    private final String mBizType;
+
+    private final GisSurveyCadConvertProperties cadConvertProperties;
+
+    public GisSurveyCadConverter(GisSurveyCadConvertProperties cadConvertProperties) {
+        mStrClassName = "GisSurveyCadConverter";
+        mBizType = LogFlagBusiType.BUSI_GIS_SURVEY.toStrValue();
+        this.cadConvertProperties = cadConvertProperties;
+    }
+
+    /**
+     * cad转换
+     *
+     * @param convertId   转换id
+     * @param inputStream 输入流
+     * @param cadEnum     cad类型
+     * @return 文件路径
+     */
+    @Async
+    public ListenableFuture<GisSurveyCadConvertResult> cadConvert(String convertId, InputStream inputStream, CadEnum cadEnum) {
+        //构建返回
+        GisSurveyCadConvertResult result = GisSurveyCadConvertResult.fail(convertId);
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                , String.format(
+                        "开始执行cad转换,读取文件流;转换id:%s 输出类型:%s"
+                        , convertId
+                        , cadEnum.getSuffix()
+                )
+        );
+
+        //读取输入流
+        Image image = CadImage.load(inputStream);
+
+        //导出图像配置
+        ImageOptionsBase options;
+        switch (cadEnum) {
+            case BMP:
+                options = new BmpOptions();
+                break;
+            case CGM:
+                options = new CgmOptions();
+                break;
+            case DICOM:
+                options = new DicomOptions();
+                break;
+            case DWF:
+                options = new DwfOptions();
+                break;
+            case DWG:
+                options = new DwgOptions();
+                break;
+            case DXF:
+                options = new DxfOptions();
+                break;
+            case EMF:
+                options = new EmfOptions();
+                break;
+            case FBX:
+                options = new FbxOptions();
+                break;
+            case GIF:
+                options = new GifOptions();
+                break;
+            case GLTF:
+                options = new GltfOptions();
+                break;
+            case IFC:
+                options = new IfcOptions();
+                break;
+            case JP2:
+                options = new Jpeg2000Options();
+                break;
+            case JPG:
+                options = new JpegOptions();
+                break;
+            case OBJ:
+                options = new ObjOptions();
+                break;
+            case PDF:
+                options = new PdfOptions();
+                break;
+            case PNG:
+                options = new PngOptions();
+                break;
+            case PSD:
+                options = new PsdOptions();
+                break;
+            case STP:
+                options = new StpOptions();
+                break;
+            case SVG:
+                options = new SvgOptions();
+                ((SvgOptions) options).setTextAsShapes(false);
+                ((SvgOptions) options).setUseAbsoluteRescaling(false);
+                ((SvgOptions) options).setRescaleSubpixelLinewidths(false);
+                break;
+            case THREE_DS:
+                options = new ThreeDSOptions();
+                break;
+            case TIFF:
+                options = new TiffOptions();
+                break;
+            case U3D:
+                options = new U3dOptions();
+                break;
+            case WEBP:
+                options = new WebPOptions();
+                break;
+            case WMF:
+                options = new WmfOptions();
+                break;
+            default:
+                return new AsyncResult<>(result);
+        }
+
+        //栅格化选项
+        CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
+        //读取图像宽高
+        rasterizationOptions.setPageWidth(Math.max(image.getWidth(), cadConvertProperties.getRasterizationMinWidth()));
+        rasterizationOptions.setPageHeight(Math.max(image.getHeight(), cadConvertProperties.getRasterizationMinHeight()));
+        //使用原本颜色
+        rasterizationOptions.setDrawType(CadDrawTypeMode.UseObjectColor);
+        //缩放配置
+        rasterizationOptions.setNoScaling(false);
+        rasterizationOptions.setAutomaticLayoutsScaling(true);
+        //质量配置
+        rasterizationOptions.getQuality().setTextThicknessNormalization(true);
+
+        options.setVectorRasterizationOptions(rasterizationOptions);
+
+        try {
+            //文件路径
+            final String fileName = convertId + "." + cadEnum.getSuffix();
+            final Path filePath = Paths.get(cadConvertProperties.getResourcePath() + fileName);
+            //如存在,则删除
+            if (Files.exists(filePath)) Files.delete(filePath);
+
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                    , String.format(
+                            "读取文件流完毕,开始写入文件;转换id:%s 输出类型:%s"
+                            , convertId
+                            , cadEnum.getSuffix()
+                    )
+            );
+            //存至文件
+            image.save(filePath.toString(), options);
+
+            //转换完成
+            result.setConvertStatus(GisSurveConvertStatusEnum.SUCCESS.getCode());
+            result.setCompleteTime(LocalDateTime.now());
+            result.setPath(fileName);
+
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                    , String.format(
+                            "结束执行cad转换;转换id: %s, 转换类型:%s , 用时(毫秒):%d"
+                            , convertId
+                            , cadEnum.getSuffix()
+                            , Duration.between(result.getRequestTime(), result.getCompleteTime()).toMillis()
+                    )
+            );
+
+            return new AsyncResult<>(result);
+        } catch (IOException e) {
+            //打印报错信息
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
+                    , String.format("转换cad异常 转换id:%s error:%s", convertId, e)
+            );
+            return new AsyncResult<>(result);
+        }
+    }
+
+}

+ 9 - 3
src/main/java/com/shkpr/service/alambizplugin/configuration/WebMvcConfiguration.java

@@ -1,6 +1,7 @@
 package com.shkpr.service.alambizplugin.configuration;
 
 import com.shkpr.service.alambizplugin.SpringContextUtil;
+import com.shkpr.service.alambizplugin.commproperties.GisSurveyCadConvertProperties;
 import com.shkpr.service.alambizplugin.commproperties.GisSurveySystemCheckProperties;
 import com.shkpr.service.alambizplugin.constants.ApiURI;
 import com.shkpr.service.alambizplugin.interfaces.URIInterceptorIntef;
@@ -30,11 +31,13 @@ import java.util.TreeMap;
 @Configuration
 @EnableWebMvc
 public class WebMvcConfiguration implements WebMvcConfigurer {
-    final
-    GisSurveySystemCheckProperties systemCheckProperties;
+    private final GisSurveySystemCheckProperties systemCheckProperties;
+    private final GisSurveyCadConvertProperties cadConvertProperties;
 
-    public WebMvcConfiguration(GisSurveySystemCheckProperties systemCheckProperties) {
+    public WebMvcConfiguration(GisSurveySystemCheckProperties systemCheckProperties
+    , GisSurveyCadConvertProperties cadConvertProperties) {
         this.systemCheckProperties = systemCheckProperties;
+        this.cadConvertProperties = cadConvertProperties;
     }
 
     /**
@@ -45,6 +48,9 @@ public class WebMvcConfiguration implements WebMvcConfigurer {
         //系统检查结果映射
         registry.addResourceHandler(ApiURI.URI_GIS_SURVEY_H + "/" + ApiURI.URI_XXX_SYS_CHECK_RESULTS + "/**")
                 .addResourceLocations("file:" + systemCheckProperties.getResourcePath() + "/");
+        //cad转换文件映射
+        registry.addResourceHandler(ApiURI.URI_GIS_SURVEY_H + "/" + ApiURI.URI_XXX_CAD_CONVERT_TEMPS + "/**")
+                .addResourceLocations("file:" + cadConvertProperties.getResourcePath() + "/");
     }
 
     @Override

+ 3 - 0
src/main/java/com/shkpr/service/alambizplugin/constants/ApiURI.java

@@ -32,6 +32,9 @@ public class ApiURI {
     public static final String URI_XXX_THIRD_IMPORT_CANCEL = "third-import-cancel";
     public static final String URI_XXX_THIRD_IMPORT_PREVIEW = "third-import-preview";
     public static final String URI_XXX_THIRD_IMPORT_COMMIT = "third-import-commit";
+    public static final String URI_XXX_CAD_CONVERT = "cad-convert";
+    public static final String URI_XXX_CAD_CONVERT_GET = "cad-convert-get";
+    public static final String URI_XXX_CAD_CONVERT_TEMPS = "cad-convert-temps";
 
     public static final String URI_ACCESS_TOKEN_CHECK = "/kpr-plugin/apply/access-token-check";
     public static final String URI_FILE_BUSI_XXX = "/files/**";

+ 81 - 0
src/main/java/com/shkpr/service/alambizplugin/constants/CadEnum.java

@@ -0,0 +1,81 @@
+package com.shkpr.service.alambizplugin.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * cad枚举
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Getter
+@AllArgsConstructor
+public enum CadEnum {
+    // 输入专用格式 (CAD/BIM)
+    DWT("dwt", true, false),
+    DGN("dgn", true, false),
+    DWFX("dwfx", true, false),
+    STL("stl", true, false),
+    IGES("iges", true, false),
+    PLT("plt", true, false),
+    CF2("cf2", true, false),
+    HPGL("hpg", true, false),
+    IGS("igs", true, false),
+
+    // 双用途格式
+    DWG("dwg", true, false),
+    DXF("dxf", true, true),
+    IFC("ifc", true, true),
+    OBJ("obj", true, true),
+    THREE_DS("3ds", true, true),
+    U3D("u3d", true, true),
+
+    // 输出专用格式 (光栅/矢量)
+    BMP("bmp", false, true),
+    CGM("cgm", false, true),
+    DICOM("dcm", false, true),
+    DWF("dwf", false, true),
+    EMF("emf", false, true),
+    FBX("fbx", false, true),
+    GIF("gif", false, true),
+    GLTF("gltf", false, true),
+    JP2("jp2", false, true),
+    JPG("jpg", false, true),
+    PDF("pdf", false, true),
+    PNG("png", false, true),
+    PSD("psd", false, true),
+    STP("stp", false, true),
+    SVG("svg", false, true),
+    TIFF("tiff", false, true),
+    WEBP("webp", false, true),
+    WMF("wmf", false, true);
+
+    /**
+     * 文件后缀
+     */
+    private final String suffix;
+    /**
+     * 输入
+     */
+    private final Boolean input;
+    /**
+     * 输出
+     */
+    private final Boolean output;
+
+    /**
+     * 根据扩展名获取枚举
+     *
+     * @param extension 扩展名
+     * @return cad枚举
+     */
+    public static CadEnum getCadEnum(String extension) {
+        if (StringUtils.isBlank(extension)) return null;
+        //匹配后缀名
+        for (CadEnum cad : CadEnum.values())
+            if (cad.getSuffix().equalsIgnoreCase(extension)) return cad;
+        return null;
+    }
+}

+ 35 - 0
src/main/java/com/shkpr/service/alambizplugin/constants/GisSurveConvertStatusEnum.java

@@ -0,0 +1,35 @@
+package com.shkpr.service.alambizplugin.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * cad转换状态枚举
+ *
+ * @author 欧阳劲驰
+ * @serial 1.0.0
+ */
+@AllArgsConstructor
+@Getter
+public enum GisSurveConvertStatusEnum {
+    /**
+     * 进行中
+     */
+    IN_PROGRESS(0),
+    /**
+     * 成功
+     */
+    SUCCESS(1),
+    /**
+     * 失败
+     */
+    FAIL(2),
+    /**
+     * 不存在
+     */
+    NOT_EXISTS(3);
+    /**
+     * code
+     */
+    private final Integer code;
+}

+ 4 - 0
src/main/java/com/shkpr/service/alambizplugin/constants/ResponseCode.java

@@ -104,6 +104,10 @@ public enum ResponseCode {
     RESULT_THIRD_IMPORT_NOT_FOUND(40011, "Third import not found."),
     RESULT_THIRD_IMPORT_CANCEL_FAILED(40012, "Third import cancel failed."),
 
+    RESULT_ASYNC_TASK_FAILED(40010, "Async task failed."),
+    RESULT_ASYNC_TASK_NOT_FOUND(40011, "Asyn task not found."),
+    RESULT_ASYNC_TASK_CANCEL_FAILED(40012, "Async task cancel failed."),
+
     BUSINESS_SYNC_FUN_FAILED(65529,"The Synch operation failed."),
     BUSINESS_DB_REQ_FAILED(65530,"The DB operation failed."),
     BUSINESS_API_ABOLISH(65531,"The Api has been abolished."),

+ 187 - 1
src/main/java/com/shkpr/service/alambizplugin/controller/ApiGisSurveyController.java

@@ -4,10 +4,13 @@ import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
 import com.shkpr.service.alambizplugin.apiparam.GisSurveyCheckParams;
 import com.shkpr.service.alambizplugin.apiparam.GisSurveyThirdImportParams;
+import com.shkpr.service.alambizplugin.bizservice.GisSurveyCadConvertBizService;
 import com.shkpr.service.alambizplugin.bizservice.GisSurveySystemCheckBizService;
 import com.shkpr.service.alambizplugin.bizservice.GisSurveyThirdImportBizService;
 import com.shkpr.service.alambizplugin.commtools.CommTool;
 import com.shkpr.service.alambizplugin.constants.ApiURI;
+import com.shkpr.service.alambizplugin.constants.CadEnum;
+import com.shkpr.service.alambizplugin.constants.GisSurveConvertStatusEnum;
 import com.shkpr.service.alambizplugin.constants.GisSurveyCheckStatusEnum;
 import com.shkpr.service.alambizplugin.constants.GisSurveyImportStatusEnum;
 import com.shkpr.service.alambizplugin.constants.LogFlagBusiType;
@@ -16,6 +19,7 @@ import com.shkpr.service.alambizplugin.controllerfilter.TokenAuthenticationServi
 import com.shkpr.service.alambizplugin.controllervalid.CommonParamValidSK;
 import com.shkpr.service.alambizplugin.dbdao.services.GisSurveyLayerApplyThirdCopyServiceImpl;
 import com.shkpr.service.alambizplugin.dbdao.services.intef.GisSurveyLayerApplyService;
+import com.shkpr.service.alambizplugin.dto.GisSurveyCadConvertResult;
 import com.shkpr.service.alambizplugin.dto.GisSurveyLayerApplyThirdCopy;
 import com.shkpr.service.alambizplugin.dto.GisSurveySystemCheckResult;
 import com.shkpr.service.alambizplugin.dto.GisSurveyThirdImportResult;
@@ -55,14 +59,18 @@ public class ApiGisSurveyController {
     private final AtomicInteger mSeqThirdImportCancelReq;
     private final AtomicInteger mSeqThirdImportPreviewReq;
     private final AtomicInteger mSeqThirdImportCommitReq;
+    private final AtomicInteger mSeqCadConvertReq;
+    private final AtomicInteger mSeqCadConvertResultReq;
 
     private final GisSurveySystemCheckBizService systemCheckBizService;
     private final GisSurveyThirdImportBizService thirdImportBizService;
+    private final GisSurveyCadConvertBizService cadConvertBizService;
     private final GisSurveyLayerApplyService layerApplyService;
     private final GisSurveyLayerApplyThirdCopyServiceImpl layerApplyThirdCopyService;
 
     public ApiGisSurveyController(GisSurveySystemCheckBizService systemCheckBizService
-            , GisSurveyThirdImportBizService thirdImportBizService, GisSurveyLayerApplyService layerApplyService
+            , GisSurveyThirdImportBizService thirdImportBizService, GisSurveyCadConvertBizService cadConvertBizService
+            , GisSurveyLayerApplyService layerApplyService
             , GisSurveyLayerApplyThirdCopyServiceImpl layerApplyThirdCopyService) {
         mStrClassName = "ApiGisSurveyController";
         mBizType = LogFlagBusiType.BUSI_GIS_SURVEY.toStrValue();
@@ -72,8 +80,11 @@ public class ApiGisSurveyController {
         mSeqThirdImportCancelReq = new AtomicInteger(0);
         mSeqThirdImportPreviewReq = new AtomicInteger(0);
         mSeqThirdImportCommitReq = new AtomicInteger(0);
+        mSeqCadConvertReq = new AtomicInteger(0);
+        mSeqCadConvertResultReq = new AtomicInteger(0);
         this.systemCheckBizService = systemCheckBizService;
         this.thirdImportBizService = thirdImportBizService;
+        this.cadConvertBizService = cadConvertBizService;
         this.layerApplyService = layerApplyService;
         this.layerApplyThirdCopyService = layerApplyThirdCopyService;
     }
@@ -491,4 +502,179 @@ public class ApiGisSurveyController {
                         , resResult.getTimestamp() - llReqBefore));
         return resResult;
     }
+
+    /**
+     * 执行cad转换
+     *
+     * @param request         request
+     * @param strClientType   客户端类型
+     * @param strUserAgent    用户信息
+     * @param file            文件
+     * @param convertId       转换id
+     * @param outputExtension 输出扩展名
+     * @return cad转换结果
+     */
+    @PostMapping(value = ApiURI.URI_XXX_CAD_CONVERT)
+    public ResponseRes<GisSurveyCadConvertResult> cadConvert(HttpServletRequest request
+            , @RequestHeader(value = ApiURI.HEADER_CLIENT_TYPE, required = false) String strClientType
+            , @RequestHeader(value = ApiURI.HEADER_USER_AGENT, required = false) String strUserAgent
+            , @RequestParam(value = "file", required = false) MultipartFile file
+            , @RequestParam(value = "convertId", required = false) String convertId
+            , @RequestParam(value = "outputExtension", required = false) String outputExtension) throws SelfException {
+        //入参校验
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        final String strUserId = (String) request.getAttribute(TokenAuthenticationService.HEADER_USERID);
+        if (StringUtils.isAnyBlank(convertId) || StringUtils.length(convertId) > 64) {
+            throw new SelfException(ResponseCode.STATUS_ERROR_PARAM_FORMAT.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.STATUS_ERROR_PARAM_FORMAT.toStrMsg()));
+        }
+        //文件校验
+        if (file == null || file.isEmpty()) {
+            throw new SelfException(ResponseCode.RESULT_FILE_EMPTY_ROWS.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.RESULT_FILE_EMPTY_ROWS.toStrMsg()));
+        }
+        String originalFilename = file.getOriginalFilename();
+        if (originalFilename == null) {
+            throw new SelfException(ResponseCode.RESULT_FILE_EMPTY_ROWS.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.RESULT_FILE_EMPTY_ROWS.toStrMsg()));
+        }
+        //文件类型校验
+        String inputExtension = originalFilename
+                .substring(originalFilename.lastIndexOf(".") + 1)
+                .toLowerCase();
+        CadEnum inputCadEnum = CadEnum.getCadEnum(inputExtension);
+        CadEnum outCadEnum = CadEnum.getCadEnum(outputExtension);
+        if (inputCadEnum == null || outCadEnum == null
+                || !inputCadEnum.getInput() || !outCadEnum.getOutput()) {
+            throw new SelfException(ResponseCode.RESULT_FILE_INVALID_TYPE.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.RESULT_FILE_INVALID_TYPE.toStrMsg()));
+        }
+
+        //begin
+        long llReqBefore = System.currentTimeMillis();
+        String strRunSeq = String.format("%d-%d", llReqBefore, mSeqCadConvertReq.incrementAndGet());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName, strUserId
+                , String.format("%s:%s seq:{%s} param:%s begin====>"
+                        , strPlatform
+                        , URI_PATH
+                        , strRunSeq
+                        , convertId));
+
+        //构建result
+        ResponseRes<GisSurveyCadConvertResult> resResult = new ResponseRes<>();
+        resResult.setRescode(ResponseCode.RESULT_ASYNC_TASK_FAILED.toStrCode());
+        resResult.setResmsg(ResponseCode.RESULT_ASYNC_TASK_FAILED.toStrMsg());
+
+        //执行cad转换
+        GisSurveyCadConvertResult result = cadConvertBizService.cadConvert(file, convertId, outCadEnum);
+
+        //执行成功
+        if (result != null && !Objects.equals(result.getConvertStatus(), GisSurveConvertStatusEnum.FAIL.getCode())) {
+            resResult.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+            resResult.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
+            resResult.setResdata(result);
+        }
+        //执行失败
+        if (result != null && Objects.equals(result.getConvertStatus(), GisSurveConvertStatusEnum.FAIL.getCode())) {
+            resResult.setResdata(result);
+        }
+
+        //end
+        resResult.setTimestamp(System.currentTimeMillis());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName, strUserId
+                , String.format("%s:%s seq:{%s} rescode:{%s} resmsg:{%s} time:{%d ms} end<===="
+                        , strPlatform
+                        , URI_PATH
+                        , strRunSeq
+                        , resResult.getRescode()
+                        , resResult.getResmsg()
+                        , resResult.getTimestamp() - llReqBefore));
+        return resResult;
+    }
+
+    /**
+     * 获取cad转换结果
+     *
+     * @param request       request
+     * @param strClientType 客户端类型
+     * @param strUserAgent  用户信息
+     * @param convertId     转换id
+     * @return cad转换结果
+     */
+    @GetMapping(value = ApiURI.URI_XXX_CAD_CONVERT_GET)
+    public ResponseRes<GisSurveyCadConvertResult> cadConvertResult(HttpServletRequest request
+            , @RequestHeader(value = ApiURI.HEADER_CLIENT_TYPE, required = false) String strClientType
+            , @RequestHeader(value = ApiURI.HEADER_USER_AGENT, required = false) String strUserAgent
+            , @RequestParam(value = "convertId", required = false) String convertId) throws SelfException {
+        //入参校验
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        final String strUserId = (String) request.getAttribute(TokenAuthenticationService.HEADER_USERID);
+        if (StringUtils.isAnyBlank(convertId) || StringUtils.length(convertId) > 64) {
+            throw new SelfException(ResponseCode.STATUS_ERROR_PARAM_FORMAT.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.STATUS_ERROR_PARAM_FORMAT.toStrMsg()));
+        }
+
+        //begin
+        long llReqBefore = System.currentTimeMillis();
+        String strRunSeq = String.format("%d-%d", llReqBefore, mSeqCadConvertResultReq.incrementAndGet());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName, strUserId
+                , String.format("%s:%s seq:{%s} param:%s begin====>"
+                        , strPlatform
+                        , URI_PATH
+                        , strRunSeq
+                        , convertId));
+
+        //构建result
+        ResponseRes<GisSurveyCadConvertResult> resResult = new ResponseRes<>();
+        resResult.setRescode(ResponseCode.RESULT_ASYNC_TASK_FAILED.toStrCode());
+        resResult.setResmsg(ResponseCode.RESULT_ASYNC_TASK_FAILED.toStrMsg());
+
+        //执行cad转换
+        GisSurveyCadConvertResult result = cadConvertBizService.getResult(convertId);
+
+        //执行成功
+        if (result != null && !Objects.equals(result.getConvertStatus(), GisSurveConvertStatusEnum.FAIL.getCode())) {
+            resResult.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+            resResult.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
+            resResult.setResdata(result);
+        }
+        //执行失败
+        if (result != null && Objects.equals(result.getConvertStatus(), GisSurveConvertStatusEnum.FAIL.getCode())) {
+            resResult.setResdata(result);
+        }
+        //不存在
+        if (result == null) {
+            resResult.setRescode(ResponseCode.RESULT_ASYNC_TASK_NOT_FOUND.toStrCode());
+            resResult.setResmsg(ResponseCode.RESULT_ASYNC_TASK_NOT_FOUND.toStrMsg());
+        }
+
+        //end
+        resResult.setTimestamp(System.currentTimeMillis());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName, strUserId
+                , String.format("%s:%s seq:{%s} rescode:{%s} resmsg:{%s} time:{%d ms} end<===="
+                        , strPlatform
+                        , URI_PATH
+                        , strRunSeq
+                        , resResult.getRescode()
+                        , resResult.getResmsg()
+                        , resResult.getTimestamp() - llReqBefore));
+        return resResult;
+    }
 }

+ 8 - 7
src/main/java/com/shkpr/service/alambizplugin/controllerfilter/JWTAuthenticationFilter.java

@@ -63,13 +63,14 @@ public class JWTAuthenticationFilter extends BasicAuthenticationFilter {
             return;
         }
 
-        //系统检查结果放行
-        if (this.mPathMatcher != null &&
-                this.mPathMatcher.match(
-                        String.format("%s%s", request.getContextPath(), ApiURI.URI_GIS_SURVEY_H + "/" + ApiURI.URI_XXX_SYS_CHECK_RESULTS + "/**"),
-                        request.getRequestURI()
-                )
-        ) {
+        //文件映射放行
+        if (this.mPathMatcher != null && (this.mPathMatcher.match(
+                String.format("%s%s", request.getContextPath(), ApiURI.URI_GIS_SURVEY_H + "/" + ApiURI.URI_XXX_SYS_CHECK_RESULTS + "/**"),
+                request.getRequestURI())
+                || this.mPathMatcher.match(
+                String.format("%s%s", request.getContextPath(), ApiURI.URI_GIS_SURVEY_H + "/" + ApiURI.URI_XXX_CAD_CONVERT_TEMPS + "/**"),
+                request.getRequestURI())
+        )) {
             chain.doFilter(request, response);
             return;
         }

+ 2 - 0
src/main/java/com/shkpr/service/alambizplugin/controllerfilter/third/ApiJWTGisSurveyBizFilter.java

@@ -26,6 +26,8 @@ public class ApiJWTGisSurveyBizFilter extends JWTAuthenticationFilter {
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_GIS_SURVEY_H, ApiURI.URI_XXX_THIRD_IMPORT_CANCEL), "GET");
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_GIS_SURVEY_H, ApiURI.URI_XXX_THIRD_IMPORT_PREVIEW), "GET");
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_GIS_SURVEY_H, ApiURI.URI_XXX_THIRD_IMPORT_COMMIT), "GET");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_GIS_SURVEY_H, ApiURI.URI_XXX_CAD_CONVERT), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_GIS_SURVEY_H, ApiURI.URI_XXX_CAD_CONVERT_GET), "GET");
     }
 
     public ApiJWTGisSurveyBizFilter(String url, AuthenticationManager authenticationManager){

+ 76 - 0
src/main/java/com/shkpr/service/alambizplugin/dto/GisSurveyCadConvertResult.java

@@ -0,0 +1,76 @@
+package com.shkpr.service.alambizplugin.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.shkpr.service.alambizplugin.constants.GisSurveConvertStatusEnum;
+import com.shkpr.service.alambizplugin.constants.GisSurveyImportStatusEnum;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * cad转换结果
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+public class GisSurveyCadConvertResult {
+    /**
+     * 转换id
+     */
+    private String convertId;
+    /**
+     * 检查状态:0:进行中,1:成功,2:失败,3:不存在
+     */
+    private Integer convertStatus;
+    /**
+     * 结果地址
+     */
+    private String path;
+    /**
+     * 请求检查时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh_CN", timezone = "Asia/Shanghai")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime requestTime;
+    /**
+     * 完成检查时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh_CN", timezone = "Asia/Shanghai")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime completeTime;
+
+    /**
+     * 进行中
+     */
+    public static GisSurveyCadConvertResult inProgress(String convertId, LocalDateTime requestTime) {
+        GisSurveyCadConvertResult result = new GisSurveyCadConvertResult();
+        result.setConvertId(convertId);
+        result.setConvertStatus(GisSurveyImportStatusEnum.IN_PROGRESS.getCode());
+        result.setRequestTime(requestTime);
+        return result;
+    }
+
+    /**
+     * 成功
+     */
+    public static GisSurveyCadConvertResult success(String convertId) {
+        GisSurveyCadConvertResult result = new GisSurveyCadConvertResult();
+        result.setConvertId(convertId);
+        result.setConvertStatus(GisSurveConvertStatusEnum.SUCCESS.getCode());
+        result.setRequestTime(LocalDateTime.now());
+        return result;
+    }
+
+    /**
+     * 失败
+     */
+    public static GisSurveyCadConvertResult fail(String convertId) {
+        GisSurveyCadConvertResult result = new GisSurveyCadConvertResult();
+        result.setConvertId(convertId);
+        result.setConvertStatus(GisSurveConvertStatusEnum.FAIL.getCode());
+        result.setRequestTime(LocalDateTime.now());
+        return result;
+    }
+}

+ 9 - 1
src/main/resources/application.properties

@@ -152,7 +152,15 @@ system-check.result-lag-duration=30m
 third-import.ttl=1h
 #检查周期(毫秒)
 third-import.ttl-check-interval=300000
-
+#=============cad转换========================
+#文件生命周期
+cad-convert.file-lifecycle=15m
+#资源路径
+cad-convert.resource-path=/home/kprCloud/alam_dma_kpr_plugin/cad-convert-temps/
+#栅格化最小宽度
+cad-convert.rasterization-min-width=800
+#栅格化最小高度
+cad-convert.rasterization-min-height=800