SpringBoot訂單模塊核心接口設計與實現

目錄

一、 管理端接口實現 (后臺管理系統)

一、訂單搜索 (高權重 - 核心管理功能)

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數據列表

  1. 二、各個狀態的訂單數量統計 (高權重 - 管理概覽)

這段代碼的核心邏輯是統計訂單三種狀態(退款、已確認、派送中)的數量并封裝成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_timeoperator?等字段。

五、拒單 (核心操作)

這段代碼的核心邏輯是:執行訂單拒單操作并更新訂單狀態。具體流程為:首先驗證訂單是否存在且處于待接單狀態(狀態碼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):
  1. 數據校驗

    • 驗證配送地址有效性(地址簿ID存在性)

    • 驗證用戶購物車非空(通過用戶ID查詢購物車條目)

  2. 訂單創建

    • 構建訂單主數據(復制DTO屬性,填充時間戳訂單號、用戶信息、地址信息等)

    • 設置初始狀態:待付款(PENDING_PAYMENT)和未支付(UN_PAID

    • 執行訂單主表插入

  3. 訂單明細處理

    • 遍歷購物車條目,轉換為訂單明細對象(關聯新訂單ID)

    • 批量插入訂單明細表

  4. 清理購物車

    • 刪除當前用戶購物車所有條目

  5. 返回結果

    • 封裝基礎訂單信息(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):
  1. 分頁初始化
    通過PageHelper.startPage()設置分頁參數(頁碼+每頁數量)

  2. 構建查詢條件

    • 獲取當前用戶ID(BaseContext.getCurrentId()

    • 設置訂單狀態過濾條件(status參數)

    • 封裝為DTO對象(OrdersPageQueryDTO

  3. 主訂單查詢
    調用orderMapper.OrderPage()執行分頁查詢,獲取訂單主表數據(Page<Orders>對象)

  4. 訂單詳情裝配
    遍歷每個訂單:

    • 根據訂單ID查詢關聯的訂單詳情(orderDetailMapper.getByOrderId()

    • 將主訂單屬性拷貝到VO對象(BeanUtils.copyProperties

    • 將詳情列表注入VO對象(setOrderDetailList()

    • 組裝為VO列表(orderVOS

  5. 返回分頁結果
    封裝總記錄數(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):
  1. 訂單ID校驗
    首先檢查傳入的訂單ID是否為null,若為空直接返回null(避免無效查詢)

  2. 主訂單查詢
    調用orderMapper.SelectOrderID(id)獲取訂單主表數據(Orders對象)
    注意:此處未處理ordersnull的情況(訂單不存在時后續會拋NPE)

  3. 訂單詳情查詢
    通過orderDetailMapper.getByOrderId()根據訂單ID查詢關聯的菜品/商品明細(返回List<OrderDetail>

  4. VO對象組裝

    • 創建OrderVO空對象

    • 使用BeanUtils.copyProperties將主訂單屬性拷貝到VO

    • 將詳情列表注入VO的orderDetailList屬性

  5. 返回完整數據
    返回包含主訂單信息+詳情列表的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):
  1. 校驗訂單有效性

    • 通過訂單ID查詢訂單,若不存在則拋出異常

    • 僅允許取消待支付(1)和待接單(2)狀態的訂單(狀態值≤2),其他狀態拋出異常

  2. 退款處理(注釋狀態)

    • 原始設計:待接單狀態需調用微信退款接口(因支付功能未實現,當前邏輯被注釋)

    • 若執行退款需更新支付狀態為REFUND

  3. 更新訂單狀態

    • 設置訂單狀態為已取消(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):
  1. 獲取當前用戶身份
    BaseContext.getCurrentId()?獲取當前登錄用戶的ID

  2. 查詢歷史訂單詳情
    通過?orderDetailMapper.getByOrderId(id)?根據訂單ID獲取原訂單包含的所有菜品/商品明細(List<OrderDetail>

  3. 數據轉換處理
    使用 Java Stream API 將訂單明細轉換為購物車對象:

    orderDetailList.stream().map(x->{...})
    • 對象拷貝:通過?BeanUtils.copyProperties?將菜品屬性(名稱、價格、數量等)從訂單明細拷貝到新購物車對象

    • 排除ID:拷貝時忽略原ID("id"參數),確保插入時生成新ID

    • 綁定用戶:設置購物車項的歸屬用戶(setUserId(userid)

    • 設置時間:添加當前時間作為創建時間(setCreateTime(LocalDateTime.now())

  4. 批量寫入數據庫

    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):
  1. 訂單查詢與校驗

    • 根據訂單ID查詢訂單數據(orderMapper.SelectOrderID(id)

    • 若訂單不存在,拋出業務異常(OrderBusinessException

  2. 構建催單消息
    創建包含催單信息的Map對象:

    Map map = new HashMap();
    map.put("type", 2);         // 消息類型:2=催單(區別于1=來單提醒)
    map.put("orderId", id);      // 催單的訂單ID
    map.put("content", "訂單號: " + orders.getNumber()); // 拼接訂單號文本
  3. 消息格式轉換
    使用JSON.toJSONString()將Map對象轉換為JSON字符串,準備網絡傳輸

  4. 實時消息推送
    調用webSocketServer.sendToAllClient()將JSON格式的催單消息廣播給所有已連接的商家端客戶端

4.Mapper ():?無
5.Mapper XML ():?無

三、 關鍵技術與注意事項

  • 事務管理 (@Transactional):?強調在?下單、涉及多表更新的操作(如取消訂單涉及狀態更新+退款申請)上使用事務保證數據一致性。

  • 數據脫敏:?用戶端返回的敏感信息(如電話號碼、詳細地址)適當脫敏。

  • 狀態校驗:?所有狀態變更操作 (接單拒單取消完成支付) 必須嚴格校驗當前狀態是否符合業務規則。

  • 冪等性:?對于支付回調、重要的狀態變更接口,考慮實現冪等(如通過唯一業務流水號)。

  • 日志記錄:?關鍵操作(尤其是管理端操作和支付相關)記錄詳細操作日志。

  • 異常處理:?定義清晰的業務異常 (OrderBusinessException,?AddressBookBusinessException?等),在Controller層統一捕獲并返回友好錯誤信息。

  • 參數校驗:?使用?Spring Validation?(@Valid) 或手動校驗DTO參數的有效性、非空等。

  • DTO / VO 的應用:?清晰區分數據傳輸對象 (DTO) 和視圖對象 (VO),避免實體類直接暴露給前端。

四、 總結

  • 回顧訂單模塊的核心接口及其在管理端和用戶端的分工。

  • 強調分層設計 (Controller/Service/Mapper) 和狀態機管理的重要性。

  • 提示讀者關注安全(權限、歸屬)、事務、冪等、日志等關鍵實踐點。

  • 展望可能的優化點:分庫分表(海量訂單)、訂單超時自動取消(定時任務)、更復雜的統計報表等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88214.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EXCEL鏈接模板無法自動鏈接到PowerBI?試試這個方法

在使用EXCEL鏈接模板連接PowerBI時&#xff0c;你有沒有遇到如圖所示的提示呢&#xff1a;下面我來分享一下&#xff0c;出現彈框的原因及解決方法&#xff1a;首先我們先看一下這個英文翻譯&#xff0c;意思就是說&#xff0c;我們只能使一個PowerBI文件處于打開的狀態&#x…

最新全開源禮品代發系統源碼/電商快遞代發/一件代發系統

簡介&#xff1a;最新全開源禮品代發系統源碼/電商快遞代發/一件代發系統測試環境&#xff1a;Nginx PHP7.2 MySQL5.6圖片&#xff1a;

Android 事件分發機制深度解析

一、事件分發機制核心概念1. 事件分發三要素要素作用關鍵方法事件(Event)用戶觸摸動作的封裝MotionEvent分發者負責將事件傳遞給下級dispatchTouchEvent()攔截者決定是否截斷事件傳遞&#xff08;僅ViewGroup&#xff09;onInterceptTouchEvent()消費者最終處理事件的組件onTou…

從威脅檢測需求看兩類安全監測平臺差異

在網絡安全領域&#xff0c;針對不同場景的威脅檢測需求&#xff0c;衍生處了多種技術架構的安全監測平臺。盡管它們的目標均為“識別異常行為、阻斷潛在威脅”&#xff0c;但根據其核心引擎的配置的技術側重點&#xff0c;可大致分為兩類&#xff1a;聚焦基礎入侵檢測的平臺與…

useContext:React 跨組件數據共享的優雅解決方案

關鍵點 useContext&#xff1a;React 提供的 Hook&#xff0c;用于在組件樹中共享全局狀態&#xff0c;簡化跨組件數據傳遞。應用場景&#xff1a;主題切換、用戶認證、語言設置和全局配置管理。實現方式&#xff1a;結合 createContext 和 useContext&#xff0c;實現靈活的狀…

20250706-8-Docker快速入門(下)-Dockerfile介紹與基本使用_筆記

一、Dockerfile構建鏡像1. Dockerfile概述&#xfeff;定義&#xff1a;Dockerfile是一個用于自動構建鏡像的文本文件&#xff0c;由一條條指令組成工作原理&#xff1a;指令逐步執行&#xff0c;每個指令完成不同功能典型指令示例&#xff1a;FROM centos:latest&#xff1a;基…

Git系列--3.分支管理

目錄 一、理解分支 1.1圖示 1.2 打印倉庫下有哪些分支 1.3創建分支 1.4HEAD與切換分支 1.5合并分支 1.6流程圖理解 二、刪除分支 ? 三、合并分支沖突 3.1.問題導入 3.2.解決 3.3合并圖示 四、合并模式 4.1合并?編輯 4.2變基 五、bug分支 5.1背景建立 5.2解決步驟 5.2.1…

Vue.js TDD開發深度指南:工具鏈配置與精細化測試策略

“TDD不是測試優先的開發&#xff0c;而是設計優先的開發。” —— Robert C. Martin 引言 在Vue.js項目中實施測試驅動開發&#xff08;TDD&#xff09;是構建健壯應用的關鍵路徑。但許多開發者在實踐中常遇到&#xff1a; 工具鏈配置復雜導致放棄不同類型組件測試策略混淆測…

基于物聯網的智能家居控制系統設計與實現

標題:基于物聯網的智能家居控制系統設計與實現內容:1.摘要 隨著物聯網技術的飛速發展&#xff0c;智能家居逐漸成為人們關注的焦點。本文旨在設計并實現一個基于物聯網的智能家居控制系統&#xff0c;以提高家居的智能化水平和用戶的生活便利性。通過采用先進的傳感器技術、通信…

Vue 中使用 Cesium 實現可拖拽點標記及坐標實時顯示功能

在 Cesium 地圖開發中&#xff0c;實現點標記的拖拽交互并實時顯示坐標信息是一個常見的需求。本文將詳細介紹如何在 Vue 框架中使用 Cesium 的 Primitive 方式創建點標記&#xff0c;并實現拖拽功能及坐標提示框跟隨效果。先看效果圖功能實現概述我們將實現的功能包括&#xf…

HTML 插件:構建網頁的強大工具

HTML 插件:構建網頁的強大工具 引言 HTML 插件是網頁設計中不可或缺的一部分,它們為網頁增添了豐富的交互性和動態效果。本文將深入探討 HTML 插件的概念、類型、應用及其在網頁開發中的重要性。 什么是 HTML 插件? HTML 插件,也稱為 HTML 組件或 HTML 控件,是指嵌入到…

NeRF、3DGS、2DGS下三維重建相關方法介紹及以及在實景三維領域的最新實踐

一、引言 在計算機視覺與圖形學領域&#xff0c;三維重建技術正經歷從傳統幾何建模向智能化神經表征的范式轉變。近年來&#xff0c;隨著深度學習算法的迭代、傳感器技術的進步及計算硬件的升級&#xff0c;以神經輻射場&#xff08;NeRF&#xff09;和高斯潑濺&#xff08;2D…

rt thread studio 和 KEIL對于使用rt thread 的中間件和組件,哪個更方便

下面我從中間件/組件集成和開發體驗兩個角度&#xff0c;詳細對比 RT-Thread Studio 和 Keil MDK 的便利性&#xff1a;1. 中間件和組件集成 RT-Thread Studio 集成RT-Thread生態&#xff1a;內置RT-Thread的包管理器&#xff08;RT-Thread Package Manager&#xff09;&#x…

Spring Boot 項目開發實戰:入門應用部分原理示例講解

前言Spring Boot 作為當前 Java 開發領域最流行的框架之一&#xff0c;以其 "約定優于配置" 的理念極大簡化了企業級應用的開發流程。本文將基于《Spring Boot 項目開發教程&#xff08;慕課版&#xff09;》中的資產管理系統項目&#xff0c;深入解析 Spring Boot 的…

ByteBrain x 清華 VLDB25|時序多模態大語言模型 ChatTS

資料來源&#xff1a;火山引擎-開發者社區 近年來&#xff0c;多模態大語言模型&#xff08;MLLM&#xff09;發展迅速&#xff0c;并在圖像、視頻、音頻等領域取得了突破性成果。然而&#xff0c;相較于這些研究較為成熟的模態&#xff0c;時間序列這一類型的數據與大模型結合…

WPF學習筆記(25)MVVM框架與項目實例

MVVM框架與項目實例一、MVVM框架1. 概述2. 核心組件與優勢一、MVVM項目1.普通項目2. MVVM架構3. MVVM項目實例1. 項目準備2. LoginViewModel與Login2. MainWindowViewModel4. MVVM項目優化1. BaseViewModel2. RealyCommand3. 效果展示總結一、MVVM框架 1. 概述 官方文檔&…

MySQL實操

## 基于MySQL#先啟動MySQL服務#第一次登錄[rootlocalhost ~]# mysql -uroot -P3306#密碼登錄[rootlocalhost ~]# mysql -uroot -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 9Server version: 8.0.41 Source dist…

ez_rust_writeup

一道簡單的[[rust逆向]] #rust逆向 #位運算 題目信息 文件名&#xff1a;ezrust.exe 題目附件&#xff1a;https://wwfj.lanzoul.com/iczMR30k5j4h 密碼:bueq 題目分析 1. 初步分析 這是一道Rust編寫的逆向題目。通過IDA分析可以看到&#xff0c;這是一個典型的flag驗證程序。 …

【QT】-隱式轉換 explicit用法

通俗易懂的解釋:隱式轉換 vs 顯式轉換 什么是隱式轉換? 隱式轉換就是編譯器偷偷幫你做的類型轉換,你甚至都沒意識到它發生了。 例子: cpp 運行 double x = 5; // 隱式:int → double(5 變成 5.0) int y = x * 2.5; // 隱式:double → int(截斷小數部分) 構造函數的隱…

Django核心知識點詳解:JSON、AJAX、Cookie、Session與用戶認證

1. JSON數據格式詳解1.1 什么是JSON&#xff1f;JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;具有以下特點&#xff1a;獨立于語言&#xff0c;幾乎所有編程語言都支持易于人閱讀和編寫易于機器解析和生成基于文本&#xff…