Procházet zdrojové kódy

feat: 实现不动产资源地图获取建筑选项列表接口

weijianghai před 1 rokem
rodič
revize
bebc82e116

+ 6 - 0
pom.xml

@@ -69,6 +69,12 @@
             <artifactId>gson</artifactId>
             <version>2.10.1</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/io.minio/minio -->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.5.6</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 62 - 0
src/main/java/com/nokia/financeapi/config/HttpClientConfig.java

@@ -0,0 +1,62 @@
+package com.nokia.financeapi.config;
+
+import okhttp3.OkHttpClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+
+/**
+ * OKHttpClient配置
+ */
+@Configuration
+public class HttpClientConfig {
+    @Bean
+    public OkHttpClient myHttpClient() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
+        return new OkHttpClient.Builder()
+                .hostnameVerifier((hostname, session) -> true)
+                .retryOnConnectionFailure(true)
+                .sslSocketFactory(getSslSocketFactory(), getX509TrustManager())
+                .build();
+    }
+
+    private SSLSocketFactory getSslSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
+        SSLContext sslContext = SSLContext.getInstance("SSL");
+        sslContext.init(null, new TrustManager[]{
+                new X509TrustManager() {
+                    @Override
+                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
+                        // 不检查证书
+                    }
+
+                    @Override
+                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
+                        // 不检查证书
+                    }
+
+                    @Override
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[]{};
+                    }
+                }
+        }, new SecureRandom());
+        return sslContext.getSocketFactory();
+    }
+
+    private X509TrustManager getX509TrustManager() throws NoSuchAlgorithmException, KeyStoreException {
+        TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+        factory.init((KeyStore) null);
+        TrustManager[] managers = factory.getTrustManagers();
+        return (X509TrustManager) managers[0];
+    }
+}

+ 47 - 0
src/main/java/com/nokia/financeapi/config/MinioConfig.java

@@ -0,0 +1,47 @@
+package com.nokia.financeapi.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import okhttp3.OkHttpClient;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties("minio")
+public class MinioConfig {
+    /**
+     * 对象存储服务的URL
+     */
+    private String endpoint;
+
+    /**
+     * 存储桶
+     */
+    private String bucket;
+
+    /**
+     * 访问标识
+     */
+    private String accessKey;
+
+    /**
+     * 密钥
+     */
+    private String secretKey;
+
+    /**
+     * 链接默认过期时间,分钟
+     */
+    private Integer expiry;
+
+    @Bean
+    public MinioClient minioClient(OkHttpClient myHttpClient) {
+        return MinioClient.builder()
+                .endpoint(endpoint)
+                .credentials(accessKey, secretKey)
+                .httpClient(myHttpClient)
+                .build();
+    }
+}

+ 8 - 0
src/main/java/com/nokia/financeapi/controller/house/HouseResourceMapController.java

@@ -3,11 +3,13 @@ package com.nokia.financeapi.controller.house;
 import com.nokia.financeapi.common.R;
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaStatDto;
 import com.nokia.financeapi.pojo.dto.GetBuildingMapDto;
+import com.nokia.financeapi.pojo.dto.GetBuildingOptionsDto;
 import com.nokia.financeapi.pojo.dto.GetBuildingRepairStatDto;
 import com.nokia.financeapi.pojo.dto.GetHouseNoticeDto;
 import com.nokia.financeapi.pojo.dto.GetLandBuildingStatDto;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaStatVo;
 import com.nokia.financeapi.pojo.vo.GetBuildingMapVo;
+import com.nokia.financeapi.pojo.vo.GetBuildingOptionsVo;
 import com.nokia.financeapi.pojo.vo.GetBuildingRepairStatVo;
 import com.nokia.financeapi.pojo.vo.GetHouseNoticeVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
@@ -75,4 +77,10 @@ public class HouseResourceMapController {
     public R<List<GetRentOutStatVo>> getRentOutStat() {
         return houseResourceMapService.getRentOutStat();
     }
+
+    @Operation(summary = "获取建筑选项列表")
+    @PostMapping("/getBuildingOptions")
+    public R<List<GetBuildingOptionsVo>> getBuildingOptions(@Valid @RequestBody GetBuildingOptionsDto dto) {
+        return houseResourceMapService.getBuildingOptions(dto);
+    }
 }

