Skip to content

Commit b4b8b1a

Browse files
committed
refactor: Replace HashMap with ConcurrentHashMap and clean up unused imports
1 parent a23717f commit b4b8b1a

3 files changed

Lines changed: 33 additions & 30 deletions

File tree

backend/crm/src/main/java/cn/cordys/common/resolver/field/ModuleFieldResolverFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*/
1010
public class ModuleFieldResolverFactory {
1111

12-
private static final HashMap<String, AbstractModuleFieldResolver> resolverMap = new HashMap<>();
12+
private static final HashMap<String, AbstractModuleFieldResolver<?>> resolverMap = new HashMap<>();
1313

1414
private static final DefaultModuleFieldResolver defaultModuleFieldResolver = new DefaultModuleFieldResolver();
1515

@@ -47,8 +47,8 @@ public class ModuleFieldResolverFactory {
4747
resolverMap.put(FieldType.FORMULA.name(), new FormulaResolver());
4848
}
4949

50-
public static AbstractModuleFieldResolver getResolver(String type) {
51-
AbstractModuleFieldResolver moduleFieldResolver = resolverMap.get(type);
50+
public static AbstractModuleFieldResolver<?> getResolver(String type) {
51+
var moduleFieldResolver = resolverMap.get(type);
5252
return moduleFieldResolver == null ? defaultModuleFieldResolver : moduleFieldResolver;
5353
}
5454
}

backend/crm/src/main/java/cn/cordys/common/service/BaseExportService.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@
4949
import java.io.File;
5050
import java.lang.reflect.Field;
5151
import java.util.*;
52-
import java.util.concurrent.ExecutorService;
53-
import java.util.concurrent.Executors;
5452
import java.util.concurrent.atomic.AtomicInteger;
5553
import java.util.concurrent.atomic.AtomicReference;
5654
import java.util.function.Function;
@@ -78,9 +76,6 @@ public abstract class BaseExportService {
7876
@Resource
7977
private ExportTaskService exportTaskService;
8078

81-
private final ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
82-
83-
8479
public Map<String, BaseField> getFieldConfigMap(String formKey, String orgId) {
8580
return Objects.requireNonNull(CommonBeanFactory.getBean(ModuleFormService.class))
8681
.getAllFields(formKey, orgId)
@@ -331,7 +326,7 @@ private List<List<String>> getExportMergeHeadList(List<ExportHeadDTO> headList,
331326
* @return 单行记录值
332327
*/
333328
public List<Object> transFieldValueWithSub(List<FieldExportMeta> metas, LinkedHashMap<String, Object> sysFieldValMap, Map<String, Object> normalFieldMap,
334-
Map<String, Object> subRowMap, HashMap<Object, Object> cacheMap) {
329+
Map<String, Object> subRowMap, Map<Object, Object> cacheMap) {
335330
List<Object> dataList = new ArrayList<>(metas.size());
336331
for (FieldExportMeta meta : metas) {
337332
BaseField field = meta.getField();
@@ -375,7 +370,7 @@ public List<Object> transFieldValueWithSub(List<FieldExportMeta> metas, LinkedHa
375370
}
376371

377372
@SuppressWarnings({"rawtypes", "unchecked"})
378-
public Object transformFieldValue(AbstractModuleFieldResolver resolver, BaseField field, Object value, HashMap<Object, Object> cacheMap) {
373+
public Object transformFieldValue(AbstractModuleFieldResolver resolver, BaseField field, Object value, Map<Object, Object> cacheMap) {
379374
if (value == null) {
380375
return null;
381376
}
@@ -416,7 +411,7 @@ public Object transformFieldValue(BaseField field, Object value) {
416411
*
417412
* @return 导出数据列表
418413
*/
419-
protected List<List<Object>> buildDataWithSub(List<BaseModuleFieldValue> moduleFieldValues, ExportFieldParam exportFieldParam, List<FieldExportMeta> metas, LinkedHashMap<String, Object> systemFieldMap, HashMap<Object, Object> cacheMap) {
414+
protected List<List<Object>> buildDataWithSub(List<BaseModuleFieldValue> moduleFieldValues, ExportFieldParam exportFieldParam, List<FieldExportMeta> metas, LinkedHashMap<String, Object> systemFieldMap, Map<Object, Object> cacheMap) {
420415
List<List<Object>> dataList = new ArrayList<>();
421416
if (org.apache.commons.collections4.CollectionUtils.isEmpty(moduleFieldValues)) {
422417
// 无自定义字段, 导出系统字段值, 单行导出

backend/crm/src/main/java/cn/cordys/crm/contract/service/ContractExportService.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@
1919
import lombok.extern.slf4j.Slf4j;
2020
import org.apache.commons.collections4.CollectionUtils;
2121
import org.apache.commons.lang3.StringUtils;
22-
import org.apache.commons.lang3.Strings;
2322
import org.apache.commons.lang3.tuple.Pair;
2423
import org.springframework.stereotype.Service;
2524
import org.springframework.transaction.annotation.Transactional;
2625

2726
import java.util.*;
28-
import java.util.concurrent.ExecutorService;
29-
import java.util.concurrent.Executors;
30-
import java.util.concurrent.Future;
31-
import java.util.concurrent.Semaphore;
27+
import java.util.concurrent.*;
28+
import java.util.function.Function;
29+
import java.util.stream.Collectors;
3230

3331
@Service
3432
@Transactional(rollbackFor = Exception.class)
@@ -82,7 +80,7 @@ private MergeResult parallelBuildMergeResult(String taskId, ExportDTO exportPara
8280
List<ContractListResponse> dataList,
8381
ExportFieldParam exportFieldParam) {
8482
int size = dataList.size();
85-
var cacheMap = new HashMap<>();
83+
var cacheMap = new ConcurrentHashMap<>();
8684
List<List<Object>> mergeRowData = new ArrayList<>(size);
8785
List<int[]> mergeRegions = new ArrayList<>();
8886

@@ -99,8 +97,7 @@ private MergeResult parallelBuildMergeResult(String taskId, ExportDTO exportPara
9997
// 获取数据库访问许可
10098
dbSemaphore.acquire();
10199
try {
102-
List<List<Object>> buildData = buildData(detail, exportFieldParam,
103-
exportParam.getExportMetas(), cacheMap);
100+
List<List<Object>> buildData = buildData(detail, exportFieldParam, exportParam.getExportMetas(), cacheMap);
104101
return Pair.of(idx, buildData);
105102
} finally {
106103
dbSemaphore.release(); // 确保释放
@@ -139,7 +136,7 @@ private MergeResult parallelBuildMergeResult(String taskId, ExportDTO exportPara
139136
.build();
140137
}
141138

142-
private List<List<Object>> buildData(ContractListResponse detail, ExportFieldParam exportFieldParam, List<FieldExportMeta> exportMetas, HashMap<Object, Object> cacheMap) {
139+
private List<List<Object>> buildData(ContractListResponse detail, ExportFieldParam exportFieldParam, List<FieldExportMeta> exportMetas, Map<Object, Object> cacheMap) {
143140
return buildDataWithSub(detail.getModuleFields(), exportFieldParam, exportMetas, getSystemFieldMap(detail, exportMetas), cacheMap);
144141
}
145142

@@ -152,28 +149,39 @@ public LinkedHashMap<String, Object> getSystemFieldMap(ContractListResponse data
152149
systemFieldMap.put("amount", data.getAmount());
153150
systemFieldMap.put("alreadyPayAmount", data.getAlreadyPayAmount());
154151
systemFieldMap.put("number", data.getNumber());
152+
155153
if (StringUtils.isNotBlank(data.getApprovalStatus())) {
156154
systemFieldMap.put("approvalStatus", Translator.get("contract.approval_status." + data.getApprovalStatus().toLowerCase(), Locale.SIMPLIFIED_CHINESE));
157155
}
158156
if (StringUtils.isNotBlank(data.getStage())) {
159157
systemFieldMap.put("stage", Translator.get("contract.stage." + data.getStage().toLowerCase(), Locale.SIMPLIFIED_CHINESE));
160158
}
159+
161160
systemFieldMap.put("createUser", data.getCreateUserName());
162161
systemFieldMap.put("createTime", TimeUtils.getDateTimeStr(data.getCreateTime()));
163162
systemFieldMap.put("updateUser", data.getUpdateUserName());
164163
systemFieldMap.put("updateTime", TimeUtils.getDateTimeStr(data.getUpdateTime()));
165164
systemFieldMap.put("voidReason", data.getVoidReason());
166165

167-
FieldExportMeta startTime = exportMetas.stream().filter(field -> Strings.CI.equals(field.getBusinessKey(), "startTime")).findFirst().orElse(null);
168-
if (startTime != null) {
169-
AbstractModuleFieldResolver customFieldResolver = ModuleFieldResolverFactory.getResolver(startTime.getField().getType());
170-
systemFieldMap.put("startTime", customFieldResolver.transformToValue(startTime.getField(), String.valueOf(data.getStartTime())));
171-
}
172-
FieldExportMeta endTime = exportMetas.stream().filter(field -> Strings.CI.equals(field.getBusinessKey(), "endTime")).findFirst().orElse(null);
173-
if (endTime != null) {
174-
AbstractModuleFieldResolver customFieldResolver = ModuleFieldResolverFactory.getResolver(endTime.getField().getType());
175-
systemFieldMap.put("endTime", customFieldResolver.transformToValue(endTime.getField(), String.valueOf(data.getEndTime())));
176-
}
166+
// 将 exportMetas 转为 Map,避免重复遍历
167+
Map<String, FieldExportMeta> metaMap = exportMetas.stream()
168+
.collect(Collectors.toMap(FieldExportMeta::getBusinessKey, Function.identity(), (a, b) -> a));
169+
170+
resolveAndPutTimeField(systemFieldMap, metaMap, "startTime", String.valueOf(data.getStartTime()));
171+
resolveAndPutTimeField(systemFieldMap, metaMap, "endTime", String.valueOf(data.getEndTime()));
172+
177173
return systemFieldMap;
178174
}
175+
176+
private void resolveAndPutTimeField(LinkedHashMap<String, Object> map,
177+
Map<String, FieldExportMeta> metaMap,
178+
String businessKey,
179+
String rawValue) {
180+
FieldExportMeta meta = metaMap.get(businessKey);
181+
if (meta != null) {
182+
AbstractModuleFieldResolver resolver = ModuleFieldResolverFactory.getResolver(meta.getField().getType());
183+
map.put(businessKey, resolver.transformToValue(meta.getField(), rawValue));
184+
}
185+
}
186+
179187
}

0 commit comments

Comments
 (0)