From 62efa4e6c0977bf3b216c59e545a102f0af77d65 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期四, 30 十月 2025 13:57:52 +0800
Subject: [PATCH] 调整排序
---
framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java | 261 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 242 insertions(+), 19 deletions(-)
diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
index f5f756c..c476146 100644
--- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
@@ -517,30 +517,253 @@
boolean result;
//妫�娴嬬鐞嗗憳鏉冮檺
this.checkManagerAuthority();
- LambdaUpdateWrapper<Goods> updateWrapper = new LambdaUpdateWrapper<>();
- updateWrapper.set(Goods::getGoodsSort,req.getSort());
- updateWrapper.eq(Goods::getId, req.getGoodsId());
- //鏌ヨ鍑烘瘮褰撳墠鎺掑簭澶х殑鍟嗗搧
- LambdaQueryWrapper<Goods> query = Wrappers.<Goods>lambdaQuery();
- query.gt(Goods::getGoodsSort,req.getSort());
- List<Goods> goods = goodsService.list(query);
- List<String> goodsIds = new ArrayList<>();
- if (goods != null && !goods.isEmpty()) {
- //閫傞厤娌℃湁鎺掑簭鐨勫晢鍝佹帓搴忓瓧娈典负null
- goods.forEach(item -> {
- if (item.getGoodsSort() != null) {
- item.setGoodsSort(item.getGoodsSort() + 1);
- goodsIds.add(item.getId());
- }
- });
- goodsService.updateBatchById(goods);
+
+ // 鑾峰彇褰撳墠鍟嗗搧鐨勫師濮嬫帓搴忓��
+ Goods currentGoods = this.getById(req.getGoodsId());
+ Integer oldSort = currentGoods != null ? currentGoods.getGoodsSort() : null;
+ Integer newSort = req.getSort();
+
+ // 鏀堕泦闇�瑕佹洿鏂癊S鐨勫晢鍝両D
+ List<String> goodsIdsToUpdateEs = new ArrayList<>();
+ goodsIdsToUpdateEs.add(req.getGoodsId());
+
+ // 澶勭悊鏁版嵁搴撲腑鐨勯噸澶嶆帓搴忓�硷紝纭繚鍞竴鎬�
+ List<String> duplicateResolvedGoodsIds = resolveDuplicateSorts();
+ goodsIdsToUpdateEs.addAll(duplicateResolvedGoodsIds);
+
+ // 閲嶆柊鑾峰彇褰撳墠鍟嗗搧鐨勬帓搴忓�硷紙鍙兘宸茶resolveDuplicateSorts淇敼锛�
+ currentGoods = this.getById(req.getGoodsId());
+ oldSort = currentGoods != null ? currentGoods.getGoodsSort() : null;
+
+ // 鏍规嵁鎿嶄綔绫诲瀷鎵ц涓嶅悓鐨勬帓搴忛�昏緫
+ if (oldSort == null) {
+ // 鏂板鎺掑簭
+ List<String> affectedGoodsIds = adjustForInsert(newSort);
+ goodsIdsToUpdateEs.addAll(affectedGoodsIds);
+ // 澶勭悊鍙兘浜х敓鐨勯噸澶嶆帓搴忓��
+ List<String> afterInsertResolvedGoodsIds = resolveDuplicateSorts();
+ goodsIdsToUpdateEs.addAll(afterInsertResolvedGoodsIds);
+ } else if (!oldSort.equals(newSort)) {
+ // 淇敼鎺掑簭
+ if (newSort > oldSort) {
+ // 鎺掑簭鍊煎澶э細灏嗗ぇ浜庣瓑浜庢柊鎺掑簭鍊肩殑鍟嗗搧+1锛岀洿鍒伴亣鍒版柇灞�
+ List<String> affectedGoodsIds = adjustForIncrease(newSort);
+ goodsIdsToUpdateEs.addAll(affectedGoodsIds);
+ // 澶勭悊鍙兘浜х敓鐨勯噸澶嶆帓搴忓��
+ List<String> afterIncreaseResolvedGoodsIds = resolveDuplicateSorts();
+ goodsIdsToUpdateEs.addAll(afterIncreaseResolvedGoodsIds);
+ } else {
+ // 鎺掑簭鍊煎噺灏忥細灏嗗ぇ浜庣瓑浜庢柊鎺掑簭鍊间笖灏忎簬鍘熸帓搴忓�肩殑鍟嗗搧+1锛岀洿鍒伴亣鍒版柇灞�
+ List<String> affectedGoodsIds = adjustForDecrease(oldSort, newSort);
+ goodsIdsToUpdateEs.addAll(affectedGoodsIds);
+ // 澶勭悊鍙兘浜х敓鐨勯噸澶嶆帓搴忓��
+ List<String> afterDecreaseResolvedGoodsIds = resolveDuplicateSorts();
+ goodsIdsToUpdateEs.addAll(afterDecreaseResolvedGoodsIds);
+ }
}
+
+ // 鏇存柊褰撳墠鍟嗗搧鐨勬帓搴忓��
+ LambdaUpdateWrapper<Goods> updateWrapper = new LambdaUpdateWrapper<>();
+ updateWrapper.set(Goods::getGoodsSort, newSort);
+ updateWrapper.eq(Goods::getId, req.getGoodsId());
result = this.update(updateWrapper);
- goodsIds.add(req.getGoodsId());
- this.updateEsGoods(goodsIds);
+
+ // 鏇存柊ES绱㈠紩
+ this.updateEsGoods(goodsIdsToUpdateEs);
+
return result;
}
+ /**
+ * 澶勭悊鏁版嵁搴撲腑鐨勯噸澶嶆帓搴忓�硷紝纭繚鍞竴鎬�
+ * @return 鍙楀奖鍝嶇殑鍟嗗搧ID鍒楄〃
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public List<String> resolveDuplicateSorts() {
+ // 鏌ヨ鎵�鏈夋湁鎺掑簭鍊肩殑鍟嗗搧
+ LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.isNotNull(Goods::getGoodsSort);
+ queryWrapper.orderByAsc(Goods::getGoodsSort);
+ List<Goods> allGoods = this.list(queryWrapper);
+
+ // 鎸夋帓搴忓�煎垎缁�
+ Map<Integer, List<Goods>> sortMap = allGoods.stream()
+ .collect(Collectors.groupingBy(Goods::getGoodsSort));
+
+ // 澶勭悊閲嶅鐨勬帓搴忓�硷紝鍙繚鐣欑涓�涓紝鍏朵綑閲嶆柊鍒嗛厤
+ List<Goods> toUpdate = new ArrayList<>();
+ int nextSort = getMaxSortValue(allGoods) + 1; // 浠庡綋鍓嶆渶澶у��+1寮�濮嬪垎閰�
+ for (Map.Entry<Integer, List<Goods>> entry : sortMap.entrySet()) {
+ List<Goods> goodsList = entry.getValue();
+ if (goodsList.size() > 1) {
+ // 鏈夐噸澶嶅�硷紝鍙繚鐣欑涓�涓紝鍏朵綑閲嶆柊鍒嗛厤
+ for (int i = 1; i < goodsList.size(); i++) {
+ Goods goods = goodsList.get(i);
+ goods.setGoodsSort(nextSort++);
+ toUpdate.add(goods);
+ }
+ }
+ }
+
+ // 鏀堕泦鍙楀奖鍝嶇殑鍟嗗搧ID
+ List<String> affectedGoodsIds = toUpdate.stream()
+ .map(Goods::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏇存柊
+ if (!toUpdate.isEmpty()) {
+ this.updateBatchById(toUpdate);
+ }
+
+ return affectedGoodsIds;
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鏈�澶х殑鎺掑簭鍊�
+ * @param goodsList 鍟嗗搧鍒楄〃
+ * @return 鏈�澶ф帓搴忓��
+ */
+ private int getMaxSortValue(List<Goods> goodsList) {
+ return goodsList.stream()
+ .mapToInt(Goods::getGoodsSort)
+ .max()
+ .orElse(0);
+ }
+
+ /**
+ * 鎻掑叆鏂版帓搴忓�肩殑澶勭悊閫昏緫
+ * 灏嗘墍鏈夊ぇ浜庣瓑浜庢柊鎺掑簭鍊肩殑鍟嗗搧鎺掑簭鍊�+1锛岀洿鍒伴亣鍒版柇灞�
+ * @param newSort 鏂扮殑鎺掑簭鍊�
+ * @return 鍙楀奖鍝嶇殑鍟嗗搧ID鍒楄〃
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public List<String> adjustForInsert(Integer newSort) {
+ if (newSort == null) return Collections.emptyList();
+
+ // 鏌ヨ鎵�鏈夊ぇ浜庣瓑浜庢柊鎺掑簭鍊肩殑鍟嗗搧锛屾寜鎺掑簭鍊煎崌搴忔帓鍒�
+ LambdaQueryWrapper<Goods> query = Wrappers.<Goods>lambdaQuery();
+ query.ge(Goods::getGoodsSort, newSort);
+ query.isNotNull(Goods::getGoodsSort);
+ query.orderByAsc(Goods::getGoodsSort);
+ List<Goods> goodsList = this.list(query);
+
+ // 妫�鏌ヨ繛缁�э紝閬囧埌鏂眰鍒欏仠姝�
+ List<Goods> toUpdate = new ArrayList<>();
+ int expectedSort = newSort;
+ for (Goods goods : goodsList) {
+ if (goods.getGoodsSort().equals(expectedSort)) {
+ goods.setGoodsSort(goods.getGoodsSort() + 1);
+ toUpdate.add(goods);
+ expectedSort++;
+ } else {
+ // 閬囧埌鏂眰锛屽仠姝㈣皟鏁�
+ break;
+ }
+ }
+
+ // 鏀堕泦鍙楀奖鍝嶇殑鍟嗗搧ID
+ List<String> affectedGoodsIds = toUpdate.stream()
+ .map(Goods::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏇存柊
+ if (!toUpdate.isEmpty()) {
+ this.updateBatchById(toUpdate);
+ }
+
+ return affectedGoodsIds;
+ }
+
+ /**
+ * 鎺掑簭鍊煎澶х殑澶勭悊閫昏緫
+ * 灏嗘墍鏈夊ぇ浜庣瓑浜庢柊鎺掑簭鍊肩殑鍟嗗搧鎺掑簭鍊�+1锛岀洿鍒伴亣鍒版柇灞�
+ * @param newSort 鏂版帓搴忓��
+ * @return 鍙楀奖鍝嶇殑鍟嗗搧ID鍒楄〃
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public List<String> adjustForIncrease(Integer newSort) {
+ if (newSort == null) return Collections.emptyList();
+
+ // 鏌ヨ鎵�鏈夊ぇ浜庣瓑浜庢柊鎺掑簭鍊肩殑鍟嗗搧锛屾寜鎺掑簭鍊煎崌搴忔帓鍒�
+ LambdaQueryWrapper<Goods> query = Wrappers.<Goods>lambdaQuery();
+ query.ge(Goods::getGoodsSort, newSort);
+ query.isNotNull(Goods::getGoodsSort);
+ query.orderByAsc(Goods::getGoodsSort);
+ List<Goods> goodsList = this.list(query);
+
+ // 妫�鏌ヨ繛缁�э紝閬囧埌鏂眰鍒欏仠姝�
+ List<Goods> toUpdate = new ArrayList<>();
+ int expectedSort = newSort;
+ for (Goods goods : goodsList) {
+ if (goods.getGoodsSort().equals(expectedSort)) {
+ goods.setGoodsSort(goods.getGoodsSort() + 1);
+ toUpdate.add(goods);
+ expectedSort++;
+ } else {
+ // 閬囧埌鏂眰锛屽仠姝㈣皟鏁�
+ break;
+ }
+ }
+
+ // 鏀堕泦鍙楀奖鍝嶇殑鍟嗗搧ID
+ List<String> affectedGoodsIds = toUpdate.stream()
+ .map(Goods::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏇存柊
+ if (!toUpdate.isEmpty()) {
+ this.updateBatchById(toUpdate);
+ }
+
+ return affectedGoodsIds;
+ }
+
+ /**
+ * 鎺掑簭鍊煎噺灏忕殑澶勭悊閫昏緫
+ * 灏嗗ぇ浜庣瓑浜庢柊鎺掑簭鍊间笖灏忎簬鍘熸帓搴忓�肩殑鍟嗗搧鎺掑簭鍊�+1锛岀洿鍒伴亣鍒版柇灞�
+ * @param oldSort 鍘熸帓搴忓��
+ * @param newSort 鏂版帓搴忓��
+ * @return 鍙楀奖鍝嶇殑鍟嗗搧ID鍒楄〃
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public List<String> adjustForDecrease(Integer oldSort, Integer newSort) {
+ if (oldSort == null || newSort == null || oldSort.equals(newSort)) return Collections.emptyList();
+
+ // 鏌ヨ澶т簬绛変簬鏂版帓搴忓�间笖灏忎簬鍘熸帓搴忓�肩殑鍟嗗搧锛屾寜鎺掑簭鍊煎崌搴忔帓鍒�
+ LambdaQueryWrapper<Goods> query = Wrappers.<Goods>lambdaQuery();
+ query.ge(Goods::getGoodsSort, newSort);
+ query.lt(Goods::getGoodsSort, oldSort);
+ query.isNotNull(Goods::getGoodsSort);
+ query.orderByAsc(Goods::getGoodsSort);
+ List<Goods> goodsList = this.list(query);
+
+ // 妫�鏌ヨ繛缁�э紝閬囧埌鏂眰鍒欏仠姝�
+ List<Goods> toUpdate = new ArrayList<>();
+ int expectedSort = newSort;
+ for (Goods goods : goodsList) {
+ if (goods.getGoodsSort().equals(expectedSort)) {
+ goods.setGoodsSort(goods.getGoodsSort() + 1);
+ toUpdate.add(goods);
+ expectedSort++;
+ } else {
+ // 閬囧埌鏂眰锛屽仠姝㈣皟鏁�
+ break;
+ }
+ }
+
+ // 鏀堕泦鍙楀奖鍝嶇殑鍟嗗搧ID
+ List<String> affectedGoodsIds = toUpdate.stream()
+ .map(Goods::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏇存柊
+ if (!toUpdate.isEmpty()) {
+ this.updateBatchById(toUpdate);
+ }
+
+ return affectedGoodsIds;
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
@SystemLogPoint(description = "鍒犻櫎鍟嗗搧", customerLog = "'鎿嶄綔瀵硅薄:['+#goodsIds+']'")
--
Gitblit v1.8.0