Browse Source

对接拼团数据1

master
wangfukang 3 weeks ago
parent
commit
afa08332c8
  1. 16
      hiver-admin/test-output/test-report.html
  2. 5
      hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java
  3. 3
      hiver-core/src/main/java/cc/hiver/core/entity/User.java
  4. 3
      hiver-core/src/main/java/cc/hiver/core/service/UserService.java
  5. 6
      hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java
  6. 3
      hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java
  7. 84
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/AdminMallOrderGroupController.java
  8. 19
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java
  9. 24
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  10. 52
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  11. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java
  12. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java
  13. 5
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Comment.java
  14. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java
  15. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopArea.java
  16. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java
  17. 68
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/controller/ProblemFeedbackController.java
  18. 35
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/entity/ProblemFeedback.java
  19. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/pojo/ProblemFeedbackPageQuery.java
  20. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/service/impl/ProblemFeedbackServiceImpl.java
  21. 40
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/vo/ProblemFeedbackPageVo.java
  22. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java
  23. 38
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  24. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  25. 78
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  26. 18
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  27. 5
      hiver-modules/hiver-mall/src/main/resources/db/mall_order_saved_amount.sql
  28. 13
      hiver-modules/hiver-mall/src/main/resources/db/problem_feedback_fields.sql
  29. 193
      hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml
  30. 14
      hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml
  31. 143
      hiver-modules/hiver-mall/src/main/resources/mapper/ProblemFeedbackMapper.xml
  32. 3
      hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml
  33. 3
      hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a> <a href="#"><span class="badge badge-primary">Hiver</span></a>
</li> </li>
<li class="m-r-10"> <li class="m-r-10">
<a href="#"><span class="badge badge-primary">六月 28, 2026 16:54:23</span></a> <a href="#"><span class="badge badge-primary">七月 04, 2026 18:19:53</span></a>
</li> </li>
</ul> </ul>
</div> </div>
@ -84,7 +84,7 @@
<div class="test-detail"> <div class="test-detail">
<span class="meta text-white badge badge-sm"></span> <span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p> <p class="name">passTest</p>
<p class="text-sm"><span>16:54:23 下午</span> / <span>0.026 secs</span></p> <p class="text-sm"><span>18:19:54 下午</span> / <span>0.029 secs</span></p>
</div> </div>
<div class="test-contents d-none"> <div class="test-contents d-none">
<div class="detail-head"> <div class="detail-head">
@ -92,9 +92,9 @@
<div class="info"> <div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div> <div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5> <h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>06.28.2026 16:54:23</span> <span class='badge badge-success'>07.04.2026 18:19:54</span>
<span class='badge badge-danger'>06.28.2026 16:54:23</span> <span class='badge badge-danger'>07.04.2026 18:19:54</span>
<span class='badge badge-default'>0.026 secs</span> <span class='badge badge-default'>0.029 secs</span>
</div> </div>
<div class="m-t-10 m-l-5"></div> <div class="m-t-10 m-l-5"></div>
</div> </div>
@ -104,7 +104,7 @@
<tbody> <tbody>
<tr class="event-row"> <tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td> <td><span class="badge log pass-bg">Pass</span></td>
<td>16:54:23</td> <td>18:19:54</td>
<td> <td>
Test passed Test passed
</td> </td>
@ -128,13 +128,13 @@
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Started</p> <p class="m-b-0">Started</p>
<h3>六月 28, 2026 16:54:23</h3> <h3>七月 04, 2026 18:19:53</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Ended</p> <p class="m-b-0">Ended</p>
<h3>六月 28, 2026 16:54:23</h3> <h3>七月 04, 2026 18:19:54</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

5
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.Modifying;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
@ -117,4 +118,8 @@ public interface UserDao extends HiverBaseDao<User, String> {
@Modifying @Modifying
@Query("update User u set u.mobile=?1 where u.id=?2") @Query("update User u set u.mobile=?1 where u.id=?2")
void updateUserPhoneById(String userPhone, String userId); 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);
} }

3
hiver-core/src/main/java/cc/hiver/core/entity/User.java

@ -143,4 +143,7 @@ public class User extends HiverBaseEntity {
@ApiModelProperty("当前账户余额") @ApiModelProperty("当前账户余额")
private BigDecimal depoBal = new BigDecimal(0); private BigDecimal depoBal = new BigDecimal(0);
@ApiModelProperty("累计已省金额")
private BigDecimal savedAmount = new BigDecimal(0);
} }

