From afa08332c847db4505048037e4d071e6efdeb2ca Mon Sep 17 00:00:00 2001
From: wangfukang <15630117759@163.com>
Date: Sat, 4 Jul 2026 18:23:54 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=8B=BC=E5=9B=A2=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
hiver-admin/test-output/test-report.html | 16 +-
.../main/java/cc/hiver/core/dao/UserDao.java | 5 +
.../main/java/cc/hiver/core/entity/User.java | 3 +
.../cc/hiver/core/service/UserService.java | 3 +
.../core/serviceimpl/UserServiceImpl.java | 6 +
.../core/serviceimpl/WorkerServiceImpl.java | 3 +
.../AdminMallOrderGroupController.java | 84 ++++----
.../mall/controller/CommentController.java | 19 ++
.../MallDeliveryOrderController.java | 24 ++-
.../mall/controller/WorkerController.java | 52 +++--
.../dao/mapper/MallDeliveryOrderMapper.java | 14 ++
.../dao/mapper/WorkerRelaPriceMapper.java | 1 +
.../java/cc/hiver/mall/entity/Comment.java | 5 +
.../java/cc/hiver/mall/entity/MallOrder.java | 3 +
.../java/cc/hiver/mall/entity/ShopArea.java | 2 +-
.../cc/hiver/mall/mq/OrderAsyncConsumer.java | 1 +
.../controller/ProblemFeedbackController.java | 68 +++++-
.../entity/ProblemFeedback.java | 35 +++-
.../pojo/ProblemFeedbackPageQuery.java | 12 ++
.../impl/ProblemFeedbackServiceImpl.java | 3 +
.../vo/ProblemFeedbackPageVo.java | 40 +++-
.../mybatis/MallDeliveryOrderService.java | 14 ++
.../mybatis/MallDeliveryOrderServiceImpl.java | 38 +++-
.../mybatis/MallOrderGroupServiceImpl.java | 3 +-
.../mybatis/MallOrderServiceImpl.java | 78 ++++++-
.../mybatis/MallRefundRecordServiceImpl.java | 18 +-
.../resources/db/mall_order_saved_amount.sql | 5 +
.../resources/db/problem_feedback_fields.sql | 13 ++
.../mapper/MallDeliveryOrderMapper.xml | 193 +++++++++++++++++-
.../main/resources/mapper/MallOrderMapper.xml | 14 +-
.../mapper/ProblemFeedbackMapper.xml | 143 +++++++++++--
.../main/resources/mapper/ProductMapper.xml | 3 +
.../mapper/WorkerRelaPriceMapper.xml | 3 +
33 files changed, 816 insertions(+), 108 deletions(-)
create mode 100644 hiver-modules/hiver-mall/src/main/resources/db/mall_order_saved_amount.sql
create mode 100644 hiver-modules/hiver-mall/src/main/resources/db/problem_feedback_fields.sql
diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html
index 01a92d74..c18efe96 100644
--- a/hiver-admin/test-output/test-report.html
+++ b/hiver-admin/test-output/test-report.html
@@ -35,7 +35,7 @@
Hiver
-ÁùÔÂ 28, 2026 16:54:23
+ÆßÔÂ 04, 2026 18:19:53
@@ -84,7 +84,7 @@
passTest
-
16:54:23 ÏÂÎç / 0.026 secs
+
18:19:54 ÏÂÎç / 0.029 secs
@@ -92,9 +92,9 @@
#test-id=1
passTest
-
06.28.2026 16:54:23
-
06.28.2026 16:54:23
-
0.026 secs
+
07.04.2026 18:19:54
+
07.04.2026 18:19:54
+
0.029 secs
@@ -104,7 +104,7 @@
| Pass |
- 16:54:23 |
+ 18:19:54 |
Test passed
|
@@ -128,13 +128,13 @@
Started
-
ÁùÔÂ 28, 2026 16:54:23
+
ÆßÔÂ 04, 2026 18:19:53
Ended
-
ÁùÔÂ 28, 2026 16:54:23
+
ÆßÔÂ 04, 2026 18:19:54
diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java
index 6fd3b5fe..5847ccfe 100644
--- a/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java
+++ b/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java
@@ -6,6 +6,7 @@ import cc.hiver.core.vo.ShopUserDto;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
+import java.math.BigDecimal;
import java.util.List;
/**
@@ -117,4 +118,8 @@ public interface UserDao extends HiverBaseDao
{
@Modifying
@Query("update User u set u.mobile=?1 where u.id=?2")
void updateUserPhoneById(String userPhone, String userId);
+
+ @Modifying
+ @Query(value = "update t_user set saved_amount = coalesce(saved_amount, 0) + ?2 where id = ?1", nativeQuery = true)
+ int increaseSavedAmount(String userId, BigDecimal savedAmount);
}
diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/User.java b/hiver-core/src/main/java/cc/hiver/core/entity/User.java
index abd50d74..baaeafba 100644
--- a/hiver-core/src/main/java/cc/hiver/core/entity/User.java
+++ b/hiver-core/src/main/java/cc/hiver/core/entity/User.java
@@ -143,4 +143,7 @@ public class User extends HiverBaseEntity {
@ApiModelProperty("当å‰è´¦æˆ·ä½™é¢")
private BigDecimal depoBal = new BigDecimal(0);
+
+ @ApiModelProperty("累计已çœé‡‘é¢")
+ private BigDecimal savedAmount = new BigDecimal(0);
}
diff --git a/hiver-core/src/main/java/cc/hiver/core/service/UserService.java b/hiver-core/src/main/java/cc/hiver/core/service/UserService.java
index 20151366..d425c1fc 100644
--- a/hiver-core/src/main/java/cc/hiver/core/service/UserService.java
+++ b/hiver-core/src/main/java/cc/hiver/core/service/UserService.java
@@ -10,6 +10,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.query.Param;
+import java.math.BigDecimal;
import java.util.List;
/**
@@ -107,6 +108,8 @@ public interface UserService extends HiverBaseService {
*/
void updateDepartmentTitle(String departmentId, String departmentTitle);
+ int increaseSavedAmount(String userId, BigDecimal savedAmount);
+
/**
* é€šè¿‡è§’è‰²åæœç´¢
*
diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java
index d08c1f05..21c2aa8b 100644
--- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java
+++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java
@@ -31,6 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.criteria.*;
+import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -66,6 +67,11 @@ public class UserServiceImpl implements UserService {
return userDao;
}
+ @Override
+ public int increaseSavedAmount(String userId, BigDecimal savedAmount) {
+ return userDao.increaseSavedAmount(userId, savedAmount);
+ }
+
@Override
public User findByUsername(String username) {
final User user = userDao.findByUsername(username);
diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java
index be65f64c..f6f38a98 100644
--- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java
+++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java
@@ -82,6 +82,9 @@ public class WorkerServiceImpl implements WorkerService {
if (CharSequenceUtil.isNotBlank(worker.getWorkerName())) {
list.add(cb.like(workerNameField, '%' + worker.getWorkerName() + '%'));
}
+ if (CharSequenceUtil.isNotBlank(worker.getMobile())) {
+ list.add(cb.like(mobileField, '%' + worker.getMobile() + '%'));
+ }
// 状æ€
if (worker.getWorkerStatus() != null) {
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java
index 7905aadf..03b99767 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java
@@ -10,7 +10,6 @@ import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.dto.ShopCacheDTO;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
-import cc.hiver.mall.utils.ShopGroupOrderCacheUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -31,6 +30,8 @@ import java.util.stream.Collectors;
@RequestMapping("/hiver/mall/admin/orderGroup")
public class AdminMallOrderGroupController {
+ private static final int GROUP_STATUS_FACE_TO_FACE = 3;
+
@Autowired
private MallOrderGroupService mallOrderGroupService;
@@ -40,9 +41,6 @@ public class AdminMallOrderGroupController {
@Autowired
private MallOrderGoodsMapper mallOrderGoodsMapper;
- @Autowired
- private ShopGroupOrderCacheUtil shopGroupOrderCacheUtil;
-
@Autowired
private RedisTemplateHelper redisTemplateHelper;
@@ -59,6 +57,7 @@ public class AdminMallOrderGroupController {
private String headUserId;
private Integer status;
private String productName;
+ private String shopName;
private String keyWord;
private Integer isFace;
private Integer merchantType;
@@ -98,18 +97,8 @@ public class AdminMallOrderGroupController {
if (query == null || StringUtils.isBlank(query.getRegionId())) {
return ResultUtil.error("regionIdä¸èƒ½ä¸ºç©º");
}
- if (query.getStatus() == null) {
- query.setStatus(0);
- }
- if (query.getIsFace() == null) {
- query.setIsFace(0);
- }
- List groups = shopGroupOrderCacheUtil.getAllByRegion(query.getRegionId());
- if (groups == null) {
- groups = listGroupsFromDb(query);
- shopGroupOrderCacheUtil.putAllByRegion(query.getRegionId(), groups);
- }
+ List groups = listGroupsFromDb(query);
groups = filterGroups(groups, query);
Map shopMap = buildShopMap(groups, query.getRegionId());
@@ -148,6 +137,9 @@ public class AdminMallOrderGroupController {
if (StringUtils.isNotBlank(query.getProductName())) {
qw.like(MallOrderGroup::getProductName, query.getProductName());
}
+ if (StringUtils.isNotBlank(query.getShopName())) {
+ qw.like(MallOrderGroup::getShopName, query.getShopName());
+ }
if (query.getIsFace() != null) {
qw.eq(MallOrderGroup::getIsFace, query.getIsFace());
}
@@ -166,6 +158,10 @@ public class AdminMallOrderGroupController {
.filter(group -> StringUtils.isBlank(query.getHeadUserId()) || query.getHeadUserId().equals(group.getHeadUserId()))
.filter(group -> query.getStatus() == null || query.getStatus().equals(group.getStatus()))
.filter(group -> query.getIsFace() == null || query.getIsFace().equals(group.getIsFace()))
+ .filter(group -> StringUtils.isBlank(query.getShopName()) || contains(group.getShopName(), query.getShopName()))
+ .filter(group -> query.getStatus() == null
+ || query.getStatus() != GROUP_STATUS_FACE_TO_FACE
+ || Integer.valueOf(1).equals(group.getIsFace()))
.collect(Collectors.toList());
}
@@ -310,32 +306,48 @@ public class AdminMallOrderGroupController {
OrderGroupDetailVo vo = new OrderGroupDetailVo();
vo.setGroup(group);
- // èŽ·å–æ‹¼å›¢çš„å订å•
- if (StringUtils.isNotBlank(group.getGroupOrderIds())) {
- List orderIds = Arrays.asList(group.getGroupOrderIds().split(","));
- if (!orderIds.isEmpty()) {
- LambdaQueryWrapper oqw = new LambdaQueryWrapper<>();
- oqw.in(MallOrder::getId, orderIds);
- List childOrders = mallOrderService.list(oqw);
- // 2. 一次 IN æŸ¥è¯¢æ‰€æœ‰å•†å“æ˜Žç»†
- List allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds);
-
- // 3. 按 orderId 分组
- java.util.Map> goodsMap = allGoods.stream()
- .collect(java.util.stream.Collectors.groupingBy(MallOrderGoods::getOrderId));
-
- // 4. 组装到æ¯ä¸ª VO
- for (MallOrder order : childOrders) {
- order.setGoodsList(goodsMap.getOrDefault(order.getId(), java.util.Collections.emptyList()));
- }
- vo.setChildOrders(childOrders);
- } else {
- vo.setChildOrders(new ArrayList<>());
+ // èŽ·å–æ‹¼å›¢çš„æ‰€æœ‰è®¢å•,ä¸åŒ…嫿œªæ”¯ä»˜ã€å¤±è´¥/å–æ¶ˆç‰çжæ€ã€‚
+ List orderIds = buildGroupOrderIds(group);
+ if (!orderIds.isEmpty()) {
+ LambdaQueryWrapper oqw = new LambdaQueryWrapper<>();
+ oqw.in(MallOrder::getId, orderIds).isNotNull(MallOrder::getPayTime)
+ .ne(MallOrder::getStatus, 6);;
+ List childOrders = mallOrderService.list(oqw);
+ List allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds);
+ if (allGoods == null) {
+ allGoods = Collections.emptyList();
}
+
+ java.util.Map> goodsMap = allGoods.stream()
+ .collect(java.util.stream.Collectors.groupingBy(MallOrderGoods::getOrderId));
+
+ for (MallOrder order : childOrders) {
+ order.setGoodsList(goodsMap.getOrDefault(order.getId(), java.util.Collections.emptyList()));
+ }
+ java.util.Map orderMap = childOrders.stream()
+ .collect(java.util.stream.Collectors.toMap(MallOrder::getId, order -> order, (a, b) -> a));
+ vo.setChildOrders(orderIds.stream()
+ .map(orderMap::get)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList()));
} else {
vo.setChildOrders(new ArrayList<>());
}
return new ResultUtil().setData(vo);
}
+
+ private List buildGroupOrderIds(MallOrderGroup group) {
+ Set orderIds = new LinkedHashSet<>();
+ if (StringUtils.isNotBlank(group.getHeadOrderId())) {
+ orderIds.add(group.getHeadOrderId());
+ }
+ if (StringUtils.isNotBlank(group.getGroupOrderIds())) {
+ Arrays.stream(group.getGroupOrderIds().split(","))
+ .map(String::trim)
+ .filter(StringUtils::isNotBlank)
+ .forEach(orderIds::add);
+ }
+ return new ArrayList<>(orderIds);
+ }
}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java
index d01c7e63..c06a91ed 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java
@@ -22,7 +22,9 @@ import cc.hiver.core.common.utils.StringUtils;
import cc.hiver.core.common.vo.Result;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.serviceimpl.WorkerServiceImpl;
+import cc.hiver.mall.dao.mapper.MallOrderGoodsMapper;
import cc.hiver.mall.entity.Comment;
+import cc.hiver.mall.entity.MallOrderGoods;
import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.pojo.dto.ShopCacheDTO;
import cc.hiver.mall.pojo.query.CommentQuery;
@@ -46,6 +48,8 @@ import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
/**
* 评论接å£
@@ -76,6 +80,9 @@ public class CommentController {
@Autowired
private WorkerServiceImpl workerServiceImpl;
+ @Autowired
+ private MallOrderGoodsMapper mallOrderGoodsMapper;
+
@RequestMapping(value = "/save", method = RequestMethod.POST)
@ApiOperation("ä¿å˜")
@@ -208,9 +215,21 @@ public class CommentController {
//评论分页
final Page commentsPage = commentService.getCommentList(commentQuery);
final List parentIds = new ArrayList<>();
+ final List orderIds = new ArrayList<>();
commentsPage.getRecords().forEach(e -> {
parentIds.add(e.getId());
+ if (StringUtils.isNotBlank(e.getOrderId())) {
+ orderIds.add(e.getOrderId());
+ }
});
+ //æŒ‰æœ¬é¡µè®¢å•æ‰¹é‡æŸ¥è¯¢å•†å“ï¼Œåœ¨å†…å˜æŒ‰è®¢å•组装到评论上
+ if(orderIds.size() > 0){
+ List goodsList = mallOrderGoodsMapper.selectByOrderIds(orderIds.stream().distinct().collect(Collectors.toList()));
+ Map> goodsMap = goodsList.stream()
+ .filter(goods -> StringUtils.isNotBlank(goods.getOrderId()))
+ .collect(Collectors.groupingBy(MallOrderGoods::getOrderId));
+ commentsPage.getRecords().forEach(e -> e.setGoodsList(goodsMap.getOrDefault(e.getOrderId(), new ArrayList<>())));
+ }
//å°è£…å级评论
if(parentIds.size() > 0){
final List comments = commentService.getCommentListByParentId(parentIds);
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
index f220981a..000e0e8e 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
@@ -157,6 +157,21 @@ public class MallDeliveryOrderController {
return new ResultUtil