BUGFIX:1. 排序优化,添加唯一约束和重试
2.like前先查询是否有被like
This commit is contained in:
@@ -22,4 +22,22 @@ public interface CollectionSortMapper extends CommonMapper<CollectionSort> {
|
||||
@Select("SELECT * FROM collection_sort WHERE parent_id IN (SELECT id FROM collection_sort WHERE relation_id = #{relationId})")
|
||||
List<CollectionSort> queryCollectionSortsIsNotDesignByUserLikeRelationId(@Param("relationId") Long relationId);
|
||||
|
||||
@Update({
|
||||
"<script>",
|
||||
"UPDATE collection_sort",
|
||||
"SET sort = sort - 1",
|
||||
"WHERE project_id = #{projectId}",
|
||||
"AND sort > #{deletedSort}",
|
||||
"<if test='parentId != null'>",
|
||||
"AND parent_id = #{parentId}",
|
||||
"</if>",
|
||||
"<if test='parentId == null'>",
|
||||
"AND parent_id IS NULL",
|
||||
"</if>",
|
||||
"</script>"
|
||||
})
|
||||
void decrementSortAfterDelete(@Param("projectId") Long projectId,
|
||||
@Param("parentId") Long parentId,
|
||||
@Param("deletedSort") int deletedSort);
|
||||
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ public interface CollectionSortService {
|
||||
|
||||
void deleteCollectionSort(Long relationId, String relationType, Long projectId, Long parentId);
|
||||
|
||||
CollectionSort getUserLikeSortByUserLikeId(Long relationId, String relationType, Long projectId);
|
||||
CollectionSort getUserLikeSortByUserLikeId(Long relationId, String relationType, Long projectId, Long parentId);
|
||||
|
||||
Boolean sort(CollectionSortDTO userLikeSortDTO);
|
||||
|
||||
|
||||
@@ -26,26 +26,39 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
@Override
|
||||
public CollectionSort addCollectionSort(Long relationId, String relationType, Long projectId, Long collectionSortParentId) {
|
||||
CollectionSort collectionSort = queryCollectionSortByRelation(relationId, relationType, projectId);
|
||||
if (Objects.nonNull(collectionSort)){
|
||||
if (Objects.nonNull(collectionSort)) {
|
||||
return collectionSort;
|
||||
}
|
||||
int sort = getNextSort(projectId, collectionSortParentId);
|
||||
|
||||
CollectionSort userLikeSort = new CollectionSort();
|
||||
// userLikeSort.setUserLikeGroupId(userGroupId);
|
||||
// userLikeSort.setUserLikeId(relationId);
|
||||
userLikeSort.setProjectId(projectId);
|
||||
userLikeSort.setRelationId(relationId);
|
||||
userLikeSort.setRelationType(relationType);
|
||||
userLikeSort.setSort(sort);
|
||||
|
||||
if (null != collectionSortParentId) {
|
||||
userLikeSort.setParentId(collectionSortParentId);
|
||||
}
|
||||
userLikeSort.setCreateTime(LocalDateTime.now());
|
||||
baseMapper.insert(userLikeSort);
|
||||
return userLikeSort;
|
||||
int retryCount = 3;
|
||||
while (retryCount-- > 0) {
|
||||
try {
|
||||
int sort = getNextSort(projectId, collectionSortParentId);
|
||||
userLikeSort.setSort(sort);
|
||||
baseMapper.insert(userLikeSort);
|
||||
return userLikeSort;
|
||||
} catch (DuplicateKeyException e) {
|
||||
// 如果发生唯一约束冲突,重试
|
||||
if (retryCount == 0) {
|
||||
throw new BusinessException("获取排序号失败,请重试");
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new BusinessException("获取排序号失败");
|
||||
}
|
||||
|
||||
public CollectionSort queryCollectionSortByRelation(Long relationId, String relationType, Long projectId){
|
||||
public CollectionSort queryCollectionSortByRelation(Long relationId, String relationType, Long projectId) {
|
||||
QueryWrapper<CollectionSort> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(CollectionSort::getProjectId, projectId).
|
||||
eq(CollectionSort::getRelationId, relationId).
|
||||
@@ -75,7 +88,7 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
int retryCount = 3;
|
||||
while (retryCount-- > 0) {
|
||||
try {
|
||||
Integer maxSort = getMaxSortFromDB(projectId, parentId);
|
||||
int maxSort = Math.toIntExact(getMaxSortFromDB(projectId, parentId));
|
||||
return maxSort + 1;
|
||||
} catch (DuplicateKeyException e) {
|
||||
// 如果发生唯一约束冲突,重试
|
||||
@@ -87,7 +100,7 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
throw new BusinessException("获取排序号失败");
|
||||
}
|
||||
|
||||
private Integer getMaxSortFromDB(Long projectId, Long parentId) {
|
||||
private Long getMaxSortFromDB(Long projectId, Long parentId) {
|
||||
QueryWrapper<CollectionSort> qw = new QueryWrapper<>();
|
||||
qw.select("COALESCE(MAX(sort), 0) as maxSort")
|
||||
.eq("project_id", projectId);
|
||||
@@ -99,16 +112,16 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
}
|
||||
|
||||
Map<String, Object> result = baseMapper.selectMaps(qw).get(0);
|
||||
return (Integer) result.get("maxSort");
|
||||
return (Long) result.get("maxSort");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteCollectionSort(Long relationId, String relationType, Long projectId, Long parentId) {
|
||||
/*public void deleteCollectionSort(Long relationId, String relationType, Long projectId, Long parentId) {
|
||||
QueryWrapper<CollectionSort> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(CollectionSort::getProjectId, projectId);
|
||||
if (null != parentId) {
|
||||
qw.lambda().eq(CollectionSort::getParentId, parentId);
|
||||
}else {
|
||||
} else {
|
||||
qw.lambda().isNull(CollectionSort::getParentId);
|
||||
}
|
||||
qw.lambda().orderByDesc(CollectionSort::getSort);
|
||||
@@ -121,12 +134,30 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
baseMapper.deleteById(likeSort);
|
||||
deleteByParentId(likeSort.getId());
|
||||
break;
|
||||
}else {
|
||||
} else {
|
||||
likeSort.setSort(likeSort.getSort() - 1);
|
||||
baseMapper.updateById(likeSort);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
@Transactional
|
||||
public void deleteCollectionSort(Long relationId, String relationType, Long projectId, Long parentId) {
|
||||
// 1. 找到要删除的记录
|
||||
CollectionSort userLikeSort = getUserLikeSortByUserLikeId(relationId, relationType, projectId, null);
|
||||
if (Objects.isNull(userLikeSort)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Long userLikeSortId = userLikeSort.getId();
|
||||
int deletedSort = userLikeSort.getSort();
|
||||
|
||||
// 2. 先删除记录
|
||||
baseMapper.deleteById(userLikeSortId);
|
||||
deleteByParentId(userLikeSortId);
|
||||
|
||||
// 3. 批量更新排序号(使用自定义Mapper方法)
|
||||
baseMapper.decrementSortAfterDelete(projectId, parentId, deletedSort);
|
||||
}
|
||||
|
||||
private void deleteByParentId(Long parentId) {
|
||||
@@ -136,11 +167,14 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
}
|
||||
|
||||
@Override
|
||||
public CollectionSort getUserLikeSortByUserLikeId(Long relationId, String relationType, Long projectId) {
|
||||
public CollectionSort getUserLikeSortByUserLikeId(Long relationId, String relationType, Long projectId, Long parentId) {
|
||||
QueryWrapper<CollectionSort> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(CollectionSort::getRelationId, relationId);
|
||||
qw.lambda().eq(CollectionSort::getRelationType, relationType);
|
||||
qw.lambda().eq(CollectionSort::getProjectId, projectId);
|
||||
if (Objects.nonNull(parentId)){
|
||||
qw.lambda().eq(CollectionSort::getParentId, parentId);
|
||||
}
|
||||
CollectionSort userLikeSort = baseMapper.selectOne(qw);
|
||||
return userLikeSort;
|
||||
}
|
||||
@@ -155,9 +189,10 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
|
||||
/**
|
||||
* 只有当使用子集中的元素进行生成时,才需要重新排序
|
||||
* @param childId 生成元素的id
|
||||
* @param parentId 父级id
|
||||
* @param relationType 生成功能
|
||||
*
|
||||
* @param childId 生成元素的id
|
||||
* @param parentId 父级id
|
||||
* @param relationType 生成功能
|
||||
* @param userLikeSortId 子集排序表中的id
|
||||
*/
|
||||
@Transactional
|
||||
@@ -174,12 +209,12 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
.eq("relation_type", relationType).orderByDesc("id"));
|
||||
if (childList.isEmpty()) {
|
||||
return null;
|
||||
}else if (childList.size() > 1){
|
||||
} else if (childList.size() > 1) {
|
||||
log.error("CollectionSort表中,relation_id为{},relation_type为{}的记录有 {} 条,", childId, relationType, childList.size());
|
||||
}
|
||||
CollectionSort child = childList.get(0);
|
||||
CollectionSort collectionSort = baseMapper.selectById(userLikeSortId);
|
||||
if (Objects.isNull(collectionSort)){
|
||||
if (Objects.isNull(collectionSort)) {
|
||||
return null;
|
||||
}
|
||||
child.setSort(collectionSort.getSort());
|
||||
@@ -213,11 +248,11 @@ public class CollectionSortServiceImpl extends ServiceImpl<CollectionSortMapper,
|
||||
private String transElementType(String elementType) {
|
||||
if (elementType.equals("DesignOutfit")) {
|
||||
return CollectionType.DESIGN.getValue();
|
||||
}else if (elementType.equals("ToProductImage")) {
|
||||
} else if (elementType.equals("ToProductImage")) {
|
||||
return CollectionType.TO_PRODUCT_IMAGE.getValue();
|
||||
}else if (elementType.equals("PoseTransfer")) {
|
||||
} else if (elementType.equals("PoseTransfer")) {
|
||||
return CollectionType.POSE_TRANSFORM.getValue();
|
||||
}else {
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -771,29 +771,48 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
}
|
||||
|
||||
@Override
|
||||
public CollectionSort productImageLike(ProductImageLikeDTO productImageLikeDTO) {
|
||||
List<Long> toProductImageResultId = productImageLikeDTO.getToProductImageResultId();
|
||||
QueryWrapper<ToProductImageResult> qw = new QueryWrapper<>();
|
||||
qw.lambda().in(ToProductImageResult::getId, toProductImageResultId);
|
||||
ToProductImageResult toProductImageResult = new ToProductImageResult();
|
||||
toProductImageResult.setIsLike(1);
|
||||
toProductImageResultMapper.update(toProductImageResult, qw);
|
||||
ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageResultId.get(0));
|
||||
public CollectionSort productImageLike(ProductImageLikeDTO dto) {
|
||||
List<Long> resultIds = dto.getToProductImageResultId();
|
||||
ToProductImageResult result = toProductImageResultMapper.selectById(resultIds.get(0));
|
||||
CollectionSort collectionSort = null;
|
||||
if (toProductImageResult1.getResultType().equals("Relight")) {
|
||||
if (null != productImageLikeDTO.getCollectionSortParentId()) {
|
||||
collectionSort = collectionSortService.addCollectionSort(toProductImageResult1.getId(), CollectionType.RELIGHT.getValue(), productImageLikeDTO.getProjectId(), productImageLikeDTO.getCollectionSortParentId());
|
||||
}
|
||||
} else {
|
||||
if (null != productImageLikeDTO.getCollectionSortParentId()) {
|
||||
collectionSort = collectionSortService.addCollectionSort(toProductImageResult1.getId(), CollectionType.TO_PRODUCT_IMAGE.getValue(), productImageLikeDTO.getProjectId(), productImageLikeDTO.getCollectionSortParentId());
|
||||
}
|
||||
boolean updatedFlag = false;
|
||||
|
||||
Long parentId = dto.getCollectionSortParentId();
|
||||
if (parentId == null) {
|
||||
return null;
|
||||
}
|
||||
// 更新项目更新时间
|
||||
projectService.modifyProjectUpdateTime(productImageLikeDTO.getProjectId());
|
||||
|
||||
// 统一处理两种类型
|
||||
CollectionType collectionType = "Relight".equals(result.getResultType())
|
||||
? CollectionType.RELIGHT
|
||||
: CollectionType.TO_PRODUCT_IMAGE;
|
||||
|
||||
collectionSort = collectionSortService.getUserLikeSortByUserLikeId(
|
||||
result.getId(), collectionType.getValue(), dto.getProjectId(), parentId);
|
||||
|
||||
if (Objects.isNull(collectionSort)) {
|
||||
collectionSort = collectionSortService.addCollectionSort(
|
||||
result.getId(), collectionType.getValue(), dto.getProjectId(), parentId);
|
||||
updatedFlag = true;
|
||||
}
|
||||
|
||||
if (updatedFlag) {
|
||||
updateLikeStatus(resultIds);
|
||||
projectService.modifyProjectUpdateTime(dto.getProjectId());
|
||||
}
|
||||
|
||||
return collectionSort;
|
||||
}
|
||||
|
||||
private void updateLikeStatus(List<Long> resultIds) {
|
||||
QueryWrapper<ToProductImageResult> qw = new QueryWrapper<>();
|
||||
qw.lambda().in(ToProductImageResult::getId, resultIds);
|
||||
|
||||
ToProductImageResult updateEntity = new ToProductImageResult();
|
||||
updateEntity.setIsLike(1);
|
||||
toProductImageResultMapper.update(updateEntity, qw);
|
||||
}
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
@Value("${redis.key.toProductImageResultKey}")
|
||||
|
||||
Reference in New Issue
Block a user