3
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.domain.Pageable;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
@ -107,6 +108,8 @@ public interface UserService extends HiverBaseService<User, String> {
*/ */
void updateDepartmentTitle(String departmentId, String departmentTitle); void updateDepartmentTitle(String departmentId, String departmentTitle);
int increaseSavedAmount(String userId, BigDecimal savedAmount);
/** /**
* 通过角色名搜索 * 通过角色名搜索
* *

6
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 org.springframework.transaction.annotation.Transactional;
import javax.persistence.criteria.*; import javax.persistence.criteria.*;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -66,6 +67,11 @@ public class UserServiceImpl implements UserService {
return userDao; return userDao;
} }
@Override
public int increaseSavedAmount(String userId, BigDecimal savedAmount) {
return userDao.increaseSavedAmount(userId, savedAmount);
}
@Override @Override
public User findByUsername(String username) { public User findByUsername(String username) {
final User user = userDao.findByUsername(username); final User user = userDao.findByUsername(username);

3
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())) { if (CharSequenceUtil.isNotBlank(worker.getWorkerName())) {
list.add(cb.like(workerNameField, '%' + 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) { if (worker.getWorkerStatus() != null) {

84
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.pojo.dto.ShopCacheDTO;
import cc.hiver.mall.service.mybatis.MallOrderGroupService; import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService; import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.utils.ShopGroupOrderCacheUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -31,6 +30,8 @@ import java.util.stream.Collectors;
@RequestMapping("/hiver/mall/admin/orderGroup") @RequestMapping("/hiver/mall/admin/orderGroup")
public class AdminMallOrderGroupController { public class AdminMallOrderGroupController {
private static final int GROUP_STATUS_FACE_TO_FACE = 3;
@Autowired @Autowired
private MallOrderGroupService mallOrderGroupService; private MallOrderGroupService mallOrderGroupService;
@ -40,9 +41,6 @@ public class AdminMallOrderGroupController {
@Autowired @Autowired
private MallOrderGoodsMapper mallOrderGoodsMapper; private MallOrderGoodsMapper mallOrderGoodsMapper;
@Autowired
private ShopGroupOrderCacheUtil shopGroupOrderCacheUtil;
@Autowired @Autowired
private RedisTemplateHelper redisTemplateHelper; private RedisTemplateHelper redisTemplateHelper;
@ -59,6 +57,7 @@ public class AdminMallOrderGroupController {
private String headUserId; private String headUserId;
private Integer status; private Integer status;
private String productName; private String productName;
private String shopName;
private String keyWord; private String keyWord;
private Integer isFace; private Integer isFace;
private Integer merchantType; private Integer merchantType;
@ -98,18 +97,8 @@ public class AdminMallOrderGroupController {
if (query == null || StringUtils.isBlank(query.getRegionId())) { if (query == null || StringUtils.isBlank(query.getRegionId())) {
return ResultUtil.error("regionId不能为空"); return ResultUtil.error("regionId不能为空");
} }
if (query.getStatus() == null) {
query.setStatus(0);
}
if (query.getIsFace() == null) {
query.setIsFace(0);
}
List<MallOrderGroup> groups = shopGroupOrderCacheUtil.getAllByRegion(query.getRegionId()); List<MallOrderGroup> groups = listGroupsFromDb(query);
if (groups == null) {
groups = listGroupsFromDb(query);
shopGroupOrderCacheUtil.putAllByRegion(query.getRegionId(), groups);
}
groups = filterGroups(groups, query); groups = filterGroups(groups, query);
Map<String, Shop> shopMap = buildShopMap(groups, query.getRegionId()); Map<String, Shop> shopMap = buildShopMap(groups, query.getRegionId());
@ -148,6 +137,9 @@ public class AdminMallOrderGroupController {
if (StringUtils.isNotBlank(query.getProductName())) { if (StringUtils.isNotBlank(query.getProductName())) {
qw.like(MallOrderGroup::getProductName, query.getProductName()); qw.like(MallOrderGroup::getProductName, query.getProductName());
} }
if (StringUtils.isNotBlank(query.getShopName())) {
qw.like(MallOrderGroup::getShopName, query.getShopName());
}
if (query.getIsFace() != null) { if (query.getIsFace() != null) {
qw.eq(MallOrderGroup::getIsFace, query.getIsFace()); 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 -> StringUtils.isBlank(query.getHeadUserId()) || query.getHeadUserId().equals(group.getHeadUserId()))
.filter(group -> query.getStatus() == null || query.getStatus().equals(group.getStatus())) .filter(group -> query.getStatus() == null || query.getStatus().equals(group.getStatus()))
.filter(group -> query.getIsFace() == null || query.getIsFace().equals(group.getIsFace())) .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()); .collect(Collectors.toList());
} }
@ -310,32 +306,48 @@ public class AdminMallOrderGroupController {
OrderGroupDetailVo vo = new OrderGroupDetailVo(); OrderGroupDetailVo vo = new OrderGroupDetailVo();
vo.setGroup(group); vo.setGroup(group);
// 获取拼团的子订单 // 获取拼团的所有订单,不包含未支付、失败/取消等状态。
if (StringUtils.isNotBlank(group.getGroupOrderIds())) { List<String> orderIds = buildGroupOrderIds(group);
List<String> orderIds = Arrays.asList(group.getGroupOrderIds().split(",")); if (!orderIds.isEmpty()) {
if (!orderIds.isEmpty()) { LambdaQueryWrapper<MallOrder> oqw = new LambdaQueryWrapper<>();
LambdaQueryWrapper<MallOrder> oqw = new LambdaQueryWrapper<>(); oqw.in(MallOrder::getId, orderIds).isNotNull(MallOrder::getPayTime)
oqw.in(MallOrder::getId, orderIds); .ne(MallOrder::getStatus, 6);;
List<MallOrder> childOrders = mallOrderService.list(oqw); List<MallOrder> childOrders = mallOrderService.list(oqw);
// 2. 一次 IN 查询所有商品明细 List<MallOrderGoods> allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds);
List<MallOrderGoods> allGoods = mallOrderGoodsMapper.selectByOrderIds(orderIds); if (allGoods == null) {
allGoods = Collections.emptyList();
// 3. 按 orderId 分组
java.util.Map<String, List<MallOrderGoods>> 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<>());
} }
java.util.Map<String, List<MallOrderGoods>> 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<String, MallOrder> 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 { } else {
vo.setChildOrders(new ArrayList<>()); vo.setChildOrders(new ArrayList<>());
} }
return new ResultUtil<OrderGroupDetailVo>().setData(vo); return new ResultUtil<OrderGroupDetailVo>().setData(vo);
} }
private List<String> buildGroupOrderIds(MallOrderGroup group) {
Set<String> 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);
}
} }

19
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.common.vo.Result;
import cc.hiver.core.entity.Worker; import cc.hiver.core.entity.Worker;
import cc.hiver.core.serviceimpl.WorkerServiceImpl; import cc.hiver.core.serviceimpl.WorkerServiceImpl;
import cc.hiver.mall.dao.mapper.MallOrderGoodsMapper;
import cc.hiver.mall.entity.Comment; import cc.hiver.mall.entity.Comment;
import cc.hiver.mall.entity.MallOrderGoods;
import cc.hiver.mall.entity.Shop; import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.pojo.dto.ShopCacheDTO; import cc.hiver.mall.pojo.dto.ShopCacheDTO;
import cc.hiver.mall.pojo.query.CommentQuery; import cc.hiver.mall.pojo.query.CommentQuery;
@ -46,6 +48,8 @@ import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 评论接口 * 评论接口
@ -76,6 +80,9 @@ public class CommentController {
@Autowired @Autowired
private WorkerServiceImpl workerServiceImpl; private WorkerServiceImpl workerServiceImpl;
@Autowired
private MallOrderGoodsMapper mallOrderGoodsMapper;
@RequestMapping(value = "/save", method = RequestMethod.POST) @RequestMapping(value = "/save", method = RequestMethod.POST)
@ApiOperation("保存") @ApiOperation("保存")
@ -208,9 +215,21 @@ public class CommentController {
//评论分页 //评论分页
final Page<Comment> commentsPage = commentService.getCommentList(commentQuery); final Page<Comment> commentsPage = commentService.getCommentList(commentQuery);
final List<String> parentIds = new ArrayList<>(); final List<String> parentIds = new ArrayList<>();
final List<String> orderIds = new ArrayList<>();
commentsPage.getRecords().forEach(e -> { commentsPage.getRecords().forEach(e -> {
parentIds.add(e.getId()); parentIds.add(e.getId());
if (StringUtils.isNotBlank(e.getOrderId())) {
orderIds.add(e.getOrderId());
}
}); });
//按本页订单批量查询商品,在内存按订单组装到评论上
if(orderIds.size() > 0){
List<MallOrderGoods> goodsList = mallOrderGoodsMapper.selectByOrderIds(orderIds.stream().distinct().collect(Collectors.toList()));
Map<String, List<MallOrderGoods>> 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){ if(parentIds.size() > 0){
final List<Comment> comments = commentService.getCommentListByParentId(parentIds); final List<Comment> comments = commentService.getCommentListByParentId(parentIds);

24
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -157,6 +157,21 @@ public class MallDeliveryOrderController {
return new ResultUtil<Object>().setData(cacheResult); return new ResultUtil<Object>().setData(cacheResult);
} }
@PostMapping("/admin/page")
@ApiOperation(value = "后台管理端分页查询抢单大厅配送单", notes = "直接查数据库,不走用户端缓存")
public Result<Object> adminPage(@RequestBody MallDeliveryOrderPageQuery q) {
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDeliveryAdminHall(q);
Map<String, Object> result = new HashMap<>();
result.put("records", page.getRecords());
result.put("total", page.getTotal());
result.put("size", page.getSize());
result.put("current", page.getCurrent());
result.put("pages", page.getPages());
result.put("orderCount", mallDeliveryOrderService.countOrdersByTypeAdmin(q));
result.put("zhipaiCount", mallDeliveryOrderService.countAssignedWaitOrdersAdmin(q));
return new ResultUtil<Object>().setData(result);
}
private String currentUserId() { private String currentUserId() {
try { try {
User user = securityUtil.getCurrUser(); User user = securityUtil.getCurrUser();
@ -208,6 +223,13 @@ public class MallDeliveryOrderController {
return new ResultUtil<Object>().setData(page); return new ResultUtil<Object>().setData(page);
} }
@PostMapping("/admin/pagebyworker")
@ApiOperation(value = "后台管理端分页查询配送中订单", notes = "直接查数据库,不按 workerId 缓存维度查询")
public Result<Object> adminPageByWorker(@RequestBody MallDeliveryOrderPageQuery q) {
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDeliveryByStatusAdmin(q);
return new ResultUtil<Object>().setData(page);
}
@PostMapping("/pageShopDelivery") @PostMapping("/pageShopDelivery")
@ApiOperation(value = "分页查询商家自配送单") @ApiOperation(value = "分页查询商家自配送单")
public Result<Object> pageShopDelivery(@RequestBody MallDeliveryOrderPageQuery q) { public Result<Object> pageShopDelivery(@RequestBody MallDeliveryOrderPageQuery q) {
@ -222,8 +244,6 @@ public class MallDeliveryOrderController {
public Result<Object> pageTransferDelivery(@RequestBody MallDeliveryOrderPageQuery q) { public Result<Object> pageTransferDelivery(@RequestBody MallDeliveryOrderPageQuery q) {
q.setTransferDelivery(1); q.setTransferDelivery(1);
q.setDeliveryType(1); q.setDeliveryType(1);
q.setStatus(null);
q.setTransferArriveEmpty(null);
q.setOrder("transferDelivery"); q.setOrder("transferDelivery");
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q); IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
return new ResultUtil<Object>().setData(page); return new ResultUtil<Object>().setData(page);

52
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java

@ -150,23 +150,35 @@ public class WorkerController {
@RequestMapping(value = "/admin/edit", method = RequestMethod.POST) @RequestMapping(value = "/admin/edit", method = RequestMethod.POST)
@ApiOperation(value = "修改配送员信息", notes = "需要通过下单编号获取订单信息") @ApiOperation(value = "修改配送员信息", notes = "需要通过下单编号获取订单信息")
public Result edit(@RequestBody Worker u) { public Result edit(@RequestBody Worker u) {
Worker worker = workerService.findByWorkerId(u.getWorkerId());
if (worker == null) {
return ResultUtil.error("配送员不存在");
}
String oldRegion = worker.getRegion();
org.springframework.beans.BeanUtils.copyProperties(u, worker, BeanUtils.getNullPropertyNames(u));
if (StrUtil.isNotBlank(u.getRegion())) { if (StrUtil.isNotBlank(worker.getRegion())) {
ShopArea d = shopAreaService.get(u.getRegion()); ShopArea d = shopAreaService.get(worker.getRegion());
if (d != null) { if (d != null) {
u.setRegionTitle(d.getTitle()); worker.setRegionTitle(d.getTitle());
} }
} else { } else {
u.setRegion(null); worker.setRegion(null);
u.setRegionTitle(""); worker.setRegionTitle("");
} }
workerService.update(u); workerService.update(worker);
Worker worker = workerService.findByWorkerId(u.getWorkerId()); WorkerRedisVo workerRedisVo = StrUtil.isNotBlank(oldRegion) ? workerRedisCacheUtil.get(oldRegion, worker.getWorkerId()) : null;
WorkerRedisVo workerRedisVo = workerRedisCacheUtil.get(worker.getRegion(), worker.getWorkerId());
if(workerRedisVo != null){ if(workerRedisVo != null){
workerRedisVo.setWorker(worker); workerRedisVo.setWorker(worker);
if (Objects.equals(oldRegion, worker.getRegion())) {
workerRedisCacheUtil.update(worker.getRegion(), workerRedisVo);
} else {
workerRedisCacheUtil.remove(oldRegion, worker.getWorkerId());
if (StrUtil.isNotBlank(worker.getRegion())) {
workerRedisCacheUtil.put(worker.getRegion(), workerRedisVo);
}
}
} }
workerRedisCacheUtil.update(worker.getRegion(), workerRedisVo);
return ResultUtil.success("修改成功"); return ResultUtil.success("修改成功");
} }
@ -216,10 +228,15 @@ public class WorkerController {
@ApiOperation(value = "后台人工禁用配送员") @ApiOperation(value = "后台人工禁用配送员")
public Result disable(@ApiParam("用户唯一id标识") @PathVariable String workerId) { public Result disable(@ApiParam("用户唯一id标识") @PathVariable String workerId) {
Worker worker = workerService.get(workerId); Worker worker = workerService.get(workerId);
if (worker == null) {
return ResultUtil.error("配送员不存在");
}
worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_DISABLE); worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_DISABLE);
worker.setIsOnLine(CommonConstant.OFF_LINE);
workerService.update(worker); workerService.update(worker);
// 手动更新缓存 if (StrUtil.isNotBlank(worker.getRegion())) {
//redisTemplate.delete(WORKER + worker.getWorkerId()); workerRedisCacheUtil.remove(worker.getRegion(), worker.getWorkerId());
}
return ResultUtil.success("操作成功"); return ResultUtil.success("操作成功");
} }
@ -227,6 +244,9 @@ public class WorkerController {
@ApiOperation(value = "后台人工启用配送员") @ApiOperation(value = "后台人工启用配送员")
public Result enable(@ApiParam("配送员唯一id标识") @PathVariable String workerId) { public Result enable(@ApiParam("配送员唯一id标识") @PathVariable String workerId) {
Worker worker = workerService.get(workerId); Worker worker = workerService.get(workerId);
if (worker == null) {
return ResultUtil.error("配送员不存在");
}
//这儿暂时有bug,启用的时候其实需要判定原状态是启用还是不可接单状态,需要进行逻辑判断 //这儿暂时有bug,启用的时候其实需要判定原状态是启用还是不可接单状态,需要进行逻辑判断
worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_NORMAL); worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_NORMAL);
workerService.update(worker); workerService.update(worker);
@ -247,9 +267,16 @@ public class WorkerController {
@ApiOperation(value = "配送员上线") @ApiOperation(value = "配送员上线")
public Result<Object> onLine(@RequestParam("id") String id) { public Result<Object> onLine(@RequestParam("id") String id) {
try { try {
Worker worker = workerService.get(id);
if (worker == null) {
return ResultUtil.error("配送员不存在");
}
if (WorkerConstant.WORKER_STATUS_DISABLE.equals(worker.getWorkerStatus())) {
return ResultUtil.error("配送员已禁用,无法上线");
}
workerService.onLine(id); workerService.onLine(id);
//添加缓存 //添加缓存
Worker worker = workerService.get(id); worker = workerService.get(id);
WorkerRedisVo workerVO = new WorkerRedisVo(); WorkerRedisVo workerVO = new WorkerRedisVo();
workerVO.setWorkerId(worker.getWorkerId()); workerVO.setWorkerId(worker.getWorkerId());
workerVO.setWorker(worker); workerVO.setWorker(worker);
@ -482,6 +509,7 @@ public class WorkerController {
IPage<WorkerMatchVO> pageParam = new Page<>(pageNum, pageSize); IPage<WorkerMatchVO> pageParam = new Page<>(pageNum, pageSize);
IPage<WorkerMatchVO> pageResult = workerRelaPriceMapper.getMatchingWorkerList( IPage<WorkerMatchVO> pageResult = workerRelaPriceMapper.getMatchingWorkerList(
pageParam, pageParam,
dto.getRegionId(),
dto.getShopAreaId(), dto.getShopAreaId(),
dto.getOrderType(), dto.getOrderType(),
dto.getPutAreaId(), dto.getPutAreaId(),

14
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallDeliveryOrderMapper.java

@ -23,11 +23,21 @@ public interface MallDeliveryOrderMapper extends BaseMapper<MallDeliveryOrder> {
*/ */
IPage<MallDeliveryOrder> selectPageVO(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q); IPage<MallDeliveryOrder> selectPageVO(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q);
/**
* 后台管理端抢单大厅查询直接查库
*/
IPage<MallDeliveryOrder> selectAdminHallPageVO(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q);
/** /**
* 分页查询配送单 * 分页查询配送单
*/ */
IPage<MallDeliveryOrder> selectPageVOByStatus(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q); IPage<MallDeliveryOrder> selectPageVOByStatus(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q);
/**
* 后台管理端配送中订单查询直接查库
*/
IPage<MallDeliveryOrder> selectAdminPageVOByStatus(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q);
IPage<MallDeliveryOrder> selectPageVOByStatusHis(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q); IPage<MallDeliveryOrder> selectPageVOByStatusHis(IPage<?> page, @Param("q") MallDeliveryOrderPageQuery q);
/** /**
@ -37,6 +47,10 @@ public interface MallDeliveryOrderMapper extends BaseMapper<MallDeliveryOrder> {
List<Map<Integer, Integer>> countOrdersByType(@Param("regionId") String regionId); List<Map<Integer, Integer>> countOrdersByType(@Param("regionId") String regionId);
List<Map<Integer, Integer>> countOrdersByTypeAdmin(@Param("q") MallDeliveryOrderPageQuery q);
long countAssignedWaitOrdersAdmin(@Param("q") MallDeliveryOrderPageQuery q);
List<Worker> countOrdersLimit(@Param("regionId") String regionId); List<Worker> countOrdersLimit(@Param("regionId") String regionId);
List<Map<String, Object>> countOrdersByStatus(@Param("workerId") String workerId); List<Map<String, Object>> countOrdersByStatus(@Param("workerId") String workerId);

1
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/WorkerRelaPriceMapper.java

@ -36,6 +36,7 @@ public interface WorkerRelaPriceMapper extends BaseMapper<WorkerRelaPrice> {
*/ */
IPage<WorkerMatchVO> getMatchingWorkerList( IPage<WorkerMatchVO> getMatchingWorkerList(
IPage<WorkerMatchVO> page, IPage<WorkerMatchVO> page,
@Param("regionId") String regionId,
@Param("shopAreaId") String shopAreaId, @Param("shopAreaId") String shopAreaId,
@Param("orderType") Integer orderType, @Param("orderType") Integer orderType,
@Param("putAreaId") String putAreaId, @Param("putAreaId") String putAreaId,

5
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Comment.java

@ -63,4 +63,9 @@ public class Comment implements Serializable {
@ApiModelProperty(value = "子级评论") @ApiModelProperty(value = "子级评论")
private List<Comment> comments; private List<Comment> comments;
@Transient
@TableField(exist = false)
@ApiModelProperty(value = "订单商品")
private List<MallOrderGoods> goodsList;
} }

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java

@ -89,6 +89,9 @@ public class MallOrder implements Serializable {
@ApiModelProperty("免单金额") @ApiModelProperty("免单金额")
private BigDecimal freeAmount; private BigDecimal freeAmount;
@ApiModelProperty("本单已省金额")
private BigDecimal savedAmount;
@ApiModelProperty("是否商家自配送 0否 1是") @ApiModelProperty("是否商家自配送 0否 1是")
private Integer shopDelivery; private Integer shopDelivery;

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopArea.java

@ -34,7 +34,7 @@ public class ShopArea extends HiverBaseEntity {
@ApiModelProperty(value = "圈层名称") @ApiModelProperty(value = "圈层名称")
private String title; private String title;
@ApiModelProperty(value = "1 是食堂") @ApiModelProperty(value = "1 是食堂 2驿站")
private Integer isCanteen; private Integer isCanteen;
@ApiModelProperty(value = "父id") @ApiModelProperty(value = "父id")

1
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java

@ -307,6 +307,7 @@ public class OrderAsyncConsumer {
MallOrder order = mallOrderMapper.selectById(orderId); MallOrder order = mallOrderMapper.selectById(orderId);
if (order != null) { if (order != null) {
regionId = StringUtils.defaultIfBlank(order.getRegionId(), regionId); regionId = StringUtils.defaultIfBlank(order.getRegionId(), regionId);
mallOrderService.addUserSavedAmountAfterFinish(order);
} }
if (StringUtils.isBlank(regionId)) { if (StringUtils.isBlank(regionId)) {
log.warn("[白嫖星球] 配送完成发券缺少商圈 orderId={}, userId={}", orderId, userId); log.warn("[白嫖星球] 配送完成发券缺少商圈 orderId={}, userId={}", orderId, userId);

68
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/controller/ProblemFeedbackController.java

@ -3,6 +3,7 @@ package cc.hiver.mall.problemfeedback.controller;
import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.vo.Result; import cc.hiver.core.common.vo.Result;
import cc.hiver.core.entity.User;
import cc.hiver.mall.problemfeedback.entity.ProblemFeedback; import cc.hiver.mall.problemfeedback.entity.ProblemFeedback;
import cc.hiver.mall.problemfeedback.pojo.ProblemFeedbackPageQuery; import cc.hiver.mall.problemfeedback.pojo.ProblemFeedbackPageQuery;
import cc.hiver.mall.problemfeedback.service.ProblemFeedbackService; import cc.hiver.mall.problemfeedback.service.ProblemFeedbackService;
@ -19,6 +20,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/** /**
* 问题反馈控制层 * 问题反馈控制层
* @author 王富康 * @author 王富康
@ -40,11 +43,34 @@ public class ProblemFeedbackController {
@RequestMapping(value = "/saveOrUpdateProblemFeedback", method = RequestMethod.POST) @RequestMapping(value = "/saveOrUpdateProblemFeedback", method = RequestMethod.POST)
@ApiOperation("新增或者修改问题反馈信息") @ApiOperation("新增或者修改问题反馈信息")
public Result saveOrUpdateProblemFeedback(@RequestBody ProblemFeedback problemFeedback) { public Result saveOrUpdateProblemFeedback(@RequestBody ProblemFeedback problemFeedback) {
if (problemFeedback == null) {
// 店铺名称从前台传递过来 return ResultUtil.error("反馈信息不能为空!");
// 从缓存中获取店铺的id }
final String shopId = securityUtil.getShopId(); if (StringUtils.isEmpty(problemFeedback.getProblemContent())) {
problemFeedback.setShopId(shopId); return ResultUtil.error("反馈内容不能为空!");
}
if (StringUtils.isEmpty(problemFeedback.getId())) {
if (problemFeedback.getStatus() == null) {
problemFeedback.setStatus(0);
}
try {
User user = securityUtil.getCurrUser();
if (user != null) {
if (StringUtils.isEmpty(problemFeedback.getUserId())) {
problemFeedback.setUserId(user.getId());
}
if (StringUtils.isEmpty(problemFeedback.getUserName())) {
problemFeedback.setUserName(user.getNickname());
}
if (StringUtils.isEmpty(problemFeedback.getContactPhone())) {
problemFeedback.setContactPhone(user.getMobile());
}
problemFeedback.setCreateBy(user.getId());
}
} catch (Exception e) {
log.warn("保存问题反馈时获取当前用户失败", e);
}
}
final boolean b = problemFeedbackService.saveOrUpdate(problemFeedback); final boolean b = problemFeedbackService.saveOrUpdate(problemFeedback);
if (b) { if (b) {
return ResultUtil.success("保存成功!"); return ResultUtil.success("保存成功!");
@ -100,4 +126,36 @@ public class ProblemFeedbackController {
final IPage<ProblemFeedbackPageVo> result = problemFeedbackService.getProblemFeedbackList(problemFeedbackPageQuery); final IPage<ProblemFeedbackPageVo> result = problemFeedbackService.getProblemFeedbackList(problemFeedbackPageQuery);
return new ResultUtil<IPage<ProblemFeedbackPageVo>>().setData(result); return new ResultUtil<IPage<ProblemFeedbackPageVo>>().setData(result);
} }
@RequestMapping(value = "/replyProblemFeedback", method = RequestMethod.POST)
@ApiOperation("回复问题反馈")
public Result replyProblemFeedback(@RequestBody ProblemFeedback problemFeedback) {
if (problemFeedback == null || StringUtils.isEmpty(problemFeedback.getId())) {
return ResultUtil.error("主键id不能为空!");
}
if (StringUtils.isEmpty(problemFeedback.getHandleOpinion())) {
return ResultUtil.error("处理意见不能为空!");
}
ProblemFeedback update = new ProblemFeedback();
update.setId(problemFeedback.getId());
update.setHandleOpinion(problemFeedback.getHandleOpinion());
update.setStatus(1);
update.setHandleTime(new Date());
try {
User user = securityUtil.getCurrUser();
if (user != null) {
update.setHandleUserId(user.getId());
update.setHandleUserName(user.getNickname());
update.setUpdateBy(user.getId());
}
} catch (Exception e) {
log.warn("回复问题反馈时获取当前用户失败", e);
}
final boolean b = problemFeedbackService.updateById(update);
if (b) {
return ResultUtil.success("处理成功!");
} else {
return ResultUtil.error("处理失败!");
}
}
} }

35
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/entity/ProblemFeedback.java

@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.Date;
@Data @Data
@ApiModel(value = "问题反馈表") @ApiModel(value = "问题反馈表")
@TableName(value = "t_problem_feedback", autoResultMap = true) @TableName(value = "t_problem_feedback", autoResultMap = true)
@ -19,11 +21,36 @@ public class ProblemFeedback extends HiverBaseEntity {
@ApiModelProperty(value = "问题图片") @ApiModelProperty(value = "问题图片")
private String problemPicture; private String problemPicture;
@ApiModelProperty(value = "店铺id") @ApiModelProperty(value = "用户id")
private String shopId; private String userId;
@ApiModelProperty(value = "用户昵称")
private String userName;
@ApiModelProperty(value = "联系电话")
private String contactPhone;
@ApiModelProperty(value = "反馈类型")
private String feedbackType;
@ApiModelProperty(value = "区域id")
private String regionId;
@ApiModelProperty(value = "区域名称")
private String regionName;
@ApiModelProperty(value = "状态:0待回复,1已回复")
private Integer status;
@ApiModelProperty(value = "处理意见")
private String handleOpinion;
@ApiModelProperty(value = "店铺名称") @ApiModelProperty(value = "处理人id")
private String shopName; private String handleUserId;
@ApiModelProperty(value = "处理人名称")
private String handleUserName;
@ApiModelProperty(value = "处理时间")
private Date handleTime;
} }

12
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/pojo/ProblemFeedbackPageQuery.java

@ -13,4 +13,16 @@ public class ProblemFeedbackPageQuery extends HiverBasePageQuery {
@ApiModelProperty(value = "问题内容") @ApiModelProperty(value = "问题内容")
private String problemContent; private String problemContent;
@ApiModelProperty(value = "用户id")
private String userId;
@ApiModelProperty(value = "区域id")
private String regionId;
@ApiModelProperty(value = "状态:0待回复,1已回复")
private Integer status;
@ApiModelProperty(value = "反馈类型")
private String feedbackType;
} }

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/service/impl/ProblemFeedbackServiceImpl.java

@ -24,6 +24,9 @@ public class ProblemFeedbackServiceImpl extends ServiceImpl<ProblemFeedbackMappe
@Override @Override
public IPage<ProblemFeedbackPageVo> getProblemFeedbackList(ProblemFeedbackPageQuery problemFeedbackPageQuery) { public IPage<ProblemFeedbackPageVo> getProblemFeedbackList(ProblemFeedbackPageQuery problemFeedbackPageQuery) {
if (problemFeedbackPageQuery == null) {
problemFeedbackPageQuery = new ProblemFeedbackPageQuery();
}
final Page<ProblemFeedbackPageVo> page = new Page<>(problemFeedbackPageQuery.getPageNum(), problemFeedbackPageQuery.getPageSize()); final Page<ProblemFeedbackPageVo> page = new Page<>(problemFeedbackPageQuery.getPageNum(), problemFeedbackPageQuery.getPageSize());
return problemFeedbackMapper.getProblemFeedbackList(page, problemFeedbackPageQuery); return problemFeedbackMapper.getProblemFeedbackList(page, problemFeedbackPageQuery);
} }

40
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/problemfeedback/vo/ProblemFeedbackPageVo.java

@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.util.Date;
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@TableName(autoResultMap = true) @TableName(autoResultMap = true)
@ -19,9 +21,39 @@ public class ProblemFeedbackPageVo {
@ApiModelProperty(value = "问题图片") @ApiModelProperty(value = "问题图片")
private String problemPicture; private String problemPicture;
@ApiModelProperty(value = "店铺id") @ApiModelProperty(value = "用户id")
private String shopId; private String userId;
@ApiModelProperty(value = "用户昵称")
private String userName;
@ApiModelProperty(value = "联系电话")
private String contactPhone;
@ApiModelProperty(value = "反馈类型")
private String feedbackType;
@ApiModelProperty(value = "区域id")
private String regionId;
@ApiModelProperty(value = "区域名称")
private String regionName;
@ApiModelProperty(value = "状态:0待回复,1已回复")
private Integer status;
@ApiModelProperty(value = "处理意见")
private String handleOpinion;
@ApiModelProperty(value = "处理人id")
private String handleUserId;
@ApiModelProperty(value = "处理人名称")
private String handleUserName;
@ApiModelProperty(value = "处理时间")
private Date handleTime;
@ApiModelProperty(value = "店铺名称") @ApiModelProperty(value = "创建时间")
private String shopName; private Date createTime;
} }

14
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java

@ -22,11 +22,21 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
*/ */
IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q); IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q);
/**
* 后台管理端查询抢单大厅直接查库不走用户端缓存逻辑
*/
IPage<MallDeliveryOrder> pageDeliveryAdminHall(MallDeliveryOrderPageQuery q);
/** /**
* 分页查询配送员的配送单 * 分页查询配送员的配送单
*/ */
IPage<MallDeliveryOrder> pageDeliveryByStatus(MallDeliveryOrderPageQuery q); IPage<MallDeliveryOrder> pageDeliveryByStatus(MallDeliveryOrderPageQuery q);
/**
* 后台管理端查询配送中订单直接查库不按 workerId 缓存维度查询
*/
IPage<MallDeliveryOrder> pageDeliveryByStatusAdmin(MallDeliveryOrderPageQuery q);
IPage<MallDeliveryOrder> pageDeliveryByStatusHis(MallDeliveryOrderPageQuery q); IPage<MallDeliveryOrder> pageDeliveryByStatusHis(MallDeliveryOrderPageQuery q);
/** /**
@ -74,6 +84,10 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
List<Map<Integer, Integer>> countOrdersByType(String regionId); List<Map<Integer, Integer>> countOrdersByType(String regionId);
List<Map<Integer, Integer>> countOrdersByTypeAdmin(MallDeliveryOrderPageQuery q);
long countAssignedWaitOrdersAdmin(MallDeliveryOrderPageQuery q);
List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId); List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId);
List<Map<String, Object>> countOrdersByStatus1(String workerId,String regionId); List<Map<String, Object>> countOrdersByStatus1(String workerId,String regionId);

38
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -170,6 +170,14 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
return page; return page;
} }
@Override
public IPage<MallDeliveryOrder> pageDeliveryAdminHall(MallDeliveryOrderPageQuery q) {
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize());
page = this.baseMapper.selectAdminHallPageVO(page, q);
assembleOrderGoodsForDeliveries(page.getRecords());
return page;
}
@Override @Override
public IPage<MallDeliveryOrder> pageDeliveryByStatus(MallDeliveryOrderPageQuery q) { public IPage<MallDeliveryOrder> pageDeliveryByStatus(MallDeliveryOrderPageQuery q) {
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize()); IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize());
@ -179,6 +187,14 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
return page; return page;
} }
@Override
public IPage<MallDeliveryOrder> pageDeliveryByStatusAdmin(MallDeliveryOrderPageQuery q) {
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize());
page = this.baseMapper.selectAdminPageVOByStatus(page, q);
assembleOrderGoodsForDeliveries(page.getRecords());
return page;
}
@Override @Override
public IPage<MallDeliveryOrder> pageDeliveryByStatusHis(MallDeliveryOrderPageQuery q) { public IPage<MallDeliveryOrder> pageDeliveryByStatusHis(MallDeliveryOrderPageQuery q) {
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize()); IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize());
@ -207,6 +223,12 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
: 40; : 40;
} }
private Integer getCampusDeliveryTime(String regionId, Integer deliveryType) {
return 1 == (deliveryType == null ? 0 : deliveryType)
? AdminSeckillGroupController.getDeliveryTimeByRegionId(redisTemplateHelper, regionId)
: 40;
}
private Integer getTransferDeliveryDuration(String regionId, String shopId) { private Integer getTransferDeliveryDuration(String regionId, String shopId) {
Shop shop = getShopFromCache(regionId, shopId); Shop shop = getShopFromCache(regionId, shopId);
return shop == null || shop.getTransferDeliveryDuration() == null ? 0 : shop.getTransferDeliveryDuration(); return shop == null || shop.getTransferDeliveryDuration() == null ? 0 : shop.getTransferDeliveryDuration();
@ -296,7 +318,8 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
appointmentDelivery, appointmentDelivery,
acceptTime acceptTime
); );
transferDelayMillis = Math.max(60 * 1000L, long minTransferDelayMillis = appointmentDelivery ? 1000L : 60 * 1000L;
transferDelayMillis = Math.max(minTransferDelayMillis,
Date.from(transferArriveTime.atZone(ZoneId.systemDefault()).toInstant()).getTime() - acceptTime.getTime()); Date.from(transferArriveTime.atZone(ZoneId.systemDefault()).toInstant()).getTime() - acceptTime.getTime());
String timeText = String.format("%02d:%02d", transferArriveTime.getHour(), transferArriveTime.getMinute()); String timeText = String.format("%02d:%02d", transferArriveTime.getHour(), transferArriveTime.getMinute());
delivery.setShopAddress("商家预计" + timeText + "配送到-" + transferName); delivery.setShopAddress("商家预计" + timeText + "配送到-" + transferName);
@ -489,7 +512,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
Date mustFinishTime, boolean appointmentDelivery, Date acceptTime) { Date mustFinishTime, boolean appointmentDelivery, Date acceptTime) {
if (appointmentDelivery && mustFinishTime != null) { if (appointmentDelivery && mustFinishTime != null) {
return LocalDateTime.ofInstant(mustFinishTime.toInstant(), ZoneId.systemDefault()) return LocalDateTime.ofInstant(mustFinishTime.toInstant(), ZoneId.systemDefault())
.minusMinutes(safeMinutes(getSchoolDeliveryTime(regionId, shopId, deliveryType))); .minusMinutes(safeMinutes(getCampusDeliveryTime(regionId, deliveryType)));
} }
return LocalDateTime.ofInstant(acceptTime.toInstant(), ZoneId.systemDefault()) return LocalDateTime.ofInstant(acceptTime.toInstant(), ZoneId.systemDefault())
.plusMinutes(safeMinutes(getCookingTime(regionId, shopId)) + safeMinutes(getTransferDeliveryDuration(regionId, shopId))); .plusMinutes(safeMinutes(getCookingTime(regionId, shopId)) + safeMinutes(getTransferDeliveryDuration(regionId, shopId)));
@ -565,6 +588,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
|| (knownOrder != null && Integer.valueOf(1).equals(knownOrder.getTransferDelivery())); || (knownOrder != null && Integer.valueOf(1).equals(knownOrder.getTransferDelivery()));
int deliveryMinutes = safeMinutes(getSchoolDeliveryTime(regionId, shopId, delivery.getDeliveryType())); int deliveryMinutes = safeMinutes(getSchoolDeliveryTime(regionId, shopId, delivery.getDeliveryType()));
if (transferDelivery) { if (transferDelivery) {
deliveryMinutes = safeMinutes(getCampusDeliveryTime(regionId, delivery.getDeliveryType()));
deliveryMinutes += safeMinutes(getTransferDeliveryDuration(regionId, shopId)); deliveryMinutes += safeMinutes(getTransferDeliveryDuration(regionId, shopId));
} }
int cookMinutes = safeMinutes(getCookingTime(regionId, shopId)); int cookMinutes = safeMinutes(getCookingTime(regionId, shopId));
@ -1007,6 +1031,16 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
return this.baseMapper.countOrdersByType(regionId); return this.baseMapper.countOrdersByType(regionId);
} }
@Override
public List<Map<Integer, Integer>> countOrdersByTypeAdmin(MallDeliveryOrderPageQuery q) {
return this.baseMapper.countOrdersByTypeAdmin(q);
}
@Override
public long countAssignedWaitOrdersAdmin(MallDeliveryOrderPageQuery q) {
return this.baseMapper.countAssignedWaitOrdersAdmin(q);
}
@Override @Override
public List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId) { public List<Map<String, Object>> countOrdersByStatus(String workerId,String regionId) {
List<Map<String, Object>> returnList = new ArrayList<>(); List<Map<String, Object>> returnList = new ArrayList<>();

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java

@ -212,7 +212,8 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
//mq处理 //mq处理
triggerDeliveryAsyncEvents(order, delivery); triggerDeliveryAsyncEvents(order, delivery);
if (delivery != null) { if (delivery != null) {
if (StringUtils.isNotBlank(delivery.getWorkerId())) { if (StringUtils.isNotBlank(delivery.getWorkerId())
&& !Integer.valueOf(1).equals(order.getShopDelivery())) {
boolean isValid = false; boolean isValid = false;
Worker worker = workerService.findById(delivery.getWorkerId()); Worker worker = workerService.findById(delivery.getWorkerId());
if (worker != null && worker.getIsOnLine() != null && worker.getIsOnLine() == 1 if (worker != null && worker.getIsOnLine() != null && worker.getIsOnLine() == 1

78
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -7,6 +7,7 @@ import cc.hiver.core.common.sms.SmsUtil;
import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.utils.SnowFlakeUtil; import cc.hiver.core.common.utils.SnowFlakeUtil;
import cc.hiver.core.entity.User; import cc.hiver.core.entity.User;
import cc.hiver.core.service.UserService;
import cc.hiver.core.serviceimpl.JPushServiceImpl; import cc.hiver.core.serviceimpl.JPushServiceImpl;
import cc.hiver.mall.controller.AdminSeckillGroupController; import cc.hiver.mall.controller.AdminSeckillGroupController;
import cc.hiver.mall.dao.mapper.*; import cc.hiver.mall.dao.mapper.*;
@ -195,6 +196,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired @Autowired
private cc.hiver.mall.planet.hook.PlanetRewardHook planetRewardHook; private cc.hiver.mall.planet.hook.PlanetRewardHook planetRewardHook;
@Autowired
private UserService userService;
// ================================================================ // ================================================================
// 核心下单逻辑 // 核心下单逻辑
// ================================================================ // ================================================================
@ -214,6 +218,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
} }
// 2. 扣库存 & 计算商品总金额 // 2. 扣库存 & 计算商品总金额
BigDecimal goodsAmount = BigDecimal.ZERO; BigDecimal goodsAmount = BigDecimal.ZERO;
BigDecimal savedAmount = BigDecimal.ZERO;
List<MallOrderGoods> goodsSnapshots = new ArrayList<>(); List<MallOrderGoods> goodsSnapshots = new ArrayList<>();
// 一次性查出所有商品,避免循环查询 // 一次性查出所有商品,避免循环查询
@ -236,6 +241,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
shopSaleCount += item.getQuantity(); shopSaleCount += item.getQuantity();
// 累计商品金额 // 累计商品金额
goodsAmount = goodsAmount.add(item.getPrice().multiply(new BigDecimal(item.getQuantity()))); goodsAmount = goodsAmount.add(item.getPrice().multiply(new BigDecimal(item.getQuantity())));
savedAmount = savedAmount.add(calculateProductSavedAmount(product, item));
// 构建商品快照(orderId 后续填充) // 构建商品快照(orderId 后续填充)
MallOrderGoods snapshot = new MallOrderGoods(); MallOrderGoods snapshot = new MallOrderGoods();
@ -267,13 +273,44 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (!isGroupOrder) { if (!isGroupOrder) {
// ---- 普通订单 ---- // ---- 普通订单 ----
return createNormalOrder(dto, goodsAmount, packageFee, goodsSnapshots); return createNormalOrder(dto, goodsAmount, packageFee, savedAmount, goodsSnapshots);
} else if (StringUtils.isNotBlank(dto.getGroupId())) { } else if (StringUtils.isNotBlank(dto.getGroupId())) {
// ---- 参团 ---- // ---- 参团 ----
return joinGroup(dto, goodsAmount, packageFee, goodsSnapshots); return joinGroup(dto, goodsAmount, packageFee, savedAmount, goodsSnapshots);
} else { } else {
// ---- 发起拼团 ---- // ---- 发起拼团 ----
return startGroup(dto, goodsAmount, packageFee, goodsSnapshots); return startGroup(dto, goodsAmount, packageFee, savedAmount, goodsSnapshots);
}
}
private BigDecimal calculateProductSavedAmount(Product product, CreateOrderDTO.OrderItemDTO item) {
if (product == null || item == null || item.getQuantity() == null || item.getQuantity() <= 0) {
return BigDecimal.ZERO;
}
BigDecimal originalPrice = getOriginalSpecPrice(product.getAttributeListPrice());
BigDecimal actualPrice = safeAmount(item.getPrice());
BigDecimal priceDiff = originalPrice.subtract(actualPrice);
if (priceDiff.compareTo(BigDecimal.ZERO) <= 0) {
return BigDecimal.ZERO;
}
return priceDiff.multiply(new BigDecimal(item.getQuantity())).setScale(2, RoundingMode.HALF_UP);
}
private BigDecimal getOriginalSpecPrice(String attributeListPrice) {
if (StringUtils.isBlank(attributeListPrice)) {
return BigDecimal.ZERO;
}
try {
JSONArray specs = JSONUtil.parseArray(attributeListPrice);
if (specs.isEmpty()) {
return BigDecimal.ZERO;
}
JSONObject matched = specs.getJSONObject(0);
BigDecimal specPrice = matched.getBigDecimal("specPrice");
return specPrice == null ? BigDecimal.ZERO : specPrice;
} catch (Exception e) {
log.warn("解析商品规格原价失败 attributeListPrice={}, reason={}", attributeListPrice, e.getMessage());
return BigDecimal.ZERO;
} }
} }
@ -281,7 +318,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
* 创建普通订单 * 创建普通订单
*/ */
private MallOrderVO createNormalOrder(CreateOrderDTO dto, BigDecimal goodsAmount, private MallOrderVO createNormalOrder(CreateOrderDTO dto, BigDecimal goodsAmount,
BigDecimal packageFee, List<MallOrderGoods> goodsSnapshots) { BigDecimal packageFee, BigDecimal savedAmount,
List<MallOrderGoods> goodsSnapshots) {
BigDecimal deliveryFee = BigDecimal.ZERO; BigDecimal deliveryFee = BigDecimal.ZERO;
if (DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) { if (DELIVERY_TYPE_EXPRESS == dto.getDeliveryType()) {
if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) { if (dto.getWorkerParam() != null && StringUtils.isNotBlank(dto.getWorkerParam().getWorkerId())) {
@ -298,6 +336,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
} }
MallOrder order = buildBaseOrder(dto, ORDER_TYPE_NORMAL, goodsAmount, deliveryFee, packageFee); MallOrder order = buildBaseOrder(dto, ORDER_TYPE_NORMAL, goodsAmount, deliveryFee, packageFee);
order.setSavedAmount(safeAmount(savedAmount));
// 待支付 // 待支付
order.setStatus(STATUS_WAIT_PAY); order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId()); order.setRegionId(dto.getRegionId());
@ -312,6 +351,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
order.setIsFreeOrder(isFreeOrder ? 1 : 0); order.setIsFreeOrder(isFreeOrder ? 1 : 0);
if(isFreeOrder){ if(isFreeOrder){
order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount()); order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setSavedAmount(safeAmount(order.getSavedAmount()).add(safeAmount(order.getFreeAmount())));
BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount()); BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount); order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount);
//增加奖励记录 //增加奖励记录
@ -351,7 +391,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
* 发起拼团 * 发起拼团
*/ */
private MallOrderVO startGroup(CreateOrderDTO dto, BigDecimal goodsAmount, private MallOrderVO startGroup(CreateOrderDTO dto, BigDecimal goodsAmount,
BigDecimal packageFee, List<MallOrderGoods> goodsSnapshots) { BigDecimal packageFee, BigDecimal savedAmount,
List<MallOrderGoods> goodsSnapshots) {
CreateOrderDTO.GroupParam gp = dto.getGroupParam(); CreateOrderDTO.GroupParam gp = dto.getGroupParam();
if (gp == null || gp.getTargetMembers() == null || gp.getTargetMembers() < 2) { if (gp == null || gp.getTargetMembers() == null || gp.getTargetMembers() < 2) {
throw new RuntimeException("拼团人数不能少于2人"); throw new RuntimeException("拼团人数不能少于2人");
@ -393,6 +434,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
orderType = 3; orderType = 3;
} }
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee); MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee);
order.setSavedAmount(safeAmount(savedAmount));
order.setStatus(STATUS_WAIT_PAY); order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId()); order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱) // 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
@ -405,6 +447,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
order.setIsFreeOrder(isFreeOrder ? 1 : 0); order.setIsFreeOrder(isFreeOrder ? 1 : 0);
if(isFreeOrder){ if(isFreeOrder){
order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount()); order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setSavedAmount(safeAmount(order.getSavedAmount()).add(safeAmount(order.getFreeAmount())));
BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount()); BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount); order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount);
//增加奖励记录 //增加奖励记录
@ -507,7 +550,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public MallOrderVO joinGroup(CreateOrderDTO dto, BigDecimal goodsAmount, public MallOrderVO joinGroup(CreateOrderDTO dto, BigDecimal goodsAmount,
BigDecimal packageFee, List<MallOrderGoods> goodsSnapshots) { BigDecimal packageFee, BigDecimal savedAmount,
List<MallOrderGoods> goodsSnapshots) {
MallOrderGroup group = mallOrderGroupMapper.selectById(dto.getGroupId()); MallOrderGroup group = mallOrderGroupMapper.selectById(dto.getGroupId());
if (group == null) { if (group == null) {
throw new RuntimeException("拼团不存在"); throw new RuntimeException("拼团不存在");
@ -542,6 +586,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
//区分普通拼团和面对面拼团 //区分普通拼团和面对面拼团
Integer orderType = isFace2Face ? 3 : ORDER_TYPE_GROUP; Integer orderType = isFace2Face ? 3 : ORDER_TYPE_GROUP;
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee); MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee);
order.setSavedAmount(safeAmount(savedAmount));
order.setStatus(STATUS_WAIT_PAY); order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId()); order.setRegionId(dto.getRegionId());
@ -555,6 +600,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
order.setIsFreeOrder(isFreeOrder ? 1 : 0); order.setIsFreeOrder(isFreeOrder ? 1 : 0);
if(isFreeOrder){ if(isFreeOrder){
order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount()); order.setFreeAmount(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setSavedAmount(safeAmount(order.getSavedAmount()).add(safeAmount(order.getFreeAmount())));
BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount()); BigDecimal finalAmount = order.getTotalAmount().subtract(freeOrderCacheUtil.get(order.getRegionId()).getFreeAmount());
order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount); order.setTotalAmount(finalAmount.signum() <= 0 ? BigDecimal.valueOf(0.01) : finalAmount);
//增加奖励记录 //增加奖励记录
@ -1299,6 +1345,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
rewardIeMatchQuota(order.getUserId()); rewardIeMatchQuota(order.getUserId());
//白嫖星球-订单完成发放星球券(不影响主流程) //白嫖星球-订单完成发放星球券(不影响主流程)
planetRewardHook.onOrderFinish(order.getUserId(), order.getRegionId(), order.getId()); planetRewardHook.onOrderFinish(order.getUserId(), order.getRegionId(), order.getId());
addUserSavedAmountAfterFinish(order);
//更新缓存 //更新缓存
userPendingOrderCacheUtil.remove(order.getUserId(),order.getId()); userPendingOrderCacheUtil.remove(order.getUserId(),order.getId());
//免单计数(Key 按 regionId 隔离,避免多区域计数混乱) //免单计数(Key 按 regionId 隔离,避免多区域计数混乱)
@ -1311,6 +1358,25 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
} }
} }
public void addUserSavedAmountAfterFinish(MallOrder order) {
if (order == null || StringUtils.isBlank(order.getUserId())) {
return;
}
BigDecimal orderSavedAmount = safeAmount(order.getSavedAmount());
if (orderSavedAmount.compareTo(BigDecimal.ZERO) <= 0) {
return;
}
try {
int updated = userService.increaseSavedAmount(order.getUserId(), orderSavedAmount);
if (updated <= 0) {
log.warn("订单完成累计已省金额失败,用户不存在 orderId={}, userId={}", order.getId(), order.getUserId());
}
} catch (Exception e) {
log.warn("订单完成累计已省金额失败,不影响订单完成 orderId={}, userId={}, reason={}",
order.getId(), order.getUserId(), e.getMessage());
}
}
private void rewardIeMatchQuota(String userId) { private void rewardIeMatchQuota(String userId) {
if (StringUtils.isBlank(userId)) { if (StringUtils.isBlank(userId)) {
return; return;

18
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java

@ -184,6 +184,9 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount()
.subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.UP)); .subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.UP));
} }
if(mallRefundRecord.getRefundAmount().compareTo(order.getTotalAmount()) > 0){
mallRefundRecord.setRefundAmount(order.getTotalAmount());
}
//订单金额优惠后 变成0.01后退款变成0.01 //订单金额优惠后 变成0.01后退款变成0.01
if(order.getTotalAmount().compareTo(new BigDecimal("0.01")) == 0){ if(order.getTotalAmount().compareTo(new BigDecimal("0.01")) == 0){
mallRefundRecord.setRefundAmount(BigDecimal.valueOf(0.01)); mallRefundRecord.setRefundAmount(BigDecimal.valueOf(0.01));
@ -291,7 +294,8 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateStatus(MallRefundRecord mallRefundRecord) { public void updateStatus(MallRefundRecord mallRefundRecord) {
validateRefundRecordPending(mallRefundRecord); MallRefundRecord dbRecord = validateRefundRecordPending(mallRefundRecord);
fillRefundRecordForProcess(mallRefundRecord, dbRecord);
boolean rejectStatus = mallRefundRecord.getStatus() != null boolean rejectStatus = mallRefundRecord.getStatus() != null
&& (mallRefundRecord.getStatus() == 2 || mallRefundRecord.getStatus() == 5); && (mallRefundRecord.getStatus() == 2 || mallRefundRecord.getStatus() == 5);
String rejectReason = mallRefundRecord.getRejectReason() == null ? null : mallRefundRecord.getRejectReason().trim(); String rejectReason = mallRefundRecord.getRejectReason() == null ? null : mallRefundRecord.getRejectReason().trim();
@ -745,7 +749,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
} }
} }
private void validateRefundRecordPending(MallRefundRecord mallRefundRecord) { private MallRefundRecord validateRefundRecordPending(MallRefundRecord mallRefundRecord) {
MallRefundRecord dbRecord = this.getById(mallRefundRecord.getId()); MallRefundRecord dbRecord = this.getById(mallRefundRecord.getId());
if (dbRecord == null) { if (dbRecord == null) {
throw new RuntimeException("退款/售后记录不存在"); throw new RuntimeException("退款/售后记录不存在");
@ -754,6 +758,16 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
if (dbRecord.getStatus() == null || dbRecord.getStatus() != waitStatus) { if (dbRecord.getStatus() == null || dbRecord.getStatus() != waitStatus) {
throw new RuntimeException("该退款/售后申请已处理,请刷新页面"); throw new RuntimeException("该退款/售后申请已处理,请刷新页面");
} }
return dbRecord;
}
private void fillRefundRecordForProcess(MallRefundRecord mallRefundRecord, MallRefundRecord dbRecord) {
mallRefundRecord.setOrderId(dbRecord.getOrderId());
mallRefundRecord.setLinkId(dbRecord.getLinkId());
mallRefundRecord.setRefundAmount(dbRecord.getRefundAmount());
mallRefundRecord.setRefundType(dbRecord.getRefundType());
mallRefundRecord.setRefundTypeStatus(dbRecord.getRefundTypeStatus());
mallRefundRecord.setRegionId(dbRecord.getRegionId());
} }
private boolean shouldRefundAddedDeliveryFee(MallRefundRecord mallRefundRecord) { private boolean shouldRefundAddedDeliveryFee(MallRefundRecord mallRefundRecord) {

5
hiver-modules/hiver-mall/src/main/resources/db/mall_order_saved_amount.sql

@ -0,0 +1,5 @@
ALTER TABLE mall_order
ADD COLUMN saved_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '本单已省金额';
ALTER TABLE t_user
ADD COLUMN saved_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计已省金额';

13
hiver-modules/hiver-mall/src/main/resources/db/problem_feedback_fields.sql

@ -0,0 +1,13 @@
ALTER TABLE `t_problem_feedback`
ADD COLUMN `user_name` varchar(100) DEFAULT NULL COMMENT '用户昵称' AFTER `user_id`,
ADD COLUMN `contact_phone` varchar(30) DEFAULT NULL COMMENT '联系电话' AFTER `user_name`,
ADD COLUMN `feedback_type` varchar(50) DEFAULT NULL COMMENT '反馈类型' AFTER `contact_phone`,
ADD COLUMN `region_id` varchar(64) DEFAULT NULL COMMENT '区域id' AFTER `feedback_type`,
ADD COLUMN `region_name` varchar(100) DEFAULT NULL COMMENT '区域名称' AFTER `region_id`,
ADD COLUMN `status` int DEFAULT 0 COMMENT '状态:0待回复,1已回复' AFTER `region_name`,
ADD COLUMN `handle_opinion` varchar(500) DEFAULT NULL COMMENT '处理意见' AFTER `status`,
ADD COLUMN `handle_user_id` varchar(64) DEFAULT NULL COMMENT '处理人id' AFTER `handle_opinion`,
ADD COLUMN `handle_user_name` varchar(100) DEFAULT NULL COMMENT '处理人名称' AFTER `handle_user_id`,
ADD COLUMN `handle_time` datetime DEFAULT NULL COMMENT '处理时间' AFTER `handle_user_name`,
ADD INDEX `idx_problem_feedback_region_status_time` (`region_id`, `status`, `create_time`),
ADD INDEX `idx_problem_feedback_user_time` (`user_id`, `create_time`);

193
hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper"> <mapper namespace="cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper">
@ -115,6 +115,9 @@
<if test="q.transferArriveEmpty != null and q.transferArriveEmpty == true"> <if test="q.transferArriveEmpty != null and q.transferArriveEmpty == true">
AND d.transfer_arrive_time IS NULL AND d.transfer_arrive_time IS NULL
</if> </if>
<if test="q.transferArriveEmpty != null and q.transferArriveEmpty == false">
AND d.transfer_arrive_time IS NOT NULL
</if>
</where> </where>
ORDER BY ORDER BY
<choose> <choose>
@ -147,6 +150,61 @@
</choose> </choose>
</select> </select>
<select id="selectAdminHallPageVO" resultMap="deliveryMap">
SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.appointment_delivery, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.is_big,
d.is_return,d.worker_name, d.arrive_time,d.new_worker,d.worker_phone,
d.transfer_delivery,d.transfer_address_id,d.transfer_address_name,
d.transfer_arrive_time,d.transfer_arrive_image,d.transfer_pickup_code
FROM mall_delivery_order d
<where>
AND d.status = 0
<if test="q.regionId != null and q.regionId != ''">
AND d.region_id = #{q.regionId}
</if>
<choose>
<when test="q.deliveryType != null and q.deliveryType == 4">
AND d.worker_id IS NOT NULL AND d.worker_id != ''
</when>
<otherwise>
AND (d.worker_id IS NULL OR d.worker_id = '')
<if test="q.deliveryType != null">
AND d.delivery_type = #{q.deliveryType}
</if>
</otherwise>
</choose>
<if test="q.shopId != null and q.shopId != ''">
AND d.shop_id = #{q.shopId}
</if>
<if test="q.shopName != null and q.shopName != ''">
AND d.shop_name like concat('%',#{q.shopName},'%')
</if>
<if test="q.getAreaId != null and q.getAreaId != ''">
AND d.get_area_id = #{q.getAreaId}
</if>
<if test="q.putAreaId != null and q.putAreaId != ''">
AND d.put_area_id = #{q.putAreaId}
</if>
<if test="q.startDate != null and q.startDate != ''">
AND DATE(d.create_time) &gt;= #{q.startDate}
</if>
<if test="q.endDate != null and q.endDate != ''">
AND DATE(d.create_time) &lt;= #{q.endDate}
</if>
</where>
ORDER BY
<if test="q.order != null and q.order == 'deliveryFee'">
d.delivery_fee DESC,
</if>
(CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC,
d.must_finish_time ASC,d.delivery_fee DESC
</select>
<select id="selectPageVOByStatus" resultMap="deliveryMap"> <select id="selectPageVOByStatus" resultMap="deliveryMap">
SELECT SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id, d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
@ -212,6 +270,71 @@
ORDER BY (CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC ORDER BY (CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC
</select> </select>
<select id="selectAdminPageVOByStatus" resultMap="deliveryMap">
SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.appointment_delivery, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures,
d.is_big,d.is_return,d.worker_name,d.arrive_time,d.new_worker,d.worker_phone,
d.transfer_delivery,d.transfer_address_id,d.transfer_address_name,
d.transfer_arrive_time,d.transfer_arrive_image,d.transfer_pickup_code
FROM mall_delivery_order d
<where>
d.status not in (-1,4)
<if test="q.regionId != null and q.regionId != ''">
AND d.region_id = #{q.regionId}
</if>
<if test="q.workerId != null and q.workerId != ''">
AND d.worker_id = #{q.workerId}
</if>
<if test="q.newWorker != null and q.newWorker != ''">
AND d.new_worker = #{q.newWorker}
</if>
<if test="q.shopId != null and q.shopId != ''">
AND d.shop_id = #{q.shopId}
</if>
<if test="q.shopName != null and q.shopName != ''">
AND d.shop_name like concat('%',#{q.shopName},'%')
</if>
<if test="q.status != null">
AND d.status = #{q.status}
</if>
<if test="q.getAreaId != null and q.getAreaId != ''">
AND d.get_area_id = #{q.getAreaId}
</if>
<if test="q.putAreaId != null and q.putAreaId != ''">
AND d.put_area_id = #{q.putAreaId}
</if>
<if test="q.startDate != null and q.startDate != ''">
AND DATE(d.create_time) &gt;= #{q.startDate}
</if>
<if test="q.endDate != null and q.endDate != ''">
AND DATE(d.create_time) &lt;= #{q.endDate}
</if>
<if test="q.deliveryType != null">
AND d.delivery_type = #{q.deliveryType}
</if>
<if test="q.shopDelivery != null">
AND EXISTS (
SELECT 1 FROM mall_order o
WHERE o.id = d.order_id
AND o.shop_delivery = #{q.shopDelivery}
)
</if>
<if test="q.transferDelivery != null">
AND d.transfer_delivery = #{q.transferDelivery}
</if>
<if test="q.transferArriveEmpty != null and q.transferArriveEmpty == true">
AND d.transfer_arrive_time IS NULL
</if>
</where>
ORDER BY (CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC,
d.must_finish_time ASC,d.delivery_fee DESC
</select>
<select id="selectPageVOByStatusHis" resultMap="deliveryMap"> <select id="selectPageVOByStatusHis" resultMap="deliveryMap">
SELECT SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id, d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
@ -315,6 +438,67 @@
WHERE region_id = #{regionId} and worker_id is null and status = 0 group by delivery_type WHERE region_id = #{regionId} and worker_id is null and status = 0 group by delivery_type
</select> </select>
<select id="countOrdersByTypeAdmin" resultType="map">
SELECT delivery_type as deliveryType,count(*) as orderCount
FROM mall_delivery_order d
<where>
AND (d.worker_id IS NULL OR d.worker_id = '')
AND d.status = 0
<if test="q.regionId != null and q.regionId != ''">
AND d.region_id = #{q.regionId}
</if>
<if test="q.shopId != null and q.shopId != ''">
AND d.shop_id = #{q.shopId}
</if>
<if test="q.shopName != null and q.shopName != ''">
AND d.shop_name like concat('%',#{q.shopName},'%')
</if>
<if test="q.getAreaId != null and q.getAreaId != ''">
AND d.get_area_id = #{q.getAreaId}
</if>
<if test="q.putAreaId != null and q.putAreaId != ''">
AND d.put_area_id = #{q.putAreaId}
</if>
<if test="q.startDate != null and q.startDate != ''">
AND DATE(d.create_time) &gt;= #{q.startDate}
</if>
<if test="q.endDate != null and q.endDate != ''">
AND DATE(d.create_time) &lt;= #{q.endDate}
</if>
</where>
GROUP BY delivery_type
</select>
<select id="countAssignedWaitOrdersAdmin" resultType="long">
SELECT count(*)
FROM mall_delivery_order d
<where>
AND d.worker_id IS NOT NULL AND d.worker_id != ''
AND d.status = 0
<if test="q.regionId != null and q.regionId != ''">
AND d.region_id = #{q.regionId}
</if>
<if test="q.shopId != null and q.shopId != ''">
AND d.shop_id = #{q.shopId}
</if>
<if test="q.shopName != null and q.shopName != ''">
AND d.shop_name like concat('%',#{q.shopName},'%')
</if>
<if test="q.getAreaId != null and q.getAreaId != ''">
AND d.get_area_id = #{q.getAreaId}
</if>
<if test="q.putAreaId != null and q.putAreaId != ''">
AND d.put_area_id = #{q.putAreaId}
</if>
<if test="q.startDate != null and q.startDate != ''">
AND DATE(d.create_time) &gt;= #{q.startDate}
</if>
<if test="q.endDate != null and q.endDate != ''">
AND DATE(d.create_time) &lt;= #{q.endDate}
</if>
</where>
</select>
<select id="countOrdersLimit" resultType="cc.hiver.core.entity.Worker"> <select id="countOrdersLimit" resultType="cc.hiver.core.entity.Worker">
SELECT SELECT
COUNT(id) AS orderCount, COUNT(id) AS orderCount,
@ -329,7 +513,7 @@
<select id="countOrdersWorkerIndex" resultType="java.util.Map"> <select id="countOrdersWorkerIndex" resultType="java.util.Map">
SELECT SELECT
COUNT(id) AS orderCount, COUNT(id) AS orderCount,
SUM(delivery_fee) as amount SUM(delivery_fee + delivery_fee_marketplace) as amount
FROM mall_delivery_order FROM mall_delivery_order
WHERE `status` = 3 and worker_id = #{workerId} WHERE `status` = 3 and worker_id = #{workerId}
AND finish_time >= CURDATE() AND finish_time >= CURDATE()
@ -342,9 +526,9 @@
#{id} #{id}
</foreach> </foreach>
UNION -- 使用 UNION 自动去重(如果想去重) UNION -- 使用 UNION 自动去重
-- 第二部分:通过 group_id 关联查 -- 第二部分:通过 group_id 关联查
SELECT * FROM mall_delivery_order SELECT * FROM mall_delivery_order
WHERE group_id IN ( WHERE group_id IN (
SELECT id FROM mall_order_group SELECT id FROM mall_order_group
@ -362,3 +546,4 @@
</select> </select>
</mapper> </mapper>

14
hiver-modules/hiver-mall/src/main/resources/mapper/MallOrderMapper.xml

@ -33,6 +33,7 @@
<result column="user_require_make" property="userRequireMake"/> <result column="user_require_make" property="userRequireMake"/>
<result column="is_free_order" property="isFreeOrder"/> <result column="is_free_order" property="isFreeOrder"/>
<result column="free_amount" property="freeAmount"/> <result column="free_amount" property="freeAmount"/>
<result column="saved_amount" property="savedAmount"/>
<result column="is_pack" property="isPack"/> <result column="is_pack" property="isPack"/>
<result column="shop_delivery" property="shopDelivery"/> <result column="shop_delivery" property="shopDelivery"/>
<result column="transfer_delivery" property="transferDelivery"/> <result column="transfer_delivery" property="transferDelivery"/>
@ -50,6 +51,7 @@
SELECT SELECT
COUNT(*) AS count, COUNT(*) AS count,
CASE CASE
WHEN (`status` = 2) THEN 'daipeisongjiedan'
WHEN (`status` = 3 AND delivery_type = 1 AND shop_make_time IS NOT NULL) THEN 'daiqu' WHEN (`status` = 3 AND delivery_type = 1 AND shop_make_time IS NOT NULL) THEN 'daiqu'
WHEN (`status` = 3 AND delivery_type = 2 AND user_require_make = 1) WHEN (`status` = 3 AND delivery_type = 2 AND user_require_make = 1)
OR OR
@ -133,7 +135,7 @@
o.receiver_name, o.receiver_phone, o.receiver_address, o.receiver_name, o.receiver_phone, o.receiver_address,
o.shop_name, o.shop_phone, o.shop_address,o.number_code,o.region_id, o.shop_name, o.shop_phone, o.shop_address,o.number_code,o.region_id,
o.settlement_status,o.shop_make_time,o.other_order,o.user_require_make o.settlement_status,o.shop_make_time,o.other_order,o.user_require_make
,o.is_free_order,o.free_amount,o.is_pack,o.shop_delivery, ,o.is_free_order,o.free_amount,o.saved_amount,o.is_pack,o.shop_delivery,
o.transfer_delivery,o.transfer_address_id,o.transfer_address_name o.transfer_delivery,o.transfer_address_id,o.transfer_address_name
FROM mall_order o FROM mall_order o
<where> <where>
@ -151,7 +153,15 @@
) )
</if> </if>
<if test="q.shopId != null and q.shopId != ''"> <if test="q.shopId != null and q.shopId != ''">
AND o.shop_id = #{q.shopId} and o.status not in (0,10,2) AND o.shop_id = #{q.shopId}
<choose>
<when test="q.searchStatus != null and q.searchStatus == 3">
AND o.status NOT IN (0, 10)
</when>
<otherwise>
AND o.status NOT IN (0, 10, 2)
</otherwise>
</choose>
</if> </if>
<if test="q.regionId != null and q.regionId != ''"> <if test="q.regionId != null and q.regionId != ''">
AND o.region_id = #{q.regionId} AND o.region_id = #{q.regionId}

143
hiver-modules/hiver-mall/src/main/resources/mapper/ProblemFeedbackMapper.xml

@ -10,12 +10,23 @@
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="problem_content" jdbcType="VARCHAR" property="problemContent" /> <result column="problem_content" jdbcType="VARCHAR" property="problemContent" />
<result column="problem_picture" jdbcType="VARCHAR" property="problemPicture" /> <result column="problem_picture" jdbcType="VARCHAR" property="problemPicture" />
<result column="shop_id" jdbcType="VARCHAR" property="shopId" /> <result column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="shop_name" jdbcType="VARCHAR" property="shopName" /> <result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="contact_phone" jdbcType="VARCHAR" property="contactPhone" />
<result column="feedback_type" jdbcType="VARCHAR" property="feedbackType" />
<result column="region_id" jdbcType="VARCHAR" property="regionId" />
<result column="region_name" jdbcType="VARCHAR" property="regionName" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="handle_opinion" jdbcType="VARCHAR" property="handleOpinion" />
<result column="handle_user_id" jdbcType="VARCHAR" property="handleUserId" />
<result column="handle_user_name" jdbcType="VARCHAR" property="handleUserName" />
<result column="handle_time" jdbcType="TIMESTAMP" property="handleTime" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, create_by, create_time, del_flag, update_by, update_time, problem_content, problem_picture,shop_id,shop_name id, create_by, create_time, del_flag, update_by, update_time, problem_content, problem_picture, user_id,
user_name, contact_phone, feedback_type, region_id, region_name, status, handle_opinion, handle_user_id,
handle_user_name, handle_time
</sql> </sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap"> <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
@ -32,10 +43,16 @@
<insert id="insert" parameterType="cc.hiver.mall.problemfeedback.entity.ProblemFeedback"> <insert id="insert" parameterType="cc.hiver.mall.problemfeedback.entity.ProblemFeedback">
insert into t_problem_feedback insert into t_problem_feedback
(id, create_by, create_time, del_flag, update_by, update_time,problem_content, problem_picture,shop_id,shop_name) (id, create_by, create_time, del_flag, update_by, update_time, problem_content, problem_picture, user_id,
user_name, contact_phone, feedback_type, region_id, region_name, status, handle_opinion, handle_user_id,
handle_user_name, handle_time)
values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{delFlag,jdbcType=INTEGER}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=INTEGER}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP},
#{problemContent,jdbcType=VARCHAR},#{problemPicture,jdbcType=VARCHAR},#{shopId,jdbcType=VARCHAR},#{shopName,jdbcType=VARCHAR}) #{problemContent,jdbcType=VARCHAR}, #{problemPicture,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR},
#{userName,jdbcType=VARCHAR}, #{contactPhone,jdbcType=VARCHAR}, #{feedbackType,jdbcType=VARCHAR},
#{regionId,jdbcType=VARCHAR}, #{regionName,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER},
#{handleOpinion,jdbcType=VARCHAR}, #{handleUserId,jdbcType=VARCHAR}, #{handleUserName,jdbcType=VARCHAR},
#{handleTime,jdbcType=TIMESTAMP})
</insert> </insert>
<update id="updateByExampleSelective" parameterType="map"> <update id="updateByExampleSelective" parameterType="map">
@ -65,11 +82,38 @@
<if test="record.problemPicture != null"> <if test="record.problemPicture != null">
problem_picture = #{record.problemPicture,jdbcType=VARCHAR}, problem_picture = #{record.problemPicture,jdbcType=VARCHAR},
</if> </if>
<if test="record.shopId != null"> <if test="record.userId != null">
shop_id = #{record.shopId,jdbcType=VARCHAR}, user_id = #{record.userId,jdbcType=VARCHAR},
</if> </if>
<if test="record.shopName != null"> <if test="record.userName != null">
shop_name = #{record.shopName,jdbcType=VARCHAR}, user_name = #{record.userName,jdbcType=VARCHAR},
</if>
<if test="record.contactPhone != null">
contact_phone = #{record.contactPhone,jdbcType=VARCHAR},
</if>
<if test="record.feedbackType != null">
feedback_type = #{record.feedbackType,jdbcType=VARCHAR},
</if>
<if test="record.regionId != null">
region_id = #{record.regionId,jdbcType=VARCHAR},
</if>
<if test="record.regionName != null">
region_name = #{record.regionName,jdbcType=VARCHAR},
</if>
<if test="record.status != null">
status = #{record.status,jdbcType=INTEGER},
</if>
<if test="record.handleOpinion != null">
handle_opinion = #{record.handleOpinion,jdbcType=VARCHAR},
</if>
<if test="record.handleUserId != null">
handle_user_id = #{record.handleUserId,jdbcType=VARCHAR},
</if>
<if test="record.handleUserName != null">
handle_user_name = #{record.handleUserName,jdbcType=VARCHAR},
</if>
<if test="record.handleTime != null">
handle_time = #{record.handleTime,jdbcType=TIMESTAMP},
</if> </if>
</set> </set>
</update> </update>
@ -84,8 +128,17 @@
update_time = #{record.updateTime,jdbcType=TIMESTAMP}, update_time = #{record.updateTime,jdbcType=TIMESTAMP},
problem_content = #{record.problemContent,jdbcType=VARCHAR}, problem_content = #{record.problemContent,jdbcType=VARCHAR},
problem_picture = #{record.problemPicture,jdbcType=VARCHAR}, problem_picture = #{record.problemPicture,jdbcType=VARCHAR},
shop_id = #{record.shopId,jdbcType=VARCHAR}, user_id = #{record.userId,jdbcType=VARCHAR},
shop_name = #{record.shopName,jdbcType=VARCHAR} user_name = #{record.userName,jdbcType=VARCHAR},
contact_phone = #{record.contactPhone,jdbcType=VARCHAR},
feedback_type = #{record.feedbackType,jdbcType=VARCHAR},
region_id = #{record.regionId,jdbcType=VARCHAR},
region_name = #{record.regionName,jdbcType=VARCHAR},
status = #{record.status,jdbcType=INTEGER},
handle_opinion = #{record.handleOpinion,jdbcType=VARCHAR},
handle_user_id = #{record.handleUserId,jdbcType=VARCHAR},
handle_user_name = #{record.handleUserName,jdbcType=VARCHAR},
handle_time = #{record.handleTime,jdbcType=TIMESTAMP}
</update> </update>
<update id="updateByPrimaryKeySelective" parameterType="cc.hiver.mall.problemfeedback.entity.ProblemFeedback"> <update id="updateByPrimaryKeySelective" parameterType="cc.hiver.mall.problemfeedback.entity.ProblemFeedback">
@ -112,11 +165,38 @@
<if test="problemPicture != null"> <if test="problemPicture != null">
problem_picture = #{problemPicture,jdbcType=VARCHAR}, problem_picture = #{problemPicture,jdbcType=VARCHAR},
</if> </if>
<if test="shopId != null"> <if test="userId != null">
shop_id = #{shopId,jdbcType=VARCHAR}, user_id = #{userId,jdbcType=VARCHAR},
</if>
<if test="userName != null">
user_name = #{userName,jdbcType=VARCHAR},
</if>
<if test="contactPhone != null">
contact_phone = #{contactPhone,jdbcType=VARCHAR},
</if> </if>
<if test="shopName != null"> <if test="feedbackType != null">
shop_name = #{shopName,jdbcType=VARCHAR}, feedback_type = #{feedbackType,jdbcType=VARCHAR},
</if>
<if test="regionId != null">
region_id = #{regionId,jdbcType=VARCHAR},
</if>
<if test="regionName != null">
region_name = #{regionName,jdbcType=VARCHAR},
</if>
<if test="status != null">
status = #{status,jdbcType=INTEGER},
</if>
<if test="handleOpinion != null">
handle_opinion = #{handleOpinion,jdbcType=VARCHAR},
</if>
<if test="handleUserId != null">
handle_user_id = #{handleUserId,jdbcType=VARCHAR},
</if>
<if test="handleUserName != null">
handle_user_name = #{handleUserName,jdbcType=VARCHAR},
</if>
<if test="handleTime != null">
handle_time = #{handleTime,jdbcType=TIMESTAMP},
</if> </if>
</set> </set>
where id = #{id,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR}
@ -131,23 +211,48 @@
update_time = #{updateTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP},
problem_content = #{problemContent,jdbcType=VARCHAR}, problem_content = #{problemContent,jdbcType=VARCHAR},
problem_picture = #{problemPicture,jdbcType=VARCHAR}, problem_picture = #{problemPicture,jdbcType=VARCHAR},
shop_id = #{shopId,jdbcType=VARCHAR}, user_id = #{userId,jdbcType=VARCHAR},
shop_name = #{shopName,jdbcType=VARCHAR} user_name = #{userName,jdbcType=VARCHAR},
contact_phone = #{contactPhone,jdbcType=VARCHAR},
feedback_type = #{feedbackType,jdbcType=VARCHAR},
region_id = #{regionId,jdbcType=VARCHAR},
region_name = #{regionName,jdbcType=VARCHAR},
status = #{status,jdbcType=INTEGER},
handle_opinion = #{handleOpinion,jdbcType=VARCHAR},
handle_user_id = #{handleUserId,jdbcType=VARCHAR},
handle_user_name = #{handleUserName,jdbcType=VARCHAR},
handle_time = #{handleTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR}
</update> </update>
<!--管理商品分页列表--> <!--管理商品分页列表-->
<select id="getProblemFeedbackList" resultType="cc.hiver.mall.problemfeedback.vo.ProblemFeedbackPageVo"> <select id="getProblemFeedbackList" resultType="cc.hiver.mall.problemfeedback.vo.ProblemFeedbackPageVo">
select select
t.id, t.create_by,t.create_time,t.del_flag,t.problem_content, t.problem_picture, t.shop_id, t.shop_name t.id, t.create_by, t.create_time, t.del_flag, t.problem_content, t.problem_picture, t.user_id,
t.user_name, t.contact_phone, t.feedback_type, t.region_id, t.region_name, t.status, t.handle_opinion,
t.handle_user_id, t.handle_user_name, t.handle_time
from t_problem_feedback t from t_problem_feedback t
<where> <where>
AND ifnull(t.del_flag, 0) = 0
<!--反馈内容--> <!--反馈内容-->
<if test='queryParams.problemContent!=null and queryParams.problemContent.trim() neq ""'> <if test='queryParams.problemContent!=null and queryParams.problemContent.trim() neq ""'>
AND t.problem_content like concat('%',#{queryParams.problemContent},'%') AND t.problem_content like concat('%',#{queryParams.problemContent},'%')
</if> </if>
<if test='queryParams.userId!=null and queryParams.userId.trim() neq ""'>
AND t.user_id = #{queryParams.userId}
</if>
<if test='queryParams.regionId!=null and queryParams.regionId.trim() neq ""'>
AND t.region_id = #{queryParams.regionId}
</if>
<if test='queryParams.status!=null'>
AND t.status = #{queryParams.status}
</if>
<if test='queryParams.feedbackType!=null and queryParams.feedbackType.trim() neq ""'>
AND t.feedback_type = #{queryParams.feedbackType}
</if>
</where> </where>
ORDER BY ORDER BY
t.create_time desc CASE WHEN t.status = 0 THEN 0 ELSE 1 END ASC,
t.create_time DESC
</select> </select>
</mapper> </mapper>

3
hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml

@ -772,6 +772,9 @@
<if test='queryParams.productName!=null and queryParams.productName.trim() neq ""'> <if test='queryParams.productName!=null and queryParams.productName.trim() neq ""'>
AND t.product_name like concat('%',#{queryParams.productName},'%') AND t.product_name like concat('%',#{queryParams.productName},'%')
</if> </if>
<if test='queryParams.keywords!=null and queryParams.keywords.trim() neq ""'>
AND t.product_name like concat('%',#{queryParams.keywords},'%')
</if>
<if test='queryParams.idList!=null '> <if test='queryParams.idList!=null '>
and t.id in and t.id in
<foreach item="item" index="index" collection="queryParams.idList" open="(" close=")" separator=","> <foreach item="item" index="index" collection="queryParams.idList" open="(" close=")" separator=",">

3
hiver-modules/hiver-mall/src/main/resources/mapper/WorkerRelaPriceMapper.xml

@ -115,6 +115,9 @@
w.worker_status = 1 w.worker_status = 1
AND w.is_on_line = 1 AND w.is_on_line = 1
AND w.get_push_order = 1 AND w.get_push_order = 1
<if test="regionId != null and regionId != ''">
AND w.region = #{regionId}
</if>
/* 交易保障:rebate_amount > 0 */ /* 交易保障:rebate_amount > 0 */
<if test="baozhang != null and baozhang == true"> <if test="baozhang != null and baozhang == true">
AND w.rebate_amount &gt; 0 AND w.rebate_amount &gt; 0

Loading…
Cancel
Save