+ 107 - 21
src/main/java/com/nokia/financeapi/dao/house/HouseResourceMapMapper.java

@@ -2,11 +2,13 @@ package com.nokia.financeapi.dao.house;
 
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaStatDto;
 import com.nokia.financeapi.pojo.dto.GetBuildingMapDto;
+import com.nokia.financeapi.pojo.dto.GetBuildingOptionsDto;
 import com.nokia.financeapi.pojo.dto.GetBuildingRepairStatDto;
 import com.nokia.financeapi.pojo.dto.GetHouseNoticeDto;
 import com.nokia.financeapi.pojo.dto.GetLandBuildingStatDto;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaStatVo;
 import com.nokia.financeapi.pojo.vo.GetBuildingMapVo;
+import com.nokia.financeapi.pojo.vo.GetBuildingOptionsVo;
 import com.nokia.financeapi.pojo.vo.GetBuildingRepairStatVo;
 import com.nokia.financeapi.pojo.vo.GetHouseNoticeVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
@@ -178,7 +180,7 @@ select max(year_month) from house.building_month
     Integer getBuildingMonthMaxDate();
 
     /**
-     * 获取区县最大面积建筑周围1000米的建筑,相同局址保留建筑面积最大的
+     * 获取区县最大面积建筑周围1000米的建筑,相同经纬度保留建筑面积最大的
      */
     @Select("""
 with
@@ -217,23 +219,33 @@ where
 t103 as (
 select
     distinct on
-    (site_id) *
+    (lng_bd09, lat_bd09) *
 from
     t102
 order by
-    site_id,
+    lng_bd09,
+    lat_bd09,
     building_area desc
 ),
 t104 as (
 select
-    distinct on
-    (lng_bd09, lat_bd09) *
+    building_id,
+    sum(amount) as maintenance_cost
 from
-    t103
-order by
-    lng_bd09,
-    lat_bd09,
-    building_area desc
+    house.building_repair_main_month
+where
+    repair_type != '财务预提冲销'
+    and exists (select 1 from t103 where t103.building_id = house.building_repair_main_month.building_id)
+    and year_month >= #{dto.startDate}
+    and year_month <= #{dto.endDate}
+group by
+    building_id
+),
+t105 as (
+select
+t103.*,
+t104.maintenance_cost
+from t103 left join t104 on t103.building_id = t104.building_id
 )
 select
     building_id,
@@ -245,10 +257,11 @@ select
     building_area,
     building_area_idle,
     building_area_rent,
+    round(maintenance_cost, 2) as maintenance_cost,
     lng_bd09 as lng,
     lat_bd09 as lat
 from
-    t104
+    t105
 order by
     building_area desc
 limit 150
@@ -275,23 +288,33 @@ where
 t102 as (
 select
     distinct on
-    (site_id) *
+    (lng_bd09, lat_bd09) *
 from
     t101
 order by
-    site_id,
+    lng_bd09,
+    lat_bd09,
     building_area desc
 ),
 t103 as (
 select
-    distinct on
-    (lng_bd09, lat_bd09) *
+    building_id,
+    sum(amount) as maintenance_cost
 from
-    t102
-order by
-    lng_bd09,
-    lat_bd09,
-    building_area desc
+    house.building_repair_main_month
+where
+    repair_type != '财务预提冲销'
+    and exists (select 1 from t102 where t102.building_id = house.building_repair_main_month.building_id)
+    and year_month >= #{dto.startDate}
+    and year_month <= #{dto.endDate}
+group by
+    building_id
+),
+t104 as (
+select
+t102.*,
+t103.maintenance_cost
+from t102 left join t103 on t102.building_id = t103.building_id
 )
 select
     building_id,
@@ -303,10 +326,11 @@ select
     building_area,
     building_area_idle,
     building_area_rent,
+    round(maintenance_cost, 2) as maintenance_cost,
     lng_bd09 as lng,
     lat_bd09 as lat
 from
-    t103
+    t104
 order by
     building_area desc
 limit 150
@@ -421,4 +445,66 @@ where city = #{dto.city}
 order by create_time desc
 """)
     List<GetHouseNoticeVo> getNotice(@Param("dto") GetHouseNoticeDto dto);
