使用PageHelper分页嵌套查询结果映射导致的BUG
我们在查询订单的时候是按规格查询出来,最后根据orderId合并成一个完整的订单,也就是我们查询的是规格,之后嵌套进了订单中,而我们在显示的时候应该显示的是订单条数,每页也应该根据订单来显示10条订单数据,但现在PageHelper却是以规格数来进行统计。
解决方案:
一:先使用订单ID查询出所有订单,再对订单中的每一条商品信息进行查询。
二:PageHelper内置了方法来解决
<resultMap id="myOrdersVO" type="com.shiers.pojo.vo.MyOrdersVO">
<id column="orderId" property="orderId"/>
<result column="createdTime" property="createdTime"/>
<result column="payMethod" property="payMethod"/>
<result column="realPayAmount" property="realPayAmount"/>
<result column="postAmount" property="postAmount"/>
<result column="orderStatus" property="orderStatus"/>
<result column="isComment" property="isComment"/>
================================👇👇👇嵌套👇👇👇================================
<collection property="subOrderItemList"
=======👇👇👇新增加的解决方案👇👇👇=======
select="getSubItems" 👈这里对这个对象属性进行查询,定义查询方法名
column="orderId" 👈传入参数
=======👆👆👆新增加的解决方案👆👆👆=======
ofType="com.shiers.pojo.vo.MySubOrderItemVO">
<result column="itemId" property="itemId"/>
<result column="itemName" property="itemName"/>
<result column="itemImg" property="itemImg"/>
<result column="itemSpecName" property="itemSpecName"/>
<result column="buyCounts" property="buyCounts"/>
<result column="price" property="price"/>
</collection>
================================👆👆👆嵌套👆👆👆================================
</resultMap>
==================👇👇👇SQL将不包含规格表,只查询了订单👇👇👇====================
<select id="queryMyOrders" resultMap="myOrdersVO" parameterType="Map">
SELECT
od.id AS orderId,
od.created_time AS createdTime,
od.pay_method AS payMethod,
od.real_pay_amount AS realPayAmount,
od.post_amount AS orderStatus,
os.order_status AS orderStatus
FROM
orders od
LEFT JOIN
order_status os
ON
od.id = os.order_id
WHERE
od.user_id = #{paramsMap.userId}
AND
od.is_delete = 0
<if test="paramsMap.orderStatus != null">
AND os.order_status = #{paramsMap.orderStatus}
</if>
ORDER BY
od.updated_time ASC
</select>
=============👇👇👇根据订单表的id查询对应规格表,填充到属性中👇👇👇==============
<select id="getSubItems" parameterType="String" resultType="com.shiers.pojo.vo.MySubOrderItemVO">
select
oi.item_id AS itemId,
oi.item_name AS itemName,
oi.item_img AS itemImg,
oi.item_spec_name AS itemSpecName,
oi.buy_counts AS buyCounts,
oi.price AS price
from order_items oi
where oi.order_id = #{orderId}
</select>
Controller
package com.shiers.controller.center;
import com.shiers.controller.BaseController;
import com.shiers.pojo.Orders;
import com.shiers.service.center.MyOrdersService;
import com.shiers.utils.MyJSONResult;
import com.shiers.utils.PagedGridResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
/**
* Demo class
*
* @author shierS
* @date 2021/6/6
*/
@Api(value = "用户中心我的订单", tags = {"用户中心我的订单相关接口", "巴拉巴拉"})
@RestController
@RequestMapping("myorders")
public class MyOrdersController extends BaseController {
@Autowired
private MyOrdersService myOrdersService;
@ApiOperation(value = "查询订单列表", notes = "查询订单列表", httpMethod = "POST")
@PostMapping("query")
public MyJSONResult query(
@ApiParam(name = "userId", value = "用户id", required = true)
@RequestParam String userId,
@ApiParam(name = "orderStatus", value = "订单状态", required = false)
@RequestParam Integer orderStatus,
@ApiParam(name = "page", value = "查询第几页", required = false)
@RequestParam Integer page,
@ApiParam(name = "pageSize", value = "分页的每一页显示条数", required = false)
@RequestParam Integer pageSize) {
System.out.println("xxxx");
if (StringUtils.isBlank(userId)) {
return MyJSONResult.errorMsg(null);
}
if (page == null) {
page = 1;
}
if (pageSize == null) {
pageSize = COMMEN_PAGE_SIZE;
}
PagedGridResult grid = myOrdersService.queryMyOrders(userId, orderStatus, page, pageSize);
return MyJSONResult.ok(grid);
}
// 商家发货没有后端,所以这个接口仅仅只是用于模拟
@ApiOperation(value = "商家发货", notes = "商家发货", httpMethod = "GET")
@GetMapping("/deliver")
public MyJSONResult deliver(
@ApiParam(name = "orderId", value = "订单id", required = true)
@RequestParam String orderId) throws Exception {
if (StringUtils.isBlank(orderId)) {
return MyJSONResult.errorMsg("订单ID不能为空");
}
myOrdersService.updateDeliverOrderStatus(orderId);
return MyJSONResult.ok();
}
@ApiOperation(value = "用户确认收货", notes = "用户确认收货", httpMethod = "POST")
@PostMapping("/confirmReceive")
public MyJSONResult confirmReceive(
@ApiParam(name = "orderId", value = "订单id", required = true)
@RequestParam String orderId,
@ApiParam(name = "userId", value = "用户id", required = true)
@RequestParam String userId) throws Exception {
MyJSONResult checkResult = checkUserOrder(userId, orderId);
if (checkResult.getStatus() != HttpStatus.OK.value()) {
return checkResult;
}
boolean res = myOrdersService.updateReceiveOrderStatus(orderId);
if (!res) {
return MyJSONResult.errorMsg("订单确认收货失败!");
}
return MyJSONResult.ok();
}
@ApiOperation(value = "用户删除订单", notes = "用户删除订单", httpMethod = "POST")
@PostMapping("/delete")
public MyJSONResult delete(
@ApiParam(name = "orderId", value = "订单id", required = true)
@RequestParam String orderId,
@ApiParam(name = "userId", value = "用户id", required = true)
@RequestParam String userId) throws Exception {
MyJSONResult checkResult = checkUserOrder(userId, orderId);
if (checkResult.getStatus() != HttpStatus.OK.value()) {
return checkResult;
}
boolean res = myOrdersService.deleteOrder(userId, orderId);
if (!res) {
return MyJSONResult.errorMsg("订单删除失败!");
}
return MyJSONResult.ok();
}
/**
* 用于验证用户和订单是否有关联关系,避免非法用户调用
*
* @return
*/
private MyJSONResult checkUserOrder(String userId, String orderId) {
Orders order = myOrdersService.queryMyOrder(userId, orderId);
if (order == null) {
return MyJSONResult.errorMsg("订单不存在!");
}
return MyJSONResult.ok();
}
}
Service
package com.shiers.service.center;
import com.shiers.pojo.Orders;
import com.shiers.utils.PagedGridResult;
/**
* Demo class
*
* @author shierS
* @date 2021/6/6
*/
public interface MyOrdersService {
/**
* 查询我的订单列表
* @param userId
* @param orderStatus
* @param page
* @param pageSize
* @return
*/
public PagedGridResult queryMyOrders(String userId,
Integer orderStatus,
Integer page,
Integer pageSize);
/**
* @Description: 订单状态 --> 商家发货
*/
public void updateDeliverOrderStatus(String orderId);
/**
* 查询我的订单,用于用户确认订单时,判断用户id和订单id是否相互关联
*
* @param userId
* @param orderId
* @return
*/
public Orders queryMyOrder(String userId, String orderId);
/**
* 更新订单状态 —> 确认收货
*
* @return
*/
public boolean updateReceiveOrderStatus(String orderId);
/**
* 删除订单(逻辑删除)
* @param userId
* @param orderId
* @return
*/
public boolean deleteOrder(String userId, String orderId);
}
ServiceImpl
package com.shiers.service.impl.center;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.shiers.enums.OrderStatusEnum;
import com.shiers.enums.YesOrNo;
import com.shiers.mapper.OrderStatusMapper;
import com.shiers.mapper.OrdersMapper;
import com.shiers.mapper.OrdersMapperCustom;
import com.shiers.pojo.OrderStatus;
import com.shiers.pojo.Orders;
import com.shiers.pojo.vo.MyOrdersVO;
import com.shiers.service.center.MyOrdersService;
import com.shiers.utils.PagedGridResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Demo class
*
* @author shierS
* @date 2021/6/6
*/
@Service
public class MyOrdersServiceImpl implements MyOrdersService {
@Autowired
private OrdersMapperCustom ordersMapperCustom;
@Autowired
private OrderStatusMapper orderStatusMapper;
@Autowired
private OrdersMapper ordersMapper;
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult queryMyOrders(String userId, Integer orderStatus, Integer page, Integer pageSize) {
Map<String, Object> map = new HashMap<>();
map.put("userId", userId);
if(orderStatus != null){
map.put("orderStatus",orderStatus);
}
PageHelper.startPage(page,pageSize);
List<MyOrdersVO> list = ordersMapperCustom.queryMyOrders(map);
return setterPagedGrid(list,page);
}
private PagedGridResult setterPagedGrid(List<?> list,Integer page){
PageInfo<?> pageList = new PageInfo<>(list);
PagedGridResult grid = new PagedGridResult();
grid.setPage(page);
grid.setRows(list);
grid.setTotal(pageList.getPages());
grid.setRecords(pageList.getTotal());
return grid;
}
@Transactional(propagation=Propagation.REQUIRED)
@Override
public void updateDeliverOrderStatus(String orderId) {
OrderStatus updateOrder = new OrderStatus();
updateOrder.setOrderStatus(OrderStatusEnum.WAIT_RECEIVE.type);
updateOrder.setDeliverTime(new Date());
Example example = new Example(OrderStatus.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("orderId", orderId);
criteria.andEqualTo("orderStatus", OrderStatusEnum.WAIT_DELIVER.type);
System.out.println(orderId);
orderStatusMapper.updateByExampleSelective(updateOrder, example);
}
@Transactional(propagation=Propagation.SUPPORTS)
@Override
public Orders queryMyOrder(String userId, String orderId) {
Orders orders = new Orders();
orders.setUserId(userId);
orders.setId(orderId);
orders.setIsDelete(YesOrNo.NO.type);
return ordersMapper.selectOne(orders);
}
@Transactional(propagation=Propagation.REQUIRED)
@Override
public boolean updateReceiveOrderStatus(String orderId) {
OrderStatus updateOrder = new OrderStatus();
updateOrder.setOrderStatus(OrderStatusEnum.SUCCESS.type);
updateOrder.setSuccessTime(new Date());
Example example = new Example(OrderStatus.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("orderId", orderId);
criteria.andEqualTo("orderStatus", OrderStatusEnum.WAIT_RECEIVE.type);
int result = orderStatusMapper.updateByExampleSelective(updateOrder, example);
return result == 1 ? true : false;
}
@Transactional(propagation=Propagation.REQUIRED)
@Override
public boolean deleteOrder(String userId, String orderId) {
Orders updateOrder = new Orders();
updateOrder.setIsDelete(YesOrNo.YES.type);
updateOrder.setUpdatedTime(new Date());
Example example = new Example(Orders.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("id", orderId);
criteria.andEqualTo("userId", userId);
int result = ordersMapper.updateByExampleSelective(updateOrder, example);
return result == 1 ? true : false;
}
}
补充:
由于没有商城后台管理,商家发货功能只是开发了接口,使用GET方法,可在浏览器直接调用,或者使用Swagger2进行调试更改订单状态