Bladeren bron

新增 mongodb 批量更新功能

zhaiyifei 11 maanden geleden
bovenliggende
commit
5da58b0bde

+ 9 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotDevGeoPoint.java

@@ -0,0 +1,9 @@
+package com.yunfeiyun.agmp.iot.common.domain;
+
+import lombok.Data;
+
+@Data
+public class IotDevGeoPoint {
+    private String type;
+    private double[] coordinates;
+}

+ 29 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/domain/IotDeviceGeoLocation.java

@@ -0,0 +1,29 @@
+package com.yunfeiyun.agmp.iot.common.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("IotDeviceGeoLocation")
+public class IotDeviceGeoLocation extends IotBaseEntity {
+    private String id;
+    private String tid;
+    private String devGeoBid;
+
+    /** 地理位置信息
+     * { type: "Point", coordinates: [ -73.97, 40.77 ] }
+     * */
+    private IotDevGeoPoint devGeoLocation;
+
+    /** 设备地理位置创建时间 */
+    private String devGeoCreateddate;
+
+    /** 设备地理位置更新时间 */
+    private String devGeoUpdateddate;
+
+    /** 设备标识 */
+    private String devBid;
+
+    /** 设备类型标识 */
+    private String devtypeBid;
+}

+ 29 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/service/MongoService.java

@@ -12,6 +12,7 @@ import com.yunfeiyun.agmp.common.core.page.PageDomain;
 import com.yunfeiyun.agmp.common.utils.DateUtils;
 import com.yunfeiyun.agmp.common.utils.DateUtils;
 import com.yunfeiyun.agmp.common.utils.JSONUtils;
 import com.yunfeiyun.agmp.common.utils.JSONUtils;
 import com.yunfeiyun.agmp.common.utils.StringUtils;
 import com.yunfeiyun.agmp.common.utils.StringUtils;
+import com.yunfeiyun.agmp.iot.common.domain.dto.MgUpdateBatchDto;
 import lombok.Data;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.util.TextUtils;
 import org.apache.http.util.TextUtils;
@@ -22,6 +23,7 @@ import org.bson.conversions.Bson;
 import org.bson.types.ObjectId;
 import org.bson.types.ObjectId;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.BulkOperations;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.aggregation.*;
 import org.springframework.data.mongodb.core.aggregation.*;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Criteria;
@@ -671,5 +673,32 @@ public class  MongoService<T>{
             collection.createIndexes(indexModelListCreate);
             collection.createIndexes(indexModelListCreate);
         }
         }
     }
     }
+
+    public void updateBatch(Class<T> entity, List<MgUpdateBatchDto> updateBatchDtoList) {
+        TableName annotation = entity.getAnnotation(TableName.class);
+        if (annotation == null || StringUtils.isEmpty(annotation.value())) {
+            throw new RuntimeException(entity.getName() + "未被@TableName修饰或value为空");
+        }
+        /**
+         * 不得用entity实体,会自动将类名转换为小写开头的表名
+         */
+        BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, annotation.value());
+        for(MgUpdateBatchDto updateBatchDto : updateBatchDtoList) {
+            Query query = updateBatchDto.getQuery();
+            Map<String, Object> updateField = updateBatchDto.getUpdateField();
+            if (query == null || updateField == null || updateField.isEmpty()) {
+                throw new RuntimeException("query 或 更新内容 不可为空");
+            }
+            Update update = new Update();
+            updateField.forEach((key, value) -> {
+                //忽略空值
+                if (value != null) {
+                    update.set(key, value);
+                }
+            });
+            operations.updateOne(query, update);
+        }
+        operations.execute();
+    }
 }
 }
 
 

+ 21 - 0
src/main/java/com/yunfeiyun/agmp/iot/common/util/BigDecimalUtil.java

@@ -0,0 +1,21 @@
+package com.yunfeiyun.agmp.iot.common.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class BigDecimalUtil {
+    private static final int scale = 6;
+    private static RoundingMode roundingMode = RoundingMode.DOWN;
+
+    public static BigDecimal format(double value) {
+        return BigDecimal.valueOf(value).setScale(scale, roundingMode);
+    }
+
+    public static BigDecimal format(String value) {
+        return new BigDecimal(value).setScale(scale, roundingMode);
+    }
+
+    public static double toDouble(BigDecimal value){
+        return value.setScale(scale, roundingMode).doubleValue();
+    }
+}