使用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">SELECTod.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 orderStatusFROMorders odLEFT JOINorder_status osONod.id = os.order_idWHEREod.user_id = #{paramsMap.userId}ANDod.is_delete = 0<if test="paramsMap.orderStatus != null">AND os.order_status = #{paramsMap.orderStatus}</if>ORDER BYod.updated_time ASC</select>=============👇👇👇根据订单表的id查询对应规格表,填充到属性中👇👇👇==============<select id="getSubItems" parameterType="String" resultType="com.shiers.pojo.vo.MySubOrderItemVO">selectoi.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 pricefrom order_items oiwhere 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 {@Autowiredprivate 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*/@Servicepublic class MyOrdersServiceImpl implements MyOrdersService {@Autowiredprivate OrdersMapperCustom ordersMapperCustom;@Autowiredprivate OrderStatusMapper orderStatusMapper;@Autowiredprivate OrdersMapper ordersMapper;@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic 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)@Overridepublic 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)@Overridepublic 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)@Overridepublic 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)@Overridepublic 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进行调试更改订单状态