+
+    /**
+     * 获取区县内的建筑,相同局址保留建筑面积最大的
+     */
+    @Select("""
+with
+t101 as (
+select
+    distinct on
+    (lng_bd09, lat_bd09) *
+from
+    house.building_month
+where
+    lng_bd09 is not null
+    and lat_bd09 is not null
+    and year_month = #{dto.endDate}
+    and city = #{dto.city}
+    and district = #{dto.district}
+order by
+    lng_bd09,
+    lat_bd09,
+    building_area desc
+),
+t102 as (
+select
+    building_id,
+    sum(amount) as maintenance_cost
+from
+    house.building_repair_main_month
+where
+    repair_type != '财务预提冲销'
+    and exists (select 1 from t101 where t101.building_id = house.building_repair_main_month.building_id)
+    and year_month >= #{dto.startDate}
+    and year_month <= #{dto.endDate}
+group by
+    building_id
+),
+t103 as (
+select
+t101.*,
+t102.maintenance_cost
+from t101 left join t102 on t101.building_id = t102.building_id
+)
+select
+    building_id,
+    address,
+    area_sector,
+    building_name,
+    acquisition_date,
+    building_use,
+    building_area,
+    building_area_idle,
+    building_area_rent,
+    round(maintenance_cost, 2) as maintenance_cost,
+    lng_bd09 as lng,
+    lat_bd09 as lat
+from
+    t103
+order by
+    building_area desc
+""")
+    List<GetBuildingOptionsVo> getBuildingOptions(@Param("dto") GetBuildingOptionsDto dto);
 }

+ 6 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetBuildingMapDto.java

@@ -1,5 +1,6 @@
 package com.nokia.financeapi.pojo.dto;
 
+import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -21,4 +22,9 @@ public class GetBuildingMapDto {
     private BigDecimal rightLng;
     @Schema(description = "右下角角纬度", example = "38.05078693947483")
     private BigDecimal rightLat;
+    /**
+     * 开始日期
+     */
+    @Hidden
+    private Integer startDate;
 }

+ 20 - 0
src/main/java/com/nokia/financeapi/pojo/dto/GetBuildingOptionsDto.java

@@ -0,0 +1,20 @@
+package com.nokia.financeapi.pojo.dto;
+
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class GetBuildingOptionsDto {
+    @Schema(description = "账期,不传默认最新", example = "202309")
+    private Integer endDate;
+    @Schema(description = "地市", example = "石家庄")
+    private String city;
+    @Schema(description = "区县", example = "长安区")
+    private String district;
+    /**
+     * 开始日期
+     */
+    @Hidden
+    private Integer startDate;
+}

+ 42 - 0
src/main/java/com/nokia/financeapi/pojo/vo/GetBuildingOptionsVo.java

@@ -0,0 +1,42 @@
+package com.nokia.financeapi.pojo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@NoArgsConstructor
+@Data
+public class GetBuildingOptionsVo {
+    @Schema(description = "建筑id", example = "2019021222532737046698")
+    private String buildingId;
+    @Schema(description = "标准地址", example = "河北省石家庄市长安区广安大厦")
+    private String address;
+    @Schema(description = "地段", example = "核心商圈")
+    private String areaSector;
+    @Schema(description = "建筑别名", example = "广安大厦")
+    private String buildingName;
+    @Schema(description = "取得日期", example = "2005-04")
+    private String acquisitionDate;
+    @Schema(description = "建筑用途", example = "综合用房")
+    private String buildingUse;
+    @Schema(description = "建筑图片url")
+    private String buildingImg;
+    @Schema(description = "建筑面积(㎡)", example = "36069.1")
+    private BigDecimal buildingArea;
+    @Schema(description = "建筑面积-出租(㎡)", example = "11810")
+    private BigDecimal buildingAreaRent;
+    @Schema(description = "建筑面积-闲置(㎡)", example = "0")
+    private BigDecimal buildingAreaIdle;
+    @Schema(description = "产权年限", example = "40")
+    private Integer ownershipTerm;
+    @Schema(description = "维修费", example = "1221.23")
+    private BigDecimal maintenanceCost;
+    @Schema(description = "出租收入", example = "8000")
+    private BigDecimal rentalIncome;
+    @Schema(description = "经度", example = "114.53074627437987")
+    private BigDecimal lng;
+    @Schema(description = "纬度", example = "38.05078693947483")
+    private BigDecimal lat;
+}

