fix:兼容老数据detail会创建新数据的问题
This commit is contained in:
@@ -289,15 +289,15 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
response.setDesignItemUrl(url);
|
response.setDesignItemUrl(url);
|
||||||
//更新item
|
//更新item
|
||||||
updateById(designItem);
|
updateById(designItem);
|
||||||
|
|
||||||
// 查询现有的记录,用于 saveOrUpdate
|
// 查询现有的记录,用于 saveOrUpdate
|
||||||
List<DesignItemDetail> existingDetails = designItemDetailService.selectByDesignItemId(designItemId);
|
List<DesignItemDetail> existingDetails = designItemDetailService.selectByDesignItemId(designItemId);
|
||||||
// 创建 Map,以 priority 为 key,方便快速查找
|
// 创建 Map,以 priority 为 key,方便快速查找
|
||||||
Map<Integer, DesignItemDetail> existingDetailMap = existingDetails.stream()
|
Map<Integer, DesignItemDetail> existingDetailMap = existingDetails.stream()
|
||||||
|
.filter(detail -> Objects.nonNull(detail.getPriority()))
|
||||||
.collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old));
|
.collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old));
|
||||||
|
Map<String, Deque<DesignItemDetail>> detailBuckets = buildDetailTypeBuckets(existingDetails);
|
||||||
// 收集新 detail 的 priority,用于后续删除不存在的旧记录
|
Set<Long> reusedDetailIds = new HashSet<>();
|
||||||
Set<Integer> newDetailPriorities = new HashSet<>();
|
|
||||||
|
|
||||||
List<DesignItemDetail> designItemDetails = Lists.newArrayList();
|
List<DesignItemDetail> designItemDetails = Lists.newArrayList();
|
||||||
pythonObjects.getObjects().get(0).getItems().forEach(detail -> {
|
pythonObjects.getObjects().get(0).getItems().forEach(detail -> {
|
||||||
@@ -305,20 +305,16 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority();
|
Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority();
|
||||||
newDetailPriorities.add(priority);
|
|
||||||
|
DesignItemDetail designItemDetail = reuseDesignItemDetail(priority, detail.getType(),
|
||||||
DesignItemDetail designItemDetail;
|
existingDetailMap, detailBuckets, reusedDetailIds);
|
||||||
// 如果存在相同 priority 的记录,则更新;否则创建新记录
|
if (Objects.nonNull(designItemDetail)) {
|
||||||
if (existingDetailMap.containsKey(priority)) {
|
|
||||||
// 更新现有记录
|
|
||||||
designItemDetail = existingDetailMap.get(priority);
|
|
||||||
designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone));
|
designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone));
|
||||||
} else {
|
} else {
|
||||||
// 创建新记录
|
|
||||||
designItemDetail = new DesignItemDetail();
|
designItemDetail = new DesignItemDetail();
|
||||||
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
|
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置/更新字段
|
// 设置/更新字段
|
||||||
designItemDetail.setAccountId(userInfo.getId());
|
designItemDetail.setAccountId(userInfo.getId());
|
||||||
designItemDetail.setDesignId(designId);
|
designItemDetail.setDesignId(designId);
|
||||||
@@ -334,6 +330,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
// 非BODY类型使用path字段
|
// 非BODY类型使用path字段
|
||||||
designItemDetail.setPath(detail.getPath());
|
designItemDetail.setPath(detail.getPath());
|
||||||
}
|
}
|
||||||
|
designItemDetail.setColor(detail.getColor());
|
||||||
designItemDetail.setIconPath(detail.getIcon());
|
designItemDetail.setIconPath(detail.getIcon());
|
||||||
// todo
|
// todo
|
||||||
DesignPythonItemPrint printObject = detail.getPrint().getSingle();
|
DesignPythonItemPrint printObject = detail.getPrint().getSingle();
|
||||||
@@ -341,19 +338,18 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
designItemDetail.setPrintJson(JSON.toJSONString(printObject));
|
designItemDetail.setPrintJson(JSON.toJSONString(printObject));
|
||||||
designItemDetails.add(designItemDetail);
|
designItemDetails.add(designItemDetail);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 逻辑删除不在新列表中的旧记录
|
// 逻辑删除未复用的旧记录
|
||||||
existingDetails.forEach(existingDetail -> {
|
existingDetails.stream()
|
||||||
if (!newDetailPriorities.contains(existingDetail.getPriority())) {
|
.filter(existingDetail -> Objects.nonNull(existingDetail.getId()) && !reusedDetailIds.contains(existingDetail.getId()))
|
||||||
// 该记录不在新列表中,需要逻辑删除
|
.forEach(existingDetail -> {
|
||||||
UpdateWrapper<DesignItemDetail> updateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<DesignItemDetail> updateWrapper = new UpdateWrapper<>();
|
||||||
updateWrapper.eq("id", existingDetail.getId());
|
updateWrapper.eq("id", existingDetail.getId());
|
||||||
updateWrapper.set("is_deleted", (byte) 1);
|
updateWrapper.set("is_deleted", (byte) 1);
|
||||||
updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone));
|
updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone));
|
||||||
designItemDetailService.update(null, updateWrapper);
|
designItemDetailService.update(null, updateWrapper);
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
designItemDetailService.saveOrUpdateBatch(designItemDetails);
|
designItemDetailService.saveOrUpdateBatch(designItemDetails);
|
||||||
//封装item信息
|
//封装item信息
|
||||||
List<DesignCollectionItemVO> designCollectionItems = CopyUtil.copyList(getByDesignId(designId)
|
List<DesignCollectionItemVO> designCollectionItems = CopyUtil.copyList(getByDesignId(designId)
|
||||||
@@ -383,16 +379,16 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
// 1、更新designItem
|
// 1、更新designItem
|
||||||
// updateById(designItem);
|
// updateById(designItem);
|
||||||
updateDesignItem(designItem);
|
updateDesignItem(designItem);
|
||||||
|
|
||||||
// 2、查询现有的记录,用于 saveOrUpdate
|
// 2、查询现有的记录,用于 saveOrUpdate
|
||||||
List<DesignItemDetail> existingDetails = designItemDetailService.selectByDesignItemId(designItemId);
|
List<DesignItemDetail> existingDetails = designItemDetailService.selectByDesignItemId(designItemId);
|
||||||
// 创建 Map,以 priority 为 key,方便快速查找
|
// 创建 Map,以 priority 为 key,方便快速查找
|
||||||
Map<Integer, DesignItemDetail> existingDetailMap = existingDetails.stream()
|
Map<Integer, DesignItemDetail> existingDetailMap = existingDetails.stream()
|
||||||
|
.filter(detail -> Objects.nonNull(detail.getPriority()))
|
||||||
.collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old));
|
.collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old));
|
||||||
|
Map<String, Deque<DesignItemDetail>> detailBuckets = buildDetailTypeBuckets(existingDetails);
|
||||||
|
Set<Long> reusedDetailIds = new HashSet<>();
|
||||||
|
|
||||||
// 收集新 detail 的 priority,用于后续删除不存在的旧记录
|
|
||||||
Set<Integer> newDetailPriorities = new HashSet<>();
|
|
||||||
|
|
||||||
List<DesignItemDetail> designItemDetails = Lists.newArrayList();
|
List<DesignItemDetail> designItemDetails = Lists.newArrayList();
|
||||||
// 3、保存新的designItemDetail(使用 saveOrUpdate 方式)
|
// 3、保存新的designItemDetail(使用 saveOrUpdate 方式)
|
||||||
pythonObjects.getObjects().get(0).getItems().forEach(detail -> {
|
pythonObjects.getObjects().get(0).getItems().forEach(detail -> {
|
||||||
@@ -400,20 +396,16 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority();
|
Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority();
|
||||||
newDetailPriorities.add(priority);
|
|
||||||
|
DesignItemDetail designItemDetail = reuseDesignItemDetail(priority, detail.getType(),
|
||||||
DesignItemDetail designItemDetail;
|
existingDetailMap, detailBuckets, reusedDetailIds);
|
||||||
// 如果存在相同 priority 的记录,则更新;否则创建新记录
|
if (Objects.nonNull(designItemDetail)) {
|
||||||
if (existingDetailMap.containsKey(priority)) {
|
|
||||||
// 更新现有记录
|
|
||||||
designItemDetail = existingDetailMap.get(priority);
|
|
||||||
designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone));
|
designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone));
|
||||||
} else {
|
} else {
|
||||||
// 创建新记录
|
|
||||||
designItemDetail = new DesignItemDetail();
|
designItemDetail = new DesignItemDetail();
|
||||||
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
|
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置/更新字段
|
// 设置/更新字段
|
||||||
designItemDetail.setAccountId(userId);
|
designItemDetail.setAccountId(userId);
|
||||||
designItemDetail.setDesignId(designId);
|
designItemDetail.setDesignId(designId);
|
||||||
@@ -429,29 +421,35 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
// 非BODY类型使用path字段
|
// 非BODY类型使用path字段
|
||||||
designItemDetail.setPath(detail.getPath());
|
designItemDetail.setPath(detail.getPath());
|
||||||
}
|
}
|
||||||
|
designItemDetail.setColor(detail.getColor());
|
||||||
designItemDetail.setIconPath(detail.getIcon());
|
designItemDetail.setIconPath(detail.getIcon());
|
||||||
// designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getType().toLowerCase()));
|
// designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getType().toLowerCase()));
|
||||||
if (!detail.getType().equals("Body")) {
|
if (!detail.getType().equals("Body")) {
|
||||||
designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getPriority().toString()).get(0));
|
designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getPriority().toString()).get(0));
|
||||||
designItemDetail.setUndividedLayerWithSinglePrint(priorityAndUndividedLayer.get(detail.getPriority().toString()).get(1));
|
designItemDetail.setUndividedLayerWithSinglePrint(priorityAndUndividedLayer.get(detail.getPriority().toString()).get(1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// 印花存储在design_item_detail_print表中 这里还要存吗?
|
||||||
|
// DesignPythonItemPrint printObject = detail.getPrintToPython();
|
||||||
|
// designItemDetail.setPrintPath(Objects.isNull(printObject) ? "" : printObject.getPath());
|
||||||
|
// 当有多个印花后,返回的printObject太长,导致存储到数据库时报错
|
||||||
|
// designItemDetail.setPrintJson(JSON.toJSONString(printObject));
|
||||||
|
|
||||||
designItemDetail.setPartialDesign(Objects.isNull(detail.getPrint()) ? null : detail.getPrint().getPartial());
|
designItemDetail.setPartialDesign(Objects.isNull(detail.getPrint()) ? null : detail.getPrint().getPartial());
|
||||||
designItemDetails.add(designItemDetail);
|
designItemDetails.add(designItemDetail);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 逻辑删除不在新列表中的旧记录
|
// 逻辑删除未复用的旧记录
|
||||||
existingDetails.forEach(existingDetail -> {
|
existingDetails.stream()
|
||||||
if (!newDetailPriorities.contains(existingDetail.getPriority())) {
|
.filter(existingDetail -> Objects.nonNull(existingDetail.getId()) && !reusedDetailIds.contains(existingDetail.getId()))
|
||||||
// 该记录不在新列表中,需要逻辑删除
|
.forEach(existingDetail -> {
|
||||||
UpdateWrapper<DesignItemDetail> updateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<DesignItemDetail> updateWrapper = new UpdateWrapper<>();
|
||||||
updateWrapper.eq("id", existingDetail.getId());
|
updateWrapper.eq("id", existingDetail.getId());
|
||||||
updateWrapper.set("is_deleted", (byte) 1);
|
updateWrapper.set("is_deleted", (byte) 1);
|
||||||
updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone));
|
updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone));
|
||||||
designItemDetailService.update(null, updateWrapper);
|
designItemDetailService.update(null, updateWrapper);
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
// businessId 来自t_sys_file或者t_library
|
// businessId 来自t_sys_file或者t_library
|
||||||
designItemDetailService.saveOrUpdateBatch(designItemDetails);
|
designItemDetailService.saveOrUpdateBatch(designItemDetails);
|
||||||
|
|
||||||
@@ -470,10 +468,10 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
List<TDesignPythonOutfitDetail> existingLayers = designPythonOutfitDetailService.getDetailByDesignPythonOutfitId(designPythonOutfit.getId());
|
List<TDesignPythonOutfitDetail> existingLayers = designPythonOutfitDetailService.getDetailByDesignPythonOutfitId(designPythonOutfit.getId());
|
||||||
// 创建 Map,以 priority 为 key,方便快速查找
|
// 创建 Map,以 priority 为 key,方便快速查找
|
||||||
Map<Integer, TDesignPythonOutfitDetail> existingLayerMap = existingLayers.stream()
|
Map<Integer, TDesignPythonOutfitDetail> existingLayerMap = existingLayers.stream()
|
||||||
.collect(Collectors.toMap(TDesignPythonOutfitDetail::getPriority, layer -> layer, (old, newVal) -> old));
|
.filter(layer -> Objects.nonNull(layer.getPriority()))
|
||||||
|
.collect(Collectors.toMap(layer -> Math.abs(layer.getPriority()), layer -> layer, (old, newVal) -> old));
|
||||||
// 收集新 layer 的 priority,用于后续删除不存在的旧记录
|
Map<String, Deque<TDesignPythonOutfitDetail>> layerBuckets = buildOutfitCategoryBuckets(existingLayers);
|
||||||
Set<Integer> newLayerPriorities = new HashSet<>();
|
Set<Long> reusedLayerIds = new HashSet<>();
|
||||||
|
|
||||||
// 7、将新生成的图层信息存入designPythonOutfitDetail表(使用 saveOrUpdate 方式)
|
// 7、将新生成的图层信息存入designPythonOutfitDetail表(使用 saveOrUpdate 方式)
|
||||||
JSONArray layers = outfit.getJSONArray("layers");
|
JSONArray layers = outfit.getJSONArray("layers");
|
||||||
@@ -487,20 +485,16 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
for (int i = 0; i < layers.size(); i++) {
|
for (int i = 0; i < layers.size(); i++) {
|
||||||
JSONObject jsonObject = layers.getJSONObject(i);
|
JSONObject jsonObject = layers.getJSONObject(i);
|
||||||
Integer priority = (Integer) jsonObject.get("priority");
|
Integer priority = (Integer) jsonObject.get("priority");
|
||||||
newLayerPriorities.add(Math.abs(priority));
|
|
||||||
|
TDesignPythonOutfitDetail designPythonOutfitDetail = reuseOutfitDetail(priority,
|
||||||
TDesignPythonOutfitDetail designPythonOutfitDetail;
|
jsonObject.getString("image_category"), existingLayerMap, layerBuckets, reusedLayerIds);
|
||||||
// 如果存在相同 priority 的记录,则更新;否则创建新记录
|
if (Objects.nonNull(designPythonOutfitDetail)) {
|
||||||
if (existingLayerMap.containsKey(Math.abs(priority))) {
|
|
||||||
// 更新现有记录
|
|
||||||
designPythonOutfitDetail = existingLayerMap.get(Math.abs(priority));
|
|
||||||
designPythonOutfitDetail.setUpdateDate(LocalDateTime.now(ZoneId.of(timeZone)));
|
designPythonOutfitDetail.setUpdateDate(LocalDateTime.now(ZoneId.of(timeZone)));
|
||||||
} else {
|
} else {
|
||||||
// 创建新记录
|
|
||||||
designPythonOutfitDetail = new TDesignPythonOutfitDetail();
|
designPythonOutfitDetail = new TDesignPythonOutfitDetail();
|
||||||
designPythonOutfitDetail.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone)));
|
designPythonOutfitDetail.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置/更新字段
|
// 设置/更新字段
|
||||||
designPythonOutfitDetail.setDesignId(designId);
|
designPythonOutfitDetail.setDesignId(designId);
|
||||||
designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId());
|
designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId());
|
||||||
@@ -515,21 +509,20 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(priority))));
|
designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(priority))));
|
||||||
}
|
}
|
||||||
designPythonOutfitDetail.setPriority(priority);
|
designPythonOutfitDetail.setPriority(priority);
|
||||||
|
|
||||||
list.add(designPythonOutfitDetail);
|
list.add(designPythonOutfitDetail);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 逻辑删除不在新列表中的旧记录
|
// 逻辑删除未复用的旧记录
|
||||||
existingLayers.forEach(existingLayer -> {
|
existingLayers.stream()
|
||||||
if (!newLayerPriorities.contains(Math.abs(existingLayer.getPriority()))) {
|
.filter(existingLayer -> Objects.nonNull(existingLayer.getId()) && !reusedLayerIds.contains(existingLayer.getId()))
|
||||||
// 该记录不在新列表中,需要逻辑删除
|
.forEach(existingLayer -> {
|
||||||
UpdateWrapper<TDesignPythonOutfitDetail> updateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<TDesignPythonOutfitDetail> updateWrapper = new UpdateWrapper<>();
|
||||||
updateWrapper.eq("id", existingLayer.getId());
|
updateWrapper.eq("id", existingLayer.getId());
|
||||||
updateWrapper.set("is_deleted", 1);
|
updateWrapper.set("is_deleted", 1);
|
||||||
updateWrapper.set("update_date", LocalDateTime.now(ZoneId.of(timeZone)));
|
updateWrapper.set("update_date", LocalDateTime.now(ZoneId.of(timeZone)));
|
||||||
designPythonOutfitDetailService.update(null, updateWrapper);
|
designPythonOutfitDetailService.update(null, updateWrapper);
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
designPythonOutfitDetailService.saveOrUpdateBatch(list);
|
designPythonOutfitDetailService.saveOrUpdateBatch(list);
|
||||||
|
|
||||||
@@ -569,6 +562,112 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<String, Deque<DesignItemDetail>> buildDetailTypeBuckets(List<DesignItemDetail> details) {
|
||||||
|
return details.stream()
|
||||||
|
.collect(Collectors.groupingBy(DesignItemDetail::getType,
|
||||||
|
Collectors.collectingAndThen(Collectors.toList(), list -> {
|
||||||
|
list.sort(Comparator
|
||||||
|
.comparingInt(this::extractDetailPriorityForSort)
|
||||||
|
.thenComparing(DesignItemDetail::getId, Comparator.nullsLast(Long::compareTo)));
|
||||||
|
return new ArrayDeque<>(list);
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
private DesignItemDetail reuseDesignItemDetail(Integer priority, String type,
|
||||||
|
Map<Integer, DesignItemDetail> priorityMap,
|
||||||
|
Map<String, Deque<DesignItemDetail>> typeBuckets,
|
||||||
|
Set<Long> reusedIds) {
|
||||||
|
DesignItemDetail reused = null;
|
||||||
|
if (Objects.nonNull(priority)) {
|
||||||
|
reused = priorityMap.remove(priority);
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(reused)) {
|
||||||
|
markReusedDetail(reused, reusedIds);
|
||||||
|
return reused;
|
||||||
|
}
|
||||||
|
Deque<DesignItemDetail> bucket = typeBuckets.get(type);
|
||||||
|
while (bucket != null && !bucket.isEmpty()) {
|
||||||
|
DesignItemDetail candidate = bucket.pollFirst();
|
||||||
|
if (markReusedDetail(candidate, reusedIds)) {
|
||||||
|
Integer candidatePriority = candidate.getPriority();
|
||||||
|
if (Objects.nonNull(candidatePriority)) {
|
||||||
|
priorityMap.remove(candidatePriority, candidate);
|
||||||
|
}
|
||||||
|
return candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Deque<TDesignPythonOutfitDetail>> buildOutfitCategoryBuckets(List<TDesignPythonOutfitDetail> details) {
|
||||||
|
return details.stream()
|
||||||
|
.collect(Collectors.groupingBy(TDesignPythonOutfitDetail::getImageCategory,
|
||||||
|
Collectors.collectingAndThen(Collectors.toList(), list -> {
|
||||||
|
list.sort(Comparator
|
||||||
|
.comparingInt(this::extractOutfitPriorityForSort)
|
||||||
|
.thenComparing(TDesignPythonOutfitDetail::getId, Comparator.nullsLast(Long::compareTo)));
|
||||||
|
return new ArrayDeque<>(list);
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
private TDesignPythonOutfitDetail reuseOutfitDetail(Integer priority, String imageCategory,
|
||||||
|
Map<Integer, TDesignPythonOutfitDetail> priorityMap,
|
||||||
|
Map<String, Deque<TDesignPythonOutfitDetail>> categoryBuckets,
|
||||||
|
Set<Long> reusedIds) {
|
||||||
|
TDesignPythonOutfitDetail reused = null;
|
||||||
|
if (Objects.nonNull(priority)) {
|
||||||
|
reused = priorityMap.remove(Math.abs(priority));
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(reused)) {
|
||||||
|
markReusedLayer(reused, reusedIds);
|
||||||
|
return reused;
|
||||||
|
}
|
||||||
|
Deque<TDesignPythonOutfitDetail> bucket = categoryBuckets.get(imageCategory);
|
||||||
|
while (bucket != null && !bucket.isEmpty()) {
|
||||||
|
TDesignPythonOutfitDetail candidate = bucket.pollFirst();
|
||||||
|
if (markReusedLayer(candidate, reusedIds)) {
|
||||||
|
Integer candidatePriority = candidate.getPriority();
|
||||||
|
if (Objects.nonNull(candidatePriority)) {
|
||||||
|
priorityMap.remove(Math.abs(candidatePriority), candidate);
|
||||||
|
}
|
||||||
|
return candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean markReusedDetail(DesignItemDetail detail, Set<Long> reusedIds) {
|
||||||
|
if (Objects.isNull(detail)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Long id = detail.getId();
|
||||||
|
return Objects.isNull(id) || reusedIds.add(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean markReusedLayer(TDesignPythonOutfitDetail detail, Set<Long> reusedIds) {
|
||||||
|
if (Objects.isNull(detail)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Long id = detail.getId();
|
||||||
|
return Objects.isNull(id) || reusedIds.add(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int safePriorityValue(Integer priority) {
|
||||||
|
return Objects.isNull(priority) ? Integer.MAX_VALUE : priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int safeAbsPriorityValue(Integer priority) {
|
||||||
|
return Objects.isNull(priority) ? Integer.MAX_VALUE : Math.abs(priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int extractDetailPriorityForSort(DesignItemDetail detail) {
|
||||||
|
return safePriorityValue(detail.getPriority());
|
||||||
|
}
|
||||||
|
|
||||||
|
private int extractOutfitPriorityForSort(TDesignPythonOutfitDetail detail) {
|
||||||
|
return safeAbsPriorityValue(detail.getPriority());
|
||||||
|
}
|
||||||
|
|
||||||
private DesignItem selectById(Long id) {
|
private DesignItem selectById(Long id) {
|
||||||
QueryWrapper<DesignItem> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<DesignItem> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("id", id);
|
queryWrapper.eq("id", id);
|
||||||
@@ -1061,7 +1160,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
}
|
}
|
||||||
|
|
||||||
Long designItemDetailId = designItemDetailTypeIdMap.get(designSingleItem.getPriority());
|
Long designItemDetailId = designItemDetailTypeIdMap.get(designSingleItem.getPriority());
|
||||||
|
|
||||||
// 查询现有的记录,用于 saveOrUpdate
|
// 查询现有的记录,用于 saveOrUpdate
|
||||||
List<DesignItemDetailPrint> existingPrints = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailId, printType);
|
List<DesignItemDetailPrint> existingPrints = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailId, printType);
|
||||||
// 创建 Map,以 priority 为 key,方便快速查找
|
// 创建 Map,以 priority 为 key,方便快速查找
|
||||||
@@ -1075,10 +1174,10 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
// 处理新的印花列表
|
// 处理新的印花列表
|
||||||
printObject.getPrints().forEach(print -> {
|
printObject.getPrints().forEach(print -> {
|
||||||
setUriToMinioPath(print);
|
setUriToMinioPath(print);
|
||||||
|
|
||||||
Integer priority = print.getPriority();
|
Integer priority = print.getPriority();
|
||||||
newPrintPriorities.add(priority);
|
newPrintPriorities.add(priority);
|
||||||
|
|
||||||
DesignItemDetailPrint designItemDetailPrint;
|
DesignItemDetailPrint designItemDetailPrint;
|
||||||
// 如果存在相同 priority 的记录,则更新;否则创建新记录
|
// 如果存在相同 priority 的记录,则更新;否则创建新记录
|
||||||
if (existingPrintMap.containsKey(priority)) {
|
if (existingPrintMap.containsKey(priority)) {
|
||||||
@@ -1090,7 +1189,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
designItemDetailPrint = new DesignItemDetailPrint();
|
designItemDetailPrint = new DesignItemDetailPrint();
|
||||||
designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone)));
|
designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置/更新字段
|
// 设置/更新字段
|
||||||
designItemDetailPrint.setDesignItemDetailId(designItemDetailId);
|
designItemDetailPrint.setDesignItemDetailId(designItemDetailId);
|
||||||
designItemDetailPrint.setPrintType(printType);
|
designItemDetailPrint.setPrintType(printType);
|
||||||
@@ -1102,7 +1201,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
|||||||
designItemDetailPrint.setPosition(print.getLocation().toString());
|
designItemDetailPrint.setPosition(print.getLocation().toString());
|
||||||
designItemDetailPrint.setAngle(print.getAngle());
|
designItemDetailPrint.setAngle(print.getAngle());
|
||||||
designItemDetailPrint.setPriority(priority);
|
designItemDetailPrint.setPriority(priority);
|
||||||
|
|
||||||
designItemDetailPrints.add(designItemDetailPrint);
|
designItemDetailPrints.add(designItemDetailPrint);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user