@@ -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<DesignItemMapper, DesignI
response . setDesignItemUrl ( url ) ;
//更新item
updateById ( designItem ) ;
//删除itemDetail
designItemDetailService . deleteByDesignItemId ( designItemId ) ;
// 查询现有的记录,用于 saveOrUpdate
List < DesignItemDetail > existingDetails = designItemDetailService . selectByDesignItemId ( designItemId ) ;
// 创建 Map, 以 priority 为 key, 方便快速查找
Map < Integer , DesignItemDetail > existingDetailMap = existingDetails . stream ( )
. collect ( Collectors . toMap ( DesignItemDetail : : getPriority , detail - > detail , ( old , newVal ) - > old ) ) ;
// 收集新 detail 的 priority, 用于后续删除不存在的旧记录
Set < Integer > newDetailPriorities = new HashSet < > ( ) ;
List < DesignItemDetail > 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<DesignItemMapper, DesignI
designItemDetail . setPrintJson ( JSON . toJSONString ( printObject ) ) ;
designItemDetails . add ( designItemDetail ) ;
} ) ;
designItemDetailService . saveBatch ( designItemDetails ) ;
// 逻辑删除不在新列表中的旧记录
existingDetails . forEach ( existingDetail - > {
if ( ! newDetailPriorities . contains ( existingDetail . getPriority ( ) ) ) {
// 该记录不在新列表中,需要逻辑删除
UpdateWrapper < DesignItemDetail > 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 < DesignCollectionItemVO > designCollectionItems = CopyUtil . copyList ( getByDesignId ( designId )
, DesignCollectionItemVO . class , ( o , d ) - > {
@@ -343,26 +383,51 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
// 1、更新designItem
// updateById(designItem);
updateDesignItem ( designItem ) ;
// 2、删除designItemDetail(逻辑删除)
designItemDetailService . deleteByDesignItemId ( designItemId ) ;
// 2、查询现有的记录, 用于 saveOrUpdate
List < DesignItemDetail > existingDetails = designItemDetailService . selectByDesignItemId ( designItemId ) ;
// 创建 Map, 以 priority 为 key, 方便快速查找
Map < Integer , DesignItemDetail > existingDetailMap = existingDetails . stream ( )
. collect ( Collectors . toMap ( DesignItemDetail : : getPriority , detail - > detail , ( old , newVal ) - > old ) ) ;
// 收集新 detail 的 priority, 用于后续删除不存在的旧记录
Set < Integer > newDetailPriorities = new HashSet < > ( ) ;
List < DesignItemDetail > 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<DesignItemMapper, DesignI
designItemDetail . setPartialDesign ( Objects . isNull ( detail . getPrint ( ) ) ? null : detail . getPrint ( ) . getPartial ( ) ) ;
designItemDetails . add ( designItemDetail ) ;
} ) ;
// businessId 来自t_sys_file或者t_library
designItemDetailService . saveBatch ( designItemDetails ) ;
// 4、保存印花信息到designItemDetailPrint
// 逻辑删除不在新列表中的旧记录
existingDetails . forEach ( existingDetail - > {
if ( ! newDetailPriorities . contains ( existingDetail . getPriority ( ) ) ) {
// 该记录不在新列表中,需要逻辑删除
UpdateWrapper < DesignItemDetail > 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 . saveOrUpdateBatch ( designItemDetails ) ;
// 4、保存印花信息到designItemDetailPrint( 使用 saveOrUpdate 方式)
List < DesignItemDetailPrint > designItemDetailPrints = setDesignItemDetailPrintList ( designItemDetails , designSingleItemDTOList , timeZone ) ;
designItemDetailPrintService . saveBatch ( designItemDetailPrints ) ;
designItemDetailPrintService . saveOrUpdate Batch ( designItemDetailPrints ) ;
// 5、覆盖designPythonOutfit表中的模特全身图
TDesignPythonOutfit designPythonOutfit = new TDesignPythonOutfit ( ) ;
@@ -388,10 +466,16 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
designPythonOutfit . setUpdateDate ( LocalDateTime . now ( ZoneId . of ( timeZone ) ) ) ;
designPythonOutfitService . updateById ( designPythonOutfit ) ;
// 6、删除designPythonOutfitDetail表中原始的图层信息( 逻辑删除)
designPythonOutfitDetailService . delete ByDesignPythonOutfitIdLogical ( designPythonOutfit . getId ( ) ) ;
// 6、查询现有的图层信息,用于 saveOrUpdate
List < TDesignPythonOutfitDetail > existingLayers = designPythonOutfitDetailService. getDetail ByDesignPythonOutfitId( designPythonOutfit . getId ( ) ) ;
// 创建 Map, 以 priority 为 key, 方便快速查找
Map < Integer , TDesignPythonOutfitDetail > existingLayerMap = existingLayers . stream ( )
. collect ( Collectors . toMap ( TDesignPythonOutfitDetail : : getPriority , layer - > layer , ( old , newVal ) - > old ) ) ;
// 7、将新生成的图层信息存入designPythonOutfitDetail表
// 收集新 layer 的 priority, 用于后续删除不存在的旧记录
Set < Integer > newLayerPriorities = new HashSet < > ( ) ;
// 7、将新生成的图层信息存入designPythonOutfitDetail表( 使用 saveOrUpdate 方式)
JSONArray layers = outfit . getJSONArray ( " layers " ) ;
Map < Integer , List < Long > > priorityOffset = null ;
@@ -399,9 +483,55 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
priorityOffset = designSingleItemDTOList . stream ( )
. collect ( Collectors . toMap ( DesignSingleItemDTO : : getPriority , DesignSingleItemDTO : : getOffset ) ) ;
}
List < TDesignPythonOutfitDetail > list = setTDesignPythonOutfitDetailList ( layers , designId , designPythonOutfit . getId ( ) , userId , priorityOffset ) ;
List < TDesignPythonOutfitDetail > 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 ) ) ;
d esignPythonOutfitDetailService . saveBatch ( list ) ;
TD esignPythonOutfitDetail 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 < TDesignPythonOutfitDetail > 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 . saveOrUpdateBatch ( list ) ;
return list ;
}
@@ -923,7 +1053,6 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
Map < Integer , Long > designItemDetailTypeIdMap ,
String timeZone ) {
// todo 这边这样做对吗
DesignSinglePrintDTO printObject ;
if ( printType . equals ( " print " ) ) {
printObject = designSingleItem . getPrintObject ( ) ;
@@ -931,32 +1060,64 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
printObject = designSingleItem . getTrims ( ) ;
}
Long designItemDetailId = designItemDetailTypeIdMap . get ( designSingleItem . getPriority ( ) ) ;
// 查询现有的记录,用于 saveOrUpdate
List < DesignItemDetailPrint > existingPrints = designItemDetailPrintService . getByDesignItemDetailId ( designItemDetailId , printType ) ;
// 创建 Map, 以 priority 为 key, 方便快速查找
Map < Integer , DesignItemDetailPrint > existingPrintMap = existingPrints . stream ( )
. collect ( Collectors . toMap ( DesignItemDetailPrint : : getPriority , print - > print , ( old , newVal ) - > old ) ) ;
// 收集新 print 的 priority, 用于后续删除不存在的旧记录
Set < Integer > newPrintPriorities = new HashSet < > ( ) ;
if ( ! CollectionUtil . isEmpty ( printObject . getPrints ( ) ) ) {
// 2、有印花, 添加到list
// 处理新的印花列表
printObject . getPrints ( ) . forEach ( print - > {
// 2.1 判断是否第一次添加印花,是:直接添加
List < DesignItemDetailPrint > designItemDetailPrintList = designItemDetailPrintService . getByDesignItemDetailId ( designItemDetailTypeIdMap . get ( designSingleItem . getPriority ( ) ) , printType ) ;
if ( ! designItemDetailPrintList . isEmpty ( ) ) {
// 2.2 否:先删除原始印花,再添加新印花信息
designItemDetailPrintService . deleteByDesignItemDetailId ( designItemDetailTypeIdMap . get ( designSingleItem . getPriority ( ) ) ) ;
}
setUriToMinioPath ( print ) ;
DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint ( ) ;
designItemDetailPrint . setDesignItemDetailId ( designItemDetailTypeIdMap . get ( designSingleItem . getPriority ( ) ) ) ;
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 < DesignItemDetailPrint > 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的图片路径进行特殊处理