+ 79 - 0
src/main/java/com/nokia/financeapi/service/common/file/FileService.java

@@ -0,0 +1,79 @@
+package com.nokia.financeapi.service.common.file;
+
+import cn.hutool.core.util.IdUtil;
+
+import java.io.InputStream;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public interface FileService {
+    /**
+     * 生成文件名
+     *
+     * @return {@link String}
+     */
+    default String generateFilename() {
+        return generateFilename("");
+    }
+
+    /**
+     * 生成文件名
+     *
+     * @param suffix 后缀
+     * @return {@link String}
+     */
+    default String generateFilename(String suffix) {
+        LocalDateTime now = LocalDateTime.now();
+        return now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth() + "/"
+                + IdUtil.fastSimpleUUID() + "-" + now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + suffix;
+    }
+
+    /**
+     * 获取下载地址
+     *
+     * @param object 对象名称
+     * @return {@link String}
+     */
+    String getDownloadUrl(String object);
+
+    /**
+     * 获取下载地址
+     *
+     * @param object   对象名称
+     * @param duration 过期时间
+     * @param unit     单位
+     * @return {@link String}
+     */
+    String getDownloadUrl(String object, int duration, TimeUnit unit);
+
+    /**
+     * 从流中上传数据到对象
+     *
+     * @param object     对象名称
+     * @param stream     流
+     * @param objectSize 对象大小
+     * @param tags       标签
+     * @return {@link Map}<{@link String}, {@link Object}>
+     */
+    Map<String, Object> putObject(String object, InputStream stream, long objectSize, Map<String, String> tags);
+    /**
+     * 从流中上传数据到对象
+     *
+     * @param object     对象名称
+     * @param stream     流
+     * @param objectSize 对象大小
+     * @return {@link Map}<{@link String}, {@link Object}>
+     */
+    default Map<String, Object> putObject(String object, InputStream stream, long objectSize) {
+        return putObject(object, stream, objectSize, null);
+    }
+
+    /**
+     * 获取存储桶名称
+     *
+     * @return {@link String}
+     */
+    String getBucket();
+}

+ 118 - 0
src/main/java/com/nokia/financeapi/service/common/file/MinioServiceImpl.java

@@ -0,0 +1,118 @@
+package com.nokia.financeapi.service.common.file;
+
+import com.nokia.financeapi.common.exception.MyRuntimeException;
+import com.nokia.financeapi.config.MinioConfig;
+import io.minio.GetPresignedObjectUrlArgs;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.PutObjectArgs;
+import io.minio.errors.ErrorResponseException;
+import io.minio.errors.InsufficientDataException;
+import io.minio.errors.InternalException;
+import io.minio.errors.InvalidResponseException;
+import io.minio.errors.ServerException;
+import io.minio.errors.XmlParserException;
+import io.minio.http.Method;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Primary
+@Slf4j
+@Service
+public class MinioServiceImpl implements FileService {
+
+    private final MinioClient minioClient;
+    private final MinioConfig minioConfig;
+
+    public MinioServiceImpl(MinioClient minioClient, MinioConfig minioConfig) {
+        this.minioClient = minioClient;
+        this.minioConfig = minioConfig;
+    }
+
+    /**
+     * 获取下载地址
+     *
+     * @param object 对象名称
+     * @return {@link String}
+     */
+    @Override
+    public String getDownloadUrl(String object) {
+        return getDownloadUrl(object, minioConfig.getExpiry(), TimeUnit.MINUTES);
+    }
+
+    /**
+     * 获取下载地址
+     *
+     * @param object   对象名称
+     * @param duration 过期时间
+     * @param unit     单位
+     * @return {@link String}
+     */
+    @Override
+    public String getDownloadUrl(String object, int duration, TimeUnit unit) {
+        try {
+            return StringUtils.delete(minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                    .expiry(duration, unit)
+                    .bucket(minioConfig.getBucket())
+                    .object(object)
+                    .method(Method.GET)
+                    .build()), minioConfig.getEndpoint());
+        } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
+                 InvalidResponseException | IOException | NoSuchAlgorithmException | XmlParserException |
+                 ServerException e) {
+            throw new MyRuntimeException(e);
+        }
+    }
+
+    /**
+     * 从流中上传数据到对象
+     *
+     * @param object     对象名称
+     * @param stream     流
+     * @param objectSize 对象大小
+     * @return {@link Map}<{@link String}, {@link Object}>
+     */
+    @Override
+    public Map<String, Object> putObject(String object, InputStream stream, long objectSize, Map<String, String> tags) {
+        try {
+            ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
+                    .bucket(minioConfig.getBucket())
+                    .object(object)
+                    .stream(stream, objectSize, -1)
+                    .tags(tags)
+                    .build());
+            Map<String, Object> map = new HashMap<>();
+            map.put("object", response.object());
+            map.put("bucket", response.bucket());
+            map.put("etag", response.etag());
+            map.put("versionId", response.versionId());
+            map.put("headers", response.headers());
+            map.put("region", response.region());
+            return map;
+        } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
+                 InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException |
+                 XmlParserException e) {
+            throw new MyRuntimeException(e);
+        }
+    }
+
+    /**
+     * 获取存储桶名称
+     *
+     * @return {@link String}
+     */
+    @Override
+    public String getBucket() {
+        return minioConfig.getBucket();
+    }
+}

+ 35 - 9
src/main/java/com/nokia/financeapi/service/house/HouseResourceMapService.java

@@ -7,21 +7,26 @@ import com.nokia.financeapi.dao.house.AreaDao;
 import com.nokia.financeapi.dao.house.HouseResourceMapMapper;
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaStatDto;
 import com.nokia.financeapi.pojo.dto.GetBuildingMapDto;
+import com.nokia.financeapi.pojo.dto.GetBuildingOptionsDto;
 import com.nokia.financeapi.pojo.dto.GetBuildingRepairStatDto;
 import com.nokia.financeapi.pojo.dto.GetHouseNoticeDto;
 import com.nokia.financeapi.pojo.dto.GetLandBuildingStatDto;
 import com.nokia.financeapi.pojo.po.AreaPo;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaStatVo;
 import com.nokia.financeapi.pojo.vo.GetBuildingMapVo;
+import com.nokia.financeapi.pojo.vo.GetBuildingOptionsVo;
 import com.nokia.financeapi.pojo.vo.GetBuildingRepairStatVo;
 import com.nokia.financeapi.pojo.vo.GetHouseNoticeVo;
 import com.nokia.financeapi.pojo.vo.GetLandBuildingStatVo;
 import com.nokia.financeapi.pojo.vo.GetRentOutStatVo;
 import com.nokia.financeapi.pojo.vo.TreeAreaVo;
+import com.nokia.financeapi.service.common.file.FileService;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import javax.validation.Valid;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -31,10 +36,12 @@ import java.util.Map;
 public class HouseResourceMapService {
     private final HouseResourceMapMapper houseResourceMapMapper;
     private final AreaDao areaDao;
+    private final FileService fileService;
 
-    public HouseResourceMapService(HouseResourceMapMapper houseResourceMapMapper, AreaDao areaDao) {
+    public HouseResourceMapService(HouseResourceMapMapper houseResourceMapMapper, AreaDao areaDao, FileService fileService) {
         this.houseResourceMapMapper = houseResourceMapMapper;
         this.areaDao = areaDao;
+        this.fileService = fileService;
     }
 
     public R<GetBuildingAreaStatVo> getBuildingAreaStat(GetBuildingAreaStatDto dto) {
@@ -105,9 +112,10 @@ public class HouseResourceMapService {
             return R.ok();
         }
         dto.setEndDate(endDate);
-//        LocalDate endLocalDate = LocalDate.parse(endDate + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
-//        LocalDate startLocalDate = endLocalDate.withDayOfYear(1);
-//        Integer startDate = Integer.valueOf(startLocalDate.format(DateTimeFormatter.ofPattern("yyyyMM")));
+        LocalDate endLocalDate = LocalDate.parse(endDate + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
+        LocalDate startLocalDate = endLocalDate.withDayOfYear(1);
+        Integer startDate = Integer.valueOf(startLocalDate.format(DateTimeFormatter.ofPattern("yyyyMM")));
+        dto.setStartDate(startDate);
         // 坐标为空根据区县获取建筑
         if (dto.getLeftLng() == null || dto.getRightLng() == null || dto.getLeftLat() == null || dto.getRightLat() == null) {
             List<GetBuildingMapVo> vo = houseResourceMapMapper.getBuildingByDistrict(dto);
@@ -207,15 +215,33 @@ public class HouseResourceMapService {
         "unit": "省本部",
         "income": "1044.94",
         "finishingRate": "62.10"
-    },
-    {
-        "unit": "全省",
-        "income": "9213.54",
-        "finishingRate": "56.60"
     }
 ]
                 """;
         return R.ok(new Gson().fromJson(s, new TypeToken<List<GetRentOutStatVo>>() {
         }.getType()));
     }
+
+    public R<List<GetBuildingOptionsVo>> getBuildingOptions(GetBuildingOptionsDto dto) {
+        Integer endDate = dto.getEndDate();
+        // 账期为空则取最新的账期
+        if (dto.getEndDate() == null) {
+            endDate = houseResourceMapMapper.getBuildingMonthMaxDate();
+        }
+        if (endDate == null) {
+            return R.ok();
+        }
+        dto.setEndDate(endDate);
+        LocalDate endLocalDate = LocalDate.parse(endDate + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
+        LocalDate startLocalDate = endLocalDate.withDayOfYear(1);
+        Integer startDate = Integer.valueOf(startLocalDate.format(DateTimeFormatter.ofPattern("yyyyMM")));
+        dto.setStartDate(startDate);
+        List<GetBuildingOptionsVo> vo = houseResourceMapMapper.getBuildingOptions(dto);
+        vo.forEach(t -> {
+            if (StringUtils.hasText(t.getBuildingImg())) {
+                t.setBuildingImg(fileService.getBucket() + t.getBuildingImg());
+            }
+        });
+        return R.ok(vo);
+    }
 }

+ 16 - 0
src/main/resources/application-prod.properties

@@ -0,0 +1,16 @@
+server.port=39100
+logging.level.com.nokia=info
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.datasource.url=jdbc:postgresql://172.16.107.5:5432/financialdb
+spring.datasource.username=finance
+spring.datasource.password=Finance@unicom23
+# minio配置
+minio.endpoint=http://133.96.95.30:39000/
+minio.bucket=oss-finance-prod
+minio.accessKey=oss-finance-prod
+minio.secretKey=5Hu18JUQ2vk2SEKfIV6AGt6xr9zq3dYu0NSkkxKF
+minio.expiry=15
+# 关闭接口文档
+springdoc.api-docs.enabled=false
+springdoc.swagger-ui.enabled=false
+knife4j.production=true

+ 6 - 0
src/main/resources/application-test.properties

@@ -4,3 +4,9 @@ spring.datasource.driver-class-name=org.postgresql.Driver
 spring.datasource.url=jdbc:postgresql://192.168.50.3:15432/finance
 spring.datasource.username=postgres
 spring.datasource.password=NFQCgBA6YhNvgAqG6THw
+# minio配置
+minio.endpoint=http://192.168.10.7:19000/
+minio.bucket=oss-finance-test
+minio.accessKey=oss-finance-test
+minio.secretKey=JQUqNWuqHq74Q4YV1t19Z6s9or4QIw5S
+minio.expiry=15