|
|
@@ -1,6 +1,7 @@
|
|
|
package com.skyversation.xjcy.counter;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.skyversation.xjcy.util.JSONDataTool;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
@@ -18,68 +19,10 @@ import java.util.stream.Stream;
|
|
|
* 线程不安全,请在调用时使用这个类下的LOCK做全局锁<br/>
|
|
|
* 将多个楼宇放进一个对象会影响速度,请一个楼宇一个对象
|
|
|
*/
|
|
|
-public class DataPreCounter {
|
|
|
+public class ParkPreCounter {
|
|
|
|
|
|
public static final Object LOCK = new Object();
|
|
|
|
|
|
- /**
|
|
|
- * 注意输入的数据有副作用
|
|
|
- *
|
|
|
- * @param allPark 所有参与的park数据,为避免数据不完整,请提供整个产业园的数据
|
|
|
- * @param allLease 所有参与的租赁,提供所有涉及的房间的所有数据即可,如果数据出现房间级的不完整,就会导致结果有误
|
|
|
- */
|
|
|
- public DataPreCounter(List<JSONObject> allPark, List<JSONObject> allLease, LocalDate now) {
|
|
|
- this.now = now;
|
|
|
- this.parkNeedUploadId = new HashSet<>();
|
|
|
- this.leaseNeedUploadId = new HashSet<>();
|
|
|
- this.allPark = allPark;
|
|
|
- this.allLease = allLease;
|
|
|
- allLy = new ArrayList<>();
|
|
|
- allLd = new ArrayList<>();
|
|
|
- allLc = new ArrayList<>();
|
|
|
- allRoom = new ArrayList<>();
|
|
|
- allPark.stream().filter(Objects::nonNull).forEach(park -> {
|
|
|
- switch (park.getString(String.valueOf(ParkKey.c_resource_type))) {
|
|
|
- case "1":
|
|
|
- allRoom.add(park);
|
|
|
- break;
|
|
|
- case "2":
|
|
|
- allLc.add(park);
|
|
|
- break;
|
|
|
- case "3":
|
|
|
- allLd.add(park);
|
|
|
- break;
|
|
|
- case "4":
|
|
|
- allLy.add(park);
|
|
|
- break;
|
|
|
- default:
|
|
|
- //doNothing
|
|
|
- break;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- public Set<JSONObject> getRoomsWithCode(Collection<String> roomCodes, List<JSONObject> range) {
|
|
|
- if (roomCodes == null || roomCodes.isEmpty() || range == null || range.isEmpty()) {
|
|
|
- return Collections.emptySet();
|
|
|
- }
|
|
|
- return range.stream()
|
|
|
- .filter(v -> roomCodes.contains(v.getString(String.valueOf(ParkKey.c_park_code))))
|
|
|
- .collect(Collectors.toSet());
|
|
|
- }
|
|
|
-
|
|
|
- public Set<JSONObject> getRoomsWithCode(Collection<String> roomCodes) {
|
|
|
- return getRoomsWithCode(roomCodes, allRoom);
|
|
|
- }
|
|
|
-
|
|
|
- public List<JSONObject> getParkNeedUpload() {
|
|
|
- return allPark.stream().filter(v -> parkNeedUploadId.contains(v.getString("id"))).collect(Collectors.toList());
|
|
|
- }
|
|
|
-
|
|
|
- public List<JSONObject> getLeaseNeedUpload() {
|
|
|
- return allLease.stream().filter(v -> leaseNeedUploadId.contains(v.getString("id"))).collect(Collectors.toList());
|
|
|
- }
|
|
|
-
|
|
|
private enum LeaseKey {
|
|
|
c_room_code, c_enterprise_code, c_start_date, c_end_date, c_lease_purpose, c_is_latest_lease, c_lease_status, update_time, c_enterprise_name
|
|
|
}
|
|
|
@@ -144,6 +87,65 @@ public class DataPreCounter {
|
|
|
|
|
|
private final LocalDate now;
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 注意输入的数据有副作用
|
|
|
+ *
|
|
|
+ * @param allPark 所有参与的park数据,为避免数据不完整,请提供整个产业园的数据
|
|
|
+ * @param allLease 所有参与的租赁,提供所有涉及的房间的所有数据即可,如果数据出现房间级的不完整,就会导致结果有误
|
|
|
+ */
|
|
|
+ public ParkPreCounter(List<JSONObject> allPark, List<JSONObject> allLease, LocalDate now) {
|
|
|
+ this.now = now;
|
|
|
+ this.parkNeedUploadId = new HashSet<>();
|
|
|
+ this.leaseNeedUploadId = new HashSet<>();
|
|
|
+ this.allPark = allPark;
|
|
|
+ this.allLease = allLease;
|
|
|
+ allLy = new ArrayList<>();
|
|
|
+ allLd = new ArrayList<>();
|
|
|
+ allLc = new ArrayList<>();
|
|
|
+ allRoom = new ArrayList<>();
|
|
|
+ allPark.stream().filter(Objects::nonNull).forEach(park -> {
|
|
|
+ switch (park.getString(String.valueOf(ParkKey.c_resource_type))) {
|
|
|
+ case "1":
|
|
|
+ allRoom.add(park);
|
|
|
+ break;
|
|
|
+ case "2":
|
|
|
+ allLc.add(park);
|
|
|
+ break;
|
|
|
+ case "3":
|
|
|
+ allLd.add(park);
|
|
|
+ break;
|
|
|
+ case "4":
|
|
|
+ allLy.add(park);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ //doNothing
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public Set<JSONObject> getRoomsWithCode(Collection<String> roomCodes, List<JSONObject> range) {
|
|
|
+ if (roomCodes == null || roomCodes.isEmpty() || range == null || range.isEmpty()) {
|
|
|
+ return Collections.emptySet();
|
|
|
+ }
|
|
|
+ return range.stream()
|
|
|
+ .filter(v -> roomCodes.contains(v.getString(String.valueOf(ParkKey.c_park_code))))
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ }
|
|
|
+
|
|
|
+ public Set<JSONObject> getRoomsWithCode(Collection<String> roomCodes) {
|
|
|
+ return getRoomsWithCode(roomCodes, allRoom);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<JSONObject> getParkNeedUpload() {
|
|
|
+ return allPark.stream().filter(v -> parkNeedUploadId.contains(v.getString("id"))).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<JSONObject> getLeaseNeedUpload() {
|
|
|
+ return allLease.stream().filter(v -> leaseNeedUploadId.contains(v.getString("id"))).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 运行预统计,有副作用,注意只能运行提供了租赁数据的房间,你可以从parkNeedUpload和leaseNeedUpload中获取所有更新过的数据
|
|
|
*
|
|
|
@@ -245,35 +247,35 @@ public class DataPreCounter {
|
|
|
private void updateRoomLease(JSONObject room, JSONObject lease) {
|
|
|
if (lease == null || !checkLeaseWorking(lease)) {
|
|
|
//绑定企业信息
|
|
|
- updateStringValue(room,
|
|
|
+ JSONDataTool.updateStringValue(room,
|
|
|
String.valueOf(ParkKey.c_zlqymc),
|
|
|
null,
|
|
|
parkNeedUploadId);
|
|
|
- updateStringValue(room,
|
|
|
+ JSONDataTool.updateStringValue(room,
|
|
|
String.valueOf(ParkKey.c_zlqydm),
|
|
|
null,
|
|
|
parkNeedUploadId);
|
|
|
//更新房间状态
|
|
|
- updateStringValue(room, String.valueOf(ParkKey.c_room_status), "1", parkNeedUploadId);
|
|
|
+ JSONDataTool.updateStringValue(room, String.valueOf(ParkKey.c_room_status), "1", parkNeedUploadId);
|
|
|
//更新面积数据
|
|
|
String roomSaleType = room.getString(String.valueOf(ParkKey.c_room_sale_type));
|
|
|
boolean isForSale = "3".equals(roomSaleType);
|
|
|
boolean isForRent = "1".equals(roomSaleType);
|
|
|
Double BuildArea = room.getDouble(String.valueOf(ParkKey.c_building_area));
|
|
|
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_self_used_area), 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_sellable_area), isForSale ? BuildArea : 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_sold_area), 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_rentable_area), isForRent ? BuildArea : 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_rented_area), 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_vacant_area), isForRent || isForSale ? BuildArea : 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_self_used_area), 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_sellable_area), isForSale ? BuildArea : 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_sold_area), 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_rentable_area), isForRent ? BuildArea : 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_rented_area), 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_vacant_area), isForRent || isForSale ? BuildArea : 0d, parkNeedUploadId);
|
|
|
} else {
|
|
|
//绑定企业信息
|
|
|
- updateStringValue(room,
|
|
|
+ JSONDataTool.updateStringValue(room,
|
|
|
String.valueOf(ParkKey.c_zlqydm),
|
|
|
lease.getString(String.valueOf(LeaseKey.c_enterprise_code)),
|
|
|
parkNeedUploadId);
|
|
|
- updateStringValue(room,
|
|
|
+ JSONDataTool.updateStringValue(room,
|
|
|
String.valueOf(ParkKey.c_zlqymc),
|
|
|
lease.getString(String.valueOf(LeaseKey.c_enterprise_name)),
|
|
|
parkNeedUploadId);
|
|
|
@@ -293,26 +295,26 @@ public class DataPreCounter {
|
|
|
} else {
|
|
|
state = null; // 如果房间缺失用途数据,则默许缺失蔓延到状态数据
|
|
|
}
|
|
|
- updateStringValue(room, String.valueOf(ParkKey.c_room_status), state, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateStringValue(room, String.valueOf(ParkKey.c_room_status), state, parkNeedUploadId);
|
|
|
|
|
|
//更新面积数据
|
|
|
|
|
|
Double BuildArea = room.getDouble(String.valueOf(ParkKey.c_building_area));
|
|
|
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_self_used_area), isForSelfUsed ? BuildArea : 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_sellable_area), 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_sold_area), isForSale ? BuildArea : 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_rentable_area), 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_rented_area), isForRent ? BuildArea : 0d, parkNeedUploadId);
|
|
|
- updateDoubleValue(room, String.valueOf(ParkKey.c_vacant_area), 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_self_used_area), isForSelfUsed ? BuildArea : 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_sellable_area), 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_sold_area), isForSale ? BuildArea : 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_rentable_area), 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_rented_area), isForRent ? BuildArea : 0d, parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(room, String.valueOf(ParkKey.c_vacant_area), 0d, parkNeedUploadId);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
private void updateLeaseLast(JSONObject newWorkingLease, List<JSONObject> oldWorkingLeases) {
|
|
|
- oldWorkingLeases.forEach(v -> updateStringValue(v, String.valueOf(LeaseKey.c_is_latest_lease),
|
|
|
+ oldWorkingLeases.forEach(v -> JSONDataTool.updateStringValue(v, String.valueOf(LeaseKey.c_is_latest_lease),
|
|
|
"1", leaseNeedUploadId));
|
|
|
- updateStringValue(newWorkingLease, String.valueOf(LeaseKey.c_is_latest_lease), "2", leaseNeedUploadId);
|
|
|
+ JSONDataTool.updateStringValue(newWorkingLease, String.valueOf(LeaseKey.c_is_latest_lease), "2", leaseNeedUploadId);
|
|
|
}
|
|
|
|
|
|
private boolean shouldLeaseUpdate(List<JSONObject> allLastWorkingLease, JSONObject workingLease) {
|
|
|
@@ -416,13 +418,13 @@ public class DataPreCounter {
|
|
|
.map(parkDataCount::new)
|
|
|
.reduce(new parkDataCount(), parkDataCount::add, parkDataCount::add);
|
|
|
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_building_area), countResult.buildArea.doubleValue(), parkNeedUploadId);
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_sellable_area), countResult.sellableArea.doubleValue(), parkNeedUploadId);
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_sold_area), countResult.soldArea.doubleValue(), parkNeedUploadId);
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_rentable_area), countResult.rentableArea.doubleValue(), parkNeedUploadId);
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_rented_area), countResult.rentedArea.doubleValue(), parkNeedUploadId);
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_self_used_area), countResult.selfUseArea.doubleValue(), parkNeedUploadId);
|
|
|
- updateDoubleValue(father, String.valueOf(ParkKey.c_vacant_area), countResult.vacantArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_building_area), countResult.buildArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_sellable_area), countResult.sellableArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_sold_area), countResult.soldArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_rentable_area), countResult.rentableArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_rented_area), countResult.rentedArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_self_used_area), countResult.selfUseArea.doubleValue(), parkNeedUploadId);
|
|
|
+ JSONDataTool.updateDoubleValue(father, String.valueOf(ParkKey.c_vacant_area), countResult.vacantArea.doubleValue(), parkNeedUploadId);
|
|
|
}
|
|
|
|
|
|
private static BigDecimal nullToZero(BigDecimal v) {
|
|
|
@@ -449,20 +451,4 @@ public class DataPreCounter {
|
|
|
return getKeyAndPackToTime(lease, String.valueOf(LeaseKey.c_end_date));
|
|
|
}
|
|
|
|
|
|
- private void updateStringValue(JSONObject obj, String key, String value, Set<String> uploadList) {
|
|
|
- String oldValue = obj.getString(key);
|
|
|
- if (!Objects.equals(oldValue, value)) {
|
|
|
- obj.put(key, value);
|
|
|
- uploadList.add(obj.getString("id"));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void updateDoubleValue(JSONObject obj, String key, Double value, Set<String> uploadList) {
|
|
|
- Double oldValue = obj.getDouble(key);
|
|
|
-
|
|
|
- if (!Objects.equals(oldValue, value)) {
|
|
|
- obj.put(key, value);
|
|
|
- uploadList.add(obj.getString("id"));
|
|
|
- }
|
|
|
- }
|
|
|
}
|