diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java index 21220cef..ab293a1c 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java @@ -19,6 +19,7 @@ public class DesignItemDetailPrintServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_item_detail_id", designItemDetailId); queryWrapper.eq("print_type", printType); + queryWrapper.eq("is_deleted", 0); return baseMapper.selectList(queryWrapper); } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java index e5406560..5c55ad3c 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java @@ -65,6 +65,7 @@ public class DesignItemDetailServiceImpl extends ServiceImpl selectByDesignItemId(Long designItemId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_item_id", designItemId); + queryWrapper.eq("is_deleted", 0); return designItemDetailMapper.selectList(queryWrapper); } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index ccb3a151..f3b798c9 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -23,6 +23,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -288,24 +289,50 @@ public class DesignItemServiceImpl extends ServiceImpl existingDetails = designItemDetailService.selectByDesignItemId(designItemId); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingDetailMap = existingDetails.stream() + .collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old)); + + // 收集新 detail 的 priority,用于后续删除不存在的旧记录 + Set newDetailPriorities = new HashSet<>(); List designItemDetails = Lists.newArrayList(); pythonObjects.getObjects().get(0).getItems().forEach(detail -> { if (null == detail) { return; } - DesignItemDetail designItemDetail = CopyUtil.copyObject(detail, DesignItemDetail.class); + Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority(); + newDetailPriorities.add(priority); + + DesignItemDetail designItemDetail; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingDetailMap.containsKey(priority)) { + // 更新现有记录 + designItemDetail = existingDetailMap.get(priority); + designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + } else { + // 创建新记录 + designItemDetail = new DesignItemDetail(); + designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + } + + // 设置/更新字段 designItemDetail.setAccountId(userInfo.getId()); designItemDetail.setDesignId(designId); designItemDetail.setDesignItemId(designItemId); designItemDetail.setCollectionElementId(detail.getElementId()); - designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + designItemDetail.setType(detail.getType()); + designItemDetail.setPriority(priority); if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) { designItemDetail.setPath(detail.getBody_path()); //BODY不关联businessId designItemDetail.setBusinessId(0L); + } else { + // 非BODY类型使用path字段 + designItemDetail.setPath(detail.getPath()); } designItemDetail.setIconPath(detail.getIcon()); // todo @@ -314,7 +341,20 @@ public class DesignItemServiceImpl extends ServiceImpl { + if (!newDetailPriorities.contains(existingDetail.getPriority())) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingDetail.getId()); + updateWrapper.set("is_deleted", (byte) 1); + updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone)); + designItemDetailService.update(null, updateWrapper); + } + }); + + designItemDetailService.saveOrUpdateBatch(designItemDetails); //封装item信息 List designCollectionItems = CopyUtil.copyList(getByDesignId(designId) , DesignCollectionItemVO.class, (o, d) -> { @@ -343,26 +383,51 @@ public class DesignItemServiceImpl extends ServiceImpl existingDetails = designItemDetailService.selectByDesignItemId(designItemId); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingDetailMap = existingDetails.stream() + .collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old)); + + // 收集新 detail 的 priority,用于后续删除不存在的旧记录 + Set newDetailPriorities = new HashSet<>(); + List designItemDetails = Lists.newArrayList(); - // 3、保存新的designItemDetail + // 3、保存新的designItemDetail(使用 saveOrUpdate 方式) pythonObjects.getObjects().get(0).getItems().forEach(detail -> { if (null == detail) { return; } - DesignItemDetail designItemDetail = CopyUtil.copyObject(detail, DesignItemDetail.class); + Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority(); + newDetailPriorities.add(priority); + + DesignItemDetail designItemDetail; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingDetailMap.containsKey(priority)) { + // 更新现有记录 + designItemDetail = existingDetailMap.get(priority); + designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + } else { + // 创建新记录 + designItemDetail = new DesignItemDetail(); + designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + } + + // 设置/更新字段 designItemDetail.setAccountId(userId); designItemDetail.setDesignId(designId); designItemDetail.setDesignItemId(designItemId); designItemDetail.setCollectionElementId(detail.getElementId()); - designItemDetail.setPriority(detail.getPriority()); - designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + designItemDetail.setType(detail.getType()); + designItemDetail.setPriority(priority); if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) { designItemDetail.setPath(detail.getBody_path()); //BODY不关联businessId designItemDetail.setBusinessId(0L); - designItemDetail.setPriority(0); + } else { + // 非BODY类型使用path字段 + designItemDetail.setPath(detail.getPath()); } designItemDetail.setIconPath(detail.getIcon()); // designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getType().toLowerCase())); @@ -374,12 +439,25 @@ public class DesignItemServiceImpl extends ServiceImpl { + if (!newDetailPriorities.contains(existingDetail.getPriority())) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingDetail.getId()); + updateWrapper.set("is_deleted", (byte) 1); + updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone)); + designItemDetailService.update(null, updateWrapper); + } + }); + // businessId 来自t_sys_file或者t_library - designItemDetailService.saveBatch(designItemDetails); + designItemDetailService.saveOrUpdateBatch(designItemDetails); - // 4、保存印花信息到designItemDetailPrint + // 4、保存印花信息到designItemDetailPrint(使用 saveOrUpdate 方式) List designItemDetailPrints = setDesignItemDetailPrintList(designItemDetails, designSingleItemDTOList, timeZone); - designItemDetailPrintService.saveBatch(designItemDetailPrints); + designItemDetailPrintService.saveOrUpdateBatch(designItemDetailPrints); // 5、覆盖designPythonOutfit表中的模特全身图 TDesignPythonOutfit designPythonOutfit = new TDesignPythonOutfit(); @@ -388,10 +466,16 @@ public class DesignItemServiceImpl extends ServiceImpl existingLayers = designPythonOutfitDetailService.getDetailByDesignPythonOutfitId(designPythonOutfit.getId()); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingLayerMap = existingLayers.stream() + .collect(Collectors.toMap(TDesignPythonOutfitDetail::getPriority, layer -> layer, (old, newVal) -> old)); - // 7、将新生成的图层信息存入designPythonOutfitDetail表 + // 收集新 layer 的 priority,用于后续删除不存在的旧记录 + Set newLayerPriorities = new HashSet<>(); + + // 7、将新生成的图层信息存入designPythonOutfitDetail表(使用 saveOrUpdate 方式) JSONArray layers = outfit.getJSONArray("layers"); Map> priorityOffset = null; @@ -399,9 +483,55 @@ public class DesignItemServiceImpl extends ServiceImpl list = setTDesignPythonOutfitDetailList(layers, designId, designPythonOutfit.getId(), userId, priorityOffset); + List list = new ArrayList<>(); + for (int i = 0; i < layers.size(); i++) { + JSONObject jsonObject = layers.getJSONObject(i); + Integer priority = (Integer) jsonObject.get("priority"); + newLayerPriorities.add(Math.abs(priority)); + + TDesignPythonOutfitDetail designPythonOutfitDetail; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingLayerMap.containsKey(Math.abs(priority))) { + // 更新现有记录 + designPythonOutfitDetail = existingLayerMap.get(Math.abs(priority)); + designPythonOutfitDetail.setUpdateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } else { + // 创建新记录 + designPythonOutfitDetail = new TDesignPythonOutfitDetail(); + designPythonOutfitDetail.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } + + // 设置/更新字段 + designPythonOutfitDetail.setDesignId(designId); + designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId()); + designPythonOutfitDetail.setPosition(jsonObject.getString("position")); + designPythonOutfitDetail.setImageUrl(jsonObject.getString("image_url")); + designPythonOutfitDetail.setImageSize(jsonObject.getString("image_size")); + designPythonOutfitDetail.setImageCategory(jsonObject.getString("image_category")); + designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); + designPythonOutfitDetail.setScale(Objects.isNull(jsonObject.getString("resize_scale")) ? "1.0" : jsonObject.getString("resize_scale")); + designPythonOutfitDetail.setUserId(userId); + if (priorityOffset != null && !priorityOffset.isEmpty()){ + designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(priority)))); + } + designPythonOutfitDetail.setPriority(priority); + + list.add(designPythonOutfitDetail); + } + + // 逻辑删除不在新列表中的旧记录 + existingLayers.forEach(existingLayer -> { + if (!newLayerPriorities.contains(Math.abs(existingLayer.getPriority()))) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingLayer.getId()); + updateWrapper.set("is_deleted", 1); + updateWrapper.set("update_date", LocalDateTime.now(ZoneId.of(timeZone))); + designPythonOutfitDetailService.update(null, updateWrapper); + } + }); - designPythonOutfitDetailService.saveBatch(list); + designPythonOutfitDetailService.saveOrUpdateBatch(list); return list; } @@ -923,7 +1053,6 @@ public class DesignItemServiceImpl extends ServiceImpl designItemDetailTypeIdMap, String timeZone) { - // todo 这边这样做对吗 DesignSinglePrintDTO printObject; if (printType.equals("print")) { printObject = designSingleItem.getPrintObject(); @@ -931,32 +1060,64 @@ public class DesignItemServiceImpl extends ServiceImpl { - // 2.1 判断是否第一次添加印花,是:直接添加 - List designItemDetailPrintList = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority()), printType); - if (!designItemDetailPrintList.isEmpty()) { - // 2.2 否:先删除原始印花,再添加新印花信息 - designItemDetailPrintService.deleteByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); - } - setUriToMinioPath(print); + Long designItemDetailId = designItemDetailTypeIdMap.get(designSingleItem.getPriority()); + + // 查询现有的记录,用于 saveOrUpdate + List existingPrints = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailId, printType); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingPrintMap = existingPrints.stream() + .collect(Collectors.toMap(DesignItemDetailPrint::getPriority, print -> print, (old, newVal) -> old)); - DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint(); - designItemDetailPrint.setDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); + // 收集新 print 的 priority,用于后续删除不存在的旧记录 + Set newPrintPriorities = new HashSet<>(); + + if (!CollectionUtil.isEmpty(printObject.getPrints())) { + // 处理新的印花列表 + printObject.getPrints().forEach(print -> { + setUriToMinioPath(print); + + Integer priority = print.getPriority(); + newPrintPriorities.add(priority); + + DesignItemDetailPrint designItemDetailPrint; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingPrintMap.containsKey(priority)) { + // 更新现有记录 + designItemDetailPrint = existingPrintMap.get(priority); + designItemDetailPrint.setUpdateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } else { + // 创建新记录 + designItemDetailPrint = new DesignItemDetailPrint(); + designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } + + // 设置/更新字段 + designItemDetailPrint.setDesignItemDetailId(designItemDetailId); designItemDetailPrint.setPrintType(printType); designItemDetailPrint.setLevel2Type(print.getLevel2Type()); designItemDetailPrint.setPath(print.getMinIOPath()); designItemDetailPrint.setScale(print.getScale().toString()); designItemDetailPrint.setSingleOrOverall(printType.equals("print") ? print.getIfSingle() ? "single" : "overall" : "single"); - designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); // single、overall模式下都有position、angle和priority designItemDetailPrint.setPosition(print.getLocation().toString()); designItemDetailPrint.setAngle(print.getAngle()); - designItemDetailPrint.setPriority(print.getPriority()); + designItemDetailPrint.setPriority(priority); + designItemDetailPrints.add(designItemDetailPrint); }); } + + // 逻辑删除不在新列表中的旧记录 + existingPrints.forEach(existingPrint -> { + if (!newPrintPriorities.contains(existingPrint.getPriority())) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingPrint.getId()); + updateWrapper.set("is_deleted", (byte) 1); + updateWrapper.set("update_date", LocalDateTime.now(ZoneId.of(timeZone))); + designItemDetailPrintService.update(null, updateWrapper); + } + }); } // 对印花类型为Generate的图片路径进行特殊处理 diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java index 5003523e..a7778835 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -45,6 +45,7 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl getDetailByDesignPythonOutfitId(Long designPythonOutfitId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_python_outfit_id", designPythonOutfitId); + queryWrapper.eq("is_deleted", 0); return baseMapper.selectList(queryWrapper); }