目錄
一、 管理端接口實現 (后臺管理系統)
一、訂單搜索 (高權重 - 核心管理功能)
1.Controller (OrderController):
2.Service (OrderService):?
3.ServiceImpl (OrderServiceImpl):
????????1.使用MyBatis分頁插件PageHelper
????????2.基礎數據查詢
? ? ? ? ?4.Mapper (OrderMapper):?
? ? ? ? 5.Mapper XML (OrderMapper.xml):
? ? ? ? 6.數據轉換處理
? ? ? ? 6.1getOrderVOList(ordersPage);查詢訂單詳情數據? 訂單分為:訂單基礎信息+訂單詳情數據=完整訂單信息 這兩個信息是放在不同表內的,他們以邏輯外鍵 訂單ID相連
? ? ? ?6.2?getOrderDishesStr(orders); 將訂單信息拼接為字符串顯示
? ? ? ? 7.結果封裝
二、各個狀態的訂單數量統計 (高權重 - 管理概覽)
1.Controller (OrderController):
1.OrderStatisticsVO返回參數?編輯
2.Service (OrderService):?
3.ServiceImpl (AdminOrderServiceImpl):??編輯?編輯
4.Mapper (OrderMapper):??編輯
三、查詢訂單詳情 (高權重 - 操作基礎)
1.Controller (OrderController):
2.Service (OrderService):?
3.ServiceImpl (OrderServiceImpl):?編輯
3.1數據獲取流程:
3.2對象轉換:
4.Mapper (OrderMapper):?
5.getByOrderId()orderDetailMapper.getByOrderId(orders.getId());?編輯
四、接單 (核心操作)
1.Controller (OrderController):
2.Service (OrderService):?
3.ServiceImpl (OrderServiceImpl):
4.Mapper (OrderMapper):?void update(Order order);?(通用更新方法)
5.Mapper XML (OrderMapper.xml):?編寫?UPDATE?語句更新狀態、confirm_time、operator?等字段。?編輯
五、拒單 (核心操作)
1.Controller (OrderController):
OrdersRejectionDTO類:
2.Service (AdminOrderService):?
3.ServiceImpl (AdminOrderServiceImpl):
4.Mapper (OrderMapper):?同上(更新)。
5.Mapper XML (OrderMapper.xml):?同上(更新更多字段:狀態、取消原因類型、取消原因、取消時間)。
六、派送訂單 (核心操作)
1.Controller (AdminOrderController):
2.Service (AdminOrderService):?
3.ServiceImpl (AdminOrderServiceImpl):
4.Mapper (OrderMapper):?同上。
5.Mapper XML (OrderMapper.xml):?同上(更新狀態、delivery_time)。
七、完成訂單 (核心操作)
1.Controller (AdminOrderController):
2.Service (AdminOrderService):?
3.ServiceImpl (AdminOrderServiceImpl):
4.Mapper (OrderMapper):?同上。
5.Mapper XML (OrderMapper.xml):?同上(更新狀態、completion_time)。
八、取消訂單 (管理端)
1.Controller (AdminOrderController):
2.Service (AdminOrderService):?
3.ServiceImpl (AdminOrderServiceImpl):
4.Mapper (OrderMapper):?同上。
5.Mapper XML (OrderMapper.xml):?同上(更新狀態、取消原因類型、取消原因、取消時間)。
二、 用戶端接口實現 (小程序/APP)
一.用戶下單 (最高權重 - 核心業務起點)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper?
5.Mapper XML (list(動態查詢菜品或套餐信息),?insert(插入訂單數據),?insert(插入訂單詳情)):?
二、訂單支付 (最高權重 - 核心交易環節)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper (OrderMapper):?查詢訂單 (selectByNumberAndUserId), 更新訂單狀態/支付信息 (update)。
三、歷史訂單查詢 (高權重 - 用戶常用)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper (OrderMapper):?
5.Mapper XML (OrderMapper.xml):??編輯
四、查詢訂單詳情 (用戶端)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper (OrderMapper):?
5.Mapper XML (OrderMapper.xml):?同管理端詳情查詢SQL,增加?user_id = #{userId}?條件。
五、取消訂單 (用戶端)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper (OrderMapper):?同上(更新)。
5.Mapper XML (OrderMapper.xml):?同上(更新狀態、取消原因類型、取消時間)。
六、再來一單 (提升復購)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper (OrderMapper,?OrderDetailMapper,?ShoppingCartMapper):?
5.Mapper XML (OrderMapper.xml,?OrderDetailMapper.xml,?ShoppingCartMapper.xml):?
七、催單 (提升體驗)
1.Controller (UserOrderController):
2.Service (UserOrderService):?
3.ServiceImpl (UserOrderServiceImpl):
4.Mapper ():?無
5.Mapper XML ():?無
三、 關鍵技術與注意事項
四、 總結
引言
-
項目背景:?簡述項目核心業務,突出訂單模塊的核心地位。
-
技術棧:?Spring Boot, Spring MVC, MyBatis (Mapper, XML), Lombok (可選), 數據庫 (MySQL等)。
-
分層架構簡述:?快速回顧?
Controller
?->?Service
?(Interface) ->?ServiceImpl
?(Implementation) ->?Mapper
?(Interface) ->?Mapper.xml
?的數據流和職責。 -
本文目標:?聚焦訂單模塊接口設計,詳細講解管理端和用戶端核心接口的實現思路與關鍵代碼,涵蓋 Controller、Service、ServiceImpl、Mapper 及 XML 的協作。
一、 訂單模塊核心實體與狀態流轉
-
Order
?實體核心字段:?(簡要列出,如 id, userId, amount, status, createTime, updateTime, address, items/snapshot 等) -
訂單狀態 (Status Enum):?定義關鍵狀態(如:
待支付
、待接單
、已接單/制作中
、派送中
、已完成
、已取消
、已拒絕
),并配以狀態流轉圖,清晰展示管理端和用戶端操作如何觸發狀態變化。
一、 管理端接口實現 (后臺管理系統)
按操作頻率和業務重要性排序
通用返回參數:
Result
一、訂單搜索 (高權重 - 核心管理功能)
代碼核心邏輯:分頁查詢訂單數據,將基礎訂單信息轉換為包含詳情的VO對象,并封裝為分頁結果返回。具體流程為:首先通過
PageHelper
設置分頁參數并執行訂單主表查詢;隨后調用getOrderVOList
方法將查詢到的訂單數據轉換為VO對象(此過程會補充查詢訂單詳情數據);最后將總記錄數和VO列表封裝到PageResult
對象中返回。
1.Controller (OrderController
):
? ?GET /admin/order/conditionSearch
?- ? ? ? ? 參數:OrdersPageQueryDTO
- ? ? ? ? 返回:Result<PageResult>
OrdersPageQueryDTO參數
2.Service (OrderService
):?
/*** 根據提供的數據 查詢匹配的訂單* @param ordersPageQueryDTO* @return*/PageResult QueryOrderAll(OrdersPageQueryDTO ordersPageQueryDTO);
3.ServiceImpl (OrderServiceImpl
):
關鍵點詳解分頁初始化
????????1.使用MyBatis分頁插件PageHelper
設置當前頁碼(page
)和每頁記錄數(pageSize
)
注意:這行代碼必須緊挨在Mapper調用前,否則會導致分頁失效java
PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());
????????2.基礎數據查詢
Page<Orders> ordersPage = orderMapper.OrderPage(ordersPageQueryDTO);
執行Mapper層查詢,返回Page<Orders>
對象
ordersPage
包含:
當前頁的訂單數據列表(
List<Orders>
)分頁信息(總記錄數、總頁數等)
? ? ? ? ?4.Mapper (OrderMapper
):?
Page<Orders> OrderPage(OrdersPageQueryDTO ordersPageQueryDTO);
? ? ? ? 5.Mapper XML (OrderMapper.xml
):
編寫動態 SQL (<where>
,?<if>
) 處理各種可選查詢條件。
關聯查詢必要的關聯信息(如用戶信息、訂單項快照等)。
實現高效分頁 (limit
)。
? ? ? ? 6.數據轉換處理
List<OrderVO> orderVOList = getOrderVOList(ordersPage);
? ? ? ? 6.1getOrderVOList(ordersPage);查詢訂單詳情數據? 訂單分為:訂單基礎信息+訂單詳情數據=完整訂單信息 這兩個信息是放在不同表內的,他們以邏輯外鍵 訂單ID相連
/*** 根據order 查詢order的詳細信息* @param ordersPage* @return*/private List<OrderVO> getOrderVOList(Page<Orders> ordersPage){//創建封裝類列表List<OrderVO> orderVOList=new ArrayList<>();//獲取當前頁的列表數據List<Orders> ordersList=ordersPage.getResult();//判斷集合是否為空if(!CollectionUtils.isEmpty(ordersList)){//遍歷每個數據for (Orders orders:ordersList){//創建封裝類OrderVO orderVO=new OrderVO();//拷貝BeanUtils.copyProperties(orders,orderVO);//拼接描述信息(格式:宮保雞丁*3;)String orderDishes=getOrderDishesStr(orders);//插入描述信息orderVO.setOrderDishes(orderDishes);orderVOList.add(orderVO);}}return orderVOList;}
? ? ? ?6.2?getOrderDishesStr(orders); 將訂單信息拼接為字符串顯示
/*** 拼接訂單詳細信息* @param orders* @return*/private String getOrderDishesStr(Orders orders){//查詢訂單詳細信息List<OrderDetail> orderDetailList=orderDetailMapper.getByOrderId(orders.getId());// 將每一條訂單菜品信息拼接為字符串(格式:宮保雞丁*3;)List<String> orderDishes=orderDetailList.stream().map(x->{String orderDish=x.getName()+"*"+x.getNumber()+";";return orderDish;}).collect(Collectors.toList());// 將該訂單對應的所有菜品信息拼接在一起return String.join("",orderDishes);}
? ? ? ? 7.結果封裝
return new PageResult(ordersPage.getTotal(), orderVOList);
構建包含以下內容的分頁響應:
ordersPage.getTotal()
:總記錄數(來自Page對象)
orderVOList
:當前頁的VO數據列表
-
二、各個狀態的訂單數量統計 (高權重 - 管理概覽)
這段代碼的核心邏輯是:統計訂單三種狀態(退款、已確認、派送中)的數量并封裝成VO對象返回。具體通過三次獨立查詢獲取各狀態訂單數量:先查詢退款狀態訂單數,再查詢已確認狀態訂單數,最后查詢派送中狀態訂單數,最終將這些統計值設置到OrderStatisticsVO對象的對應屬性中返回。
1.Controller (OrderController
):
? ?GET /admin/order/statistics
?- ? ? ? ? 參數:無
- ? ? ? ? 返回:自定義?
OrderStatisticsVO
,包含各狀態訂單數量。
1.OrderStatisticsVO返回參數

2.Service (OrderService
):?
OrderStatisticsVO QueryOrderStatusNums();
3.ServiceImpl (AdminOrderServiceImpl
):?

4.Mapper (OrderMapper
):?
三、查詢訂單詳情 (高權重 - 操作基礎)
這段代碼的核心邏輯是:根據訂單ID查詢訂單主信息及關聯的訂單詳情列表,組裝為VO對象返回。具體過程為:首先通過訂單ID查詢主訂單數據(
Orders
對象),再根據該訂單ID查詢對應的訂單詳情列表(OrderDetail
集合),最后將主訂單屬性拷貝到OrderVO
對象并設置詳情列表后返回。
1.Controller (OrderController
):
GET: /admin/order/details/{id}
參數: Long id (訂單Id)
- 返回:
OrderVO
,包含訂單所有詳細信息(主表信息、用戶信息、地址、訂單項詳情等)。 - OrderVO參數
2.Service (OrderService
):?
OrderVO QueryOrderDeliver(Long id);
3.ServiceImpl (OrderServiceImpl
):
-
3.1數據獲取流程:
- 先通過訂單ID查詢主表信息(
Orders
) - 再通過訂單ID查詢關聯的明細數據(
OrderDetail
) -
3.2對象轉換:
- 使用
BeanUtils.copyProperties
簡化屬性復制 - 最后組裝成前端需要的VO對象
4.Mapper (OrderMapper
):?
orderMapper.SelectOrderID(id);
5.getByOrderId()
orderDetailMapper.getByOrderId(orders.getId());
四、接單 (核心操作)
這段代碼的核心邏輯是:驗證并執行訂單接單操作。具體流程為:首先根據傳入的ID查詢訂單數據,校驗訂單是否存在且處于待接單狀態(狀態碼為REFUND);若校驗失敗則拋出業務異常;校驗通過后創建新訂單對象,設置ID并將狀態更新為已確認(CONFIRMED),最后調用Mapper執行狀態更新。
1.Controller (OrderController
):
PUT /admin/order/confirm
- 參數:
OrdersConfirmDTO
?(包含?orderId
,可能包含接單備注等)。 - 返回:操作成功信息。
OrdersConfirmDTO參數:
2.Service (OrderService
):?
void confirmOrder(OrdersConfirmDTO ordersConfirmDTO);
3.ServiceImpl (OrderServiceImpl
):
- 查詢訂單
- 校驗訂單狀態是否為?
待接單
。 - 更新訂單狀態為?
已接單
?(Order.Status.CONFIRMED
),設置接單狀態。 - 調用?
OrderMapper.update(Order order)
。
4.Mapper (OrderMapper
):?void update(Order order);
?(通用更新方法)
5.Mapper XML (OrderMapper.xml
):?編寫?UPDATE
?語句更新狀態、confirm_time
、operator
?等字段。
五、拒單 (核心操作)
這段代碼的核心邏輯是:執行訂單拒單操作并更新訂單狀態。具體流程為:首先驗證訂單是否存在且處于待接單狀態(狀態碼REFUND),校驗失敗則拋出異常;通過校驗后創建新訂單對象,設置訂單狀態為已取消(CANCELLED),同時記錄拒單原因和取消時間(當前時間),最后調用Mapper執行更新。其中包含一段被注釋的退款邏輯(支付狀態下需調用微信退款接口),但當前未實際執行。
1.Controller (OrderController
):
PUT /admin/order/rejection
- 參數:
OrdersRejectionDTO
?(包含?orderId
,?rejectionReason
?-?必填)。 - 返回:操作成功信息。
OrdersRejectionDTO類:
2.Service (AdminOrderService
):?
void rejectionOrder(OrdersRejectionDTO ordersRejectionDTO);
3.ServiceImpl (AdminOrderServiceImpl
):
- 校驗訂單狀態是否為?
待接單
。 - 更新訂單狀態為?
已取消
,取消原因類型為 前端傳輸的拒絕原因、取消時間。 - 調用?
OrderMapper.update(Order order)
。 - (重要)?如果原訂單已支付,調用支付退款接口。
4.Mapper (OrderMapper
):?同上(更新)。
5.Mapper XML (OrderMapper.xml
):?同上(更新更多字段:狀態、取消原因類型、取消原因、取消時間)。
六、派送訂單 (核心操作)
這段代碼的核心邏輯是:執行訂單派送操作,將訂單狀態從待派送更新為派送中。具體流程為:首先根據訂單ID查詢訂單數據,校驗訂單是否存在且處于待派送狀態(狀態碼CONFIRMED);若校驗失敗則拋出業務異常;通過校驗后創建新訂單對象,設置ID并將狀態更新為派送中(DELIVERY_IN_PROGRESS),最后調用Mapper執行狀態更新。
1.Controller (AdminOrderController
):
PUT /admin/order/delivery/{id}
參數:Long id(訂單Id)
- 返回:操作成功信息。
2.Service (AdminOrderService
):?
void delivery(Long id);
3.ServiceImpl (AdminOrderServiceImpl
):
- 校驗訂單狀態是否為 待派送
- 更新訂單狀態為?
派送中
?(Order.Status.DELIVERY_IN_PROGRESS
)。 - 設置訂單ID,訂單狀態
- 調用?
OrderMapper.update(...)
。
4.Mapper (OrderMapper
):?同上。
5.Mapper XML (OrderMapper.xml
):?同上(更新狀態、delivery_time
)。
七、完成訂單 (核心操作)
這段代碼的核心邏輯是:執行訂單完成操作,將派送中的訂單更新為已完成狀態。具體流程為:首先根據訂單ID查詢訂單數據,校驗訂單是否存在且處于派送中狀態(狀態碼DELIVERY_IN_PROGRESS);校驗失敗則拋出業務異常;通過校驗后創建新訂單對象,設置ID、將狀態更新為已完成(COMPLETED)并記錄當前送達時間,最后調用Mapper執行狀態更新。
1.Controller (AdminOrderController
):
PUT /admin/order/complete/{id}
參數:Long id(訂單Id)
- 返回:操作成功信息。
2.Service (AdminOrderService
):?
void complete(Long id);
3.ServiceImpl (AdminOrderServiceImpl
):
- 校驗訂單狀態是否為?
派送中
。 - 更新訂單狀態為?
已完成
?(Order.Status.COMPLETED
)。 - 設置訂單ID,訂單狀態、完成時間
- 調用?
OrderMapper.update(...)
。
4.Mapper (OrderMapper
):?同上。
5.Mapper XML (OrderMapper.xml
):?同上(更新狀態、completion_time
)。
八、取消訂單 (管理端)
這段代碼的核心邏輯是:執行訂單取消操作,將已接單訂單更新為已取消狀態。具體流程為:首先根據訂單ID查詢訂單數據,校驗訂單是否存在且處于已接單狀態(狀態碼CONFIRMED);校驗失敗則拋出業務異常;通過校驗后創建新訂單對象,設置ID、將狀態更新為已取消(CANCELLED)并記錄取消原因及當前取消時間,最后調用Mapper執行狀態更新。其中包含一段被注釋的退款邏輯(支付狀態下需調用微信退款接口),但當前未實際執行。
1.Controller (AdminOrderController
):
PUT /admin/order/cancel
- 參數:
OrdersCancelDTO
?(包含?orderId
,?cancelReason
?-?必填)。 - 返回:操作成功信息。
OrdersCancelDTO參數:
2.Service (AdminOrderService
):?
void cancel(OrdersCancelDTO ordersCancelDTO);
3.ServiceImpl (AdminOrderServiceImpl
):
- 校驗訂單狀態(通常允許在
已接單
等狀態取消,具體看業務)。 - 更新訂單狀態為?
已取消
,記錄取消原因、取消時間 - 調用?
OrderMapper.update(...)
。 - (重要)?如果原訂單已支付,調用支付退款接口。
4.Mapper (OrderMapper
):?同上。
5.Mapper XML (OrderMapper.xml
):?同上(更新狀態、取消原因類型、取消原因、取消時間)。
二、 用戶端接口實現 (小程序/APP)
按用戶操作流程和核心體驗排序
一.用戶下單 (最高權重 - 核心業務起點)
這段代碼的核心邏輯是:執行用戶下單全流程,包括地址與購物車校驗、訂單數據構建與插入、訂單明細生成、購物車清理及結果返回。具體流程為:首先校驗配送地址有效性及用戶購物車非空;隨后構建訂單主數據(填充地址、用戶信息、時間戳訂單號等),設置初始狀態為待付款并插入訂單表;接著遍歷購物車條目轉換為訂單明細對象并批量插入;完成后清空用戶購物車;最終封裝訂單ID、下單時間、訂單號和金額等基礎信息返回VO對象。整個過程通過
@Transactional
保證事務一致性。
1.Controller (UserOrderController
):
POST /user/order/submit
- 參數:
OrdersSubmitDTO
?(包含地址ID、支付方式、備注、購物車商品信息等)。 - 返回:
OrderSubmitVO
?(包含?orderId
,?orderNumber
,?orderAmount
,?orderTime
?等)。
OrderSubmitVO參數
2.Service (UserOrderService
):?
OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);
3.ServiceImpl (UserOrderServiceImpl
):
-
數據校驗
-
驗證配送地址有效性(地址簿ID存在性)
-
驗證用戶購物車非空(通過用戶ID查詢購物車條目)
-
-
訂單創建
-
構建訂單主數據(復制DTO屬性,填充時間戳訂單號、用戶信息、地址信息等)
-
設置初始狀態:待付款(
PENDING_PAYMENT
)和未支付(UN_PAID
) -
執行訂單主表插入
-
-
訂單明細處理
-
遍歷購物車條目,轉換為訂單明細對象(關聯新訂單ID)
-
批量插入訂單明細表
-
-
清理購物車
-
刪除當前用戶購物車所有條目
-
-
返回結果
-
封裝基礎訂單信息(ID、下單時間、訂單號、金額)返回
-
4.Mapper?
/*** 根據id查詢* @param id* @return*/
@Select("select * from address_book where id = #{id}")
AddressBook getById(Long id);
/*** 動態查詢菜品或套餐信息* @param shoppingCart* @return*/
List<ShoppingCart> list(ShoppingCart shoppingCart);
/*** 根據id查詢地址* @param addressId* @return*/
@Select("select * from address_book where id=#{addressId}")
AddressBook getByUserId(Long addressId);
/*** 插入訂單數據* @param orders*/
void insert(Orders orders);
/*** 插入訂單詳情* @param orderDetailList*/
void inset(List<OrderDetail> orderDetailList);
/*** 清空購物車* @param userId*/
@Delete("delete from shopping_cart where user_id=#{userId}")
void DeleShoppingCart(Long userId);
5.Mapper XML (list(動態查詢菜品或套餐信息),?insert(插入訂單數據),?insert(
插入訂單詳情)
):?
- list(動態查詢菜品或套餐信息)
- insert(插入訂單數據)
insert(
插入訂單詳情)
二、訂單支付 (最高權重 - 核心交易環節)
這段代碼的核心邏輯是:模擬微信支付流程,生成預支付交易單并返回支付參數。具體流程為:首先獲取當前用戶信息(含openid),調用微信支付工具生成預支付單(傳入訂單號、象征性金額0.01元、固定描述和用戶openid);若返回結果提示"ORDERPAID"(訂單已支付)則拋出業務異常;最終將支付接口返回的JSON數據轉換為VO對象,并特殊處理package字段(避免Java關鍵字沖突)后返回。注:實際支付場景因缺少商戶資質無法真實調用,僅作演示用途。
1.Controller (UserOrderController
):
PUT /user/order/payment
- 參數:
OrdersPaymentDTO
?(包含?orderNumber
,?payMethod
?- 可能微信支付碼等)。 - 返回:支付結果信息(根據支付平臺返回封裝)。
2.Service (UserOrderService
):?
OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception;
3.ServiceImpl (UserOrderServiceImpl
):
校驗訂單號有效性、訂單狀態為?待支付
、訂單用戶歸屬。
調用第三方支付接口 (如微信支付):
- 構造支付請求參數(訂單號、金額、描述、用戶openid等)。
- 發起預支付請求,獲取預支付交易標識 (prepay_id)。
- 生成小程序/APP端調起支付所需參數(簽名、時間戳等)。
- (模擬支付場景):?直接修改訂單狀態為?
待接單
,記錄支付時間。 - 返回支付參數或成功標識。
4.Mapper (OrderMapper
):?查詢訂單 (selectByNumberAndUserId
), 更新訂單狀態/支付信息 (update
)。
三、歷史訂單查詢 (高權重 - 用戶常用)
這段代碼的核心邏輯是:分頁查詢當前用戶的歷史訂單(支持狀態過濾),并將每個訂單與其詳情列表組合為VO對象返回。具體流程為:首先設置分頁參數并構建查詢條件(包含當前用戶ID和訂單狀態);執行分頁查詢獲取訂單主數據;遍歷每個訂單,根據訂單ID查詢對應的訂單詳情列表;將主訂單屬性拷貝到VO對象并設置詳情列表;最終封裝分頁結果(總記錄數+VO列表)返回。
1.Controller (UserOrderController
):
GET /user/order/historyOrders
- 參數:頁碼、每頁條數、訂單狀態(可選,可查詢多個狀態)。
- 返回:分頁對象?
PageResult
,包含訂單概覽信息列表。
2.Service (UserOrderService
):?
PageResult PageOrder(int page, int pageSize, Integer status);
3.ServiceImpl (UserOrderServiceImpl
):
-
分頁初始化
通過PageHelper.startPage()
設置分頁參數(頁碼+每頁數量) -
構建查詢條件
-
獲取當前用戶ID(
BaseContext.getCurrentId()
) -
設置訂單狀態過濾條件(
status
參數) -
封裝為DTO對象(
OrdersPageQueryDTO
)
-
-
主訂單查詢
調用orderMapper.OrderPage()
執行分頁查詢,獲取訂單主表數據(Page<Orders>
對象) -
訂單詳情裝配
遍歷每個訂單:-
根據訂單ID查詢關聯的訂單詳情(
orderDetailMapper.getByOrderId()
) -
將主訂單屬性拷貝到VO對象(
BeanUtils.copyProperties
) -
將詳情列表注入VO對象(
setOrderDetailList()
) -
組裝為VO列表(
orderVOS
)
-
-
返回分頁結果
封裝總記錄數(ordersPage.getTotal()
)和VO列表到PageResult
對象返回
4.Mapper (OrderMapper
):?
/*** 查詢訂單 根據封裝類查詢* @param ordersPageQueryDTO* @return*/
Page<Orders> OrderPage(OrdersPageQueryDTO ordersPageQueryDTO);
@Select("select * from order_detail where order_id=#{OrderID}")
List<OrderDetail> getByOrderId(Long OrderID);
5.Mapper XML (OrderMapper.xml
):?
四、查詢訂單詳情 (用戶端)
這段代碼的核心邏輯是:根據訂單ID查詢訂單主信息及關聯的詳情列表,組裝成VO對象返回。具體執行流程為:首先校驗訂單ID非空(若為空則返回null);隨后通過ID查詢主訂單數據,再根據訂單ID查詢對應的訂單詳情列表;最后創建VO對象,將主訂單屬性拷貝至VO并注入詳情列表后返回。
1.Controller (UserOrderController
):
GET /user/order/orderDetail/{id}
參數:Long id(訂單Id)
- 返回:
OrderVO
?(同管理端詳情,但確保只返回當前用戶的數據)。
2.Service (UserOrderService
):?
OrderVO OrderByDetai(Long id);
3.ServiceImpl (UserOrderServiceImpl
):
-
訂單ID校驗
首先檢查傳入的訂單ID是否為null
,若為空直接返回null
(避免無效查詢) -
主訂單查詢
調用orderMapper.SelectOrderID(id)
獲取訂單主表數據(Orders
對象)
注意:此處未處理orders
為null
的情況(訂單不存在時后續會拋NPE) -
訂單詳情查詢
通過orderDetailMapper.getByOrderId()
根據訂單ID查詢關聯的菜品/商品明細(返回List<OrderDetail>
) -
VO對象組裝
-
創建
OrderVO
空對象 -
使用
BeanUtils.copyProperties
將主訂單屬性拷貝到VO -
將詳情列表注入VO的
orderDetailList
屬性
-
-
返回完整數據
返回包含主訂單信息+詳情列表的OrderVO
對象
4.Mapper (OrderMapper
):?
/*** 根據id查詢訂單* @param id* @return*/
@Select("select * from orders where id=#{id}")
Orders SelectOrderID(Long id);
/*** 查詢訂單詳情信息* @param OrderID* @return*/
@Select("select * from order_detail where order_id=#{OrderID}")
List<OrderDetail> getByOrderId(Long OrderID);
5.Mapper XML (OrderMapper.xml
):?同管理端詳情查詢SQL,增加?user_id = #{userId}
?條件。
五、取消訂單 (用戶端)
這段代碼的核心邏輯是:處理用戶取消訂單請求,僅允許取消待支付(狀態1)和待接單(狀態2)的訂單,其他狀態需聯系商家協商。具體流程為:首先驗證訂單存在性,再校驗訂單狀態是否≤2(非此范圍則拋出異常);通過校驗后創建新訂單對象,設置狀態為已取消(6),記錄"用戶主動取消"原因及當前取消時間,最后調用Mapper執行狀態更新。原始設計中待接單狀態需觸發退款邏輯(調用微信退款接口),但因支付功能未實現而被注釋。
1.Controller (UserOrderController
):
PUT /user/order/cancel/{id}
參數:Long id(訂單Id)
- 返回:操作成功信息。
2.Service (UserOrderService
):?
void UpdateOrderStatus(Long id);
3.ServiceImpl (UserOrderServiceImpl
):
-
校驗訂單有效性
-
通過訂單ID查詢訂單,若不存在則拋出異常
-
僅允許取消待支付(1)和待接單(2)狀態的訂單(狀態值≤2),其他狀態拋出異常
-
-
退款處理(注釋狀態)
-
原始設計:待接單狀態需調用微信退款接口(因支付功能未實現,當前邏輯被注釋)
-
若執行退款需更新支付狀態為
REFUND
-
-
更新訂單狀態
-
設置訂單狀態為已取消(
CANCELLED
) -
記錄取消原因為"用戶主動取消"
-
記錄取消時間為當前時間
-
調用Mapper執行狀態更新
-
4.Mapper (OrderMapper
):?同上(更新)。
5.Mapper XML (OrderMapper.xml
):?同上(更新狀態、取消原因類型、取消時間)。
六、再來一單 (提升復購)
這段代碼的核心邏輯是:將指定訂單的菜品詳情復制到當前用戶的購物車中,實現"再來一單"功能。具體流程為:首先獲取當前用戶ID;再根據訂單ID查詢原訂單的菜品詳情列表;通過流式處理將每個菜品詳情對象轉換為購物車對象(復制除ID外的所有屬性,并設置用戶ID和當前創建時間);最終將轉換后的購物車對象列表批量插入數據庫。
1.Controller (UserOrderController
):
POST /user/order/repetition/{id}
參數:Long id(訂單Id)
- 返回:操作成功信息或新訂單ID (可選)。
2.Service (UserOrderService
):?
void repetitionOrder(Long id);
3.ServiceImpl (UserOrderServiceImpl
):
-
獲取當前用戶身份
BaseContext.getCurrentId()
?獲取當前登錄用戶的ID -
查詢歷史訂單詳情
通過?orderDetailMapper.getByOrderId(id)
?根據訂單ID獲取原訂單包含的所有菜品/商品明細(List<OrderDetail>
) -
數據轉換處理
使用 Java Stream API 將訂單明細轉換為購物車對象:orderDetailList.stream().map(x->{...})
-
對象拷貝:通過?
BeanUtils.copyProperties
?將菜品屬性(名稱、價格、數量等)從訂單明細拷貝到新購物車對象 -
排除ID:拷貝時忽略原ID(
"id"
參數),確保插入時生成新ID -
綁定用戶:設置購物車項的歸屬用戶(
setUserId(userid)
) -
設置時間:添加當前時間作為創建時間(
setCreateTime(LocalDateTime.now())
)
-
-
批量寫入數據庫
shoppingCartMapper.insertBatch(shoppingCartList)
將轉換后的購物車對象列表一次性批量插入購物車表
4.Mapper (OrderMapper
,?OrderDetailMapper
,?ShoppingCartMapper
):?
/*** 查詢訂單詳情信息* @param OrderID* @return*/
@Select("select * from order_detail where order_id=#{OrderID}")
List<OrderDetail> getByOrderId(Long OrderID);
/*** 批量插入購物車對象* @param shoppingCartList*/
void insertBatch(List<ShoppingCart> shoppingCartList);
5.Mapper XML (OrderMapper.xml
,?OrderDetailMapper.xml
,?ShoppingCartMapper.xml
):?
七、催單 (提升體驗)
這段代碼的核心邏輯是:處理用戶催單請求,通過WebSocket向所有在線商家客戶端廣播催單通知。具體流程為:首先根據訂單ID查詢訂單數據,若訂單不存在則拋出異常;隨后構建包含催單類型標識(type=2)、訂單ID及訂單號文本的消息內容;將消息轉換為JSON格式后,調用WebSocket服務端方法
sendToAllClient()
實時推送給所有已連接的商家端客戶端,觸發商家端的語音/彈窗提醒。
1.Controller (UserOrderController
):
GET /user/order/reminder/{id}
參數:Long id(訂單Id)
- 返回:操作成功信息(“已提醒商家盡快處理”)。
2.Service (UserOrderService
):?
void reminder(Long id);
3.ServiceImpl (UserOrderServiceImpl
):
-
訂單查詢與校驗
-
根據訂單ID查詢訂單數據(
orderMapper.SelectOrderID(id)
) -
若訂單不存在,拋出業務異常(
OrderBusinessException
)
-
-
構建催單消息
創建包含催單信息的Map對象:Map map = new HashMap(); map.put("type", 2); // 消息類型:2=催單(區別于1=來單提醒) map.put("orderId", id); // 催單的訂單ID map.put("content", "訂單號: " + orders.getNumber()); // 拼接訂單號文本
-
消息格式轉換
使用JSON.toJSONString()
將Map對象轉換為JSON字符串,準備網絡傳輸 -
實時消息推送
調用webSocketServer.sendToAllClient()
將JSON格式的催單消息廣播給所有已連接的商家端客戶端
4.Mapper ():?無
5.Mapper XML ():?無
三、 關鍵技術與注意事項
-
事務管理 (
@Transactional
):?強調在?下單
、涉及多表更新的操作(如取消訂單涉及狀態更新+退款申請)上使用事務保證數據一致性。 -
數據脫敏:?用戶端返回的敏感信息(如電話號碼、詳細地址)適當脫敏。
-
狀態校驗:?所有狀態變更操作 (
接單
、拒單
、取消
、完成
、支付
) 必須嚴格校驗當前狀態是否符合業務規則。 -
冪等性:?對于支付回調、重要的狀態變更接口,考慮實現冪等(如通過唯一業務流水號)。
-
日志記錄:?關鍵操作(尤其是管理端操作和支付相關)記錄詳細操作日志。
-
異常處理:?定義清晰的業務異常 (
OrderBusinessException
,?AddressBookBusinessException
?等),在Controller層統一捕獲并返回友好錯誤信息。 -
參數校驗:?使用?
Spring Validation
?(@Valid
) 或手動校驗DTO參數的有效性、非空等。 -
DTO / VO 的應用:?清晰區分數據傳輸對象 (DTO) 和視圖對象 (VO),避免實體類直接暴露給前端。
四、 總結
-
回顧訂單模塊的核心接口及其在管理端和用戶端的分工。
-
強調分層設計 (Controller/Service/Mapper) 和狀態機管理的重要性。
-
提示讀者關注安全(權限、歸屬)、事務、冪等、日志等關鍵實踐點。
-
展望可能的優化點:分庫分表(海量訂單)、訂單超時自動取消(定時任務)、更復雜的統計報表等。