查詢(xún)歷史訂單——需求分析與設(shè)計(jì)
產(chǎn)品原型
?業(yè)務(wù)規(guī)則
-
分頁(yè)查詢(xún)歷史訂單
-
可以根據(jù)訂單狀態(tài)查詢(xún)
-
展示訂單數(shù)據(jù)時(shí),需要展示的數(shù)據(jù)包括:下單時(shí)間、訂單狀態(tài)、訂單金額、訂單明細(xì)(商品名稱(chēng)、圖片)
接口設(shè)計(jì)
查詢(xún)歷史訂單——代碼開(kāi)發(fā)
Controller層中
/**
* 歷史訂單查詢(xún)
*
* @param page
* @param pageSize
* @param status 訂單狀態(tài) 1待付款 2待接單 3已接單 4派送中 5已完成 6已取消
* @return
*/
@GetMapping("/historyOrders")
@ApiOperation("歷史訂單查詢(xún)")
public Result<PageResult> page(int page, int pageSize, Integer status) {
PageResult pageResult = orderService.pageQuery4User(page, pageSize, status);
return Result.success(pageResult);
}
Service層中
/**
* 用戶(hù)端訂單分頁(yè)查詢(xún)
*
* @param pageNum
* @param pageSize
* @param status
* @return
*/
public PageResult pageQuery4User(int pageNum, int pageSize, Integer status) {
// 設(shè)置分頁(yè)
PageHelper.startPage(pageNum, pageSize);
OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
ordersPageQueryDTO.setStatus(status);
// 分頁(yè)條件查詢(xún)
Page<Orders> page = orderMapper.pageQuery(ordersPageQueryDTO);
List<OrderVO> list = new ArrayList();
// 查詢(xún)出訂單明細(xì),并封裝入OrderVO進(jìn)行響應(yīng)
if (page != null && page.getTotal() > 0) {
for (Orders orders : page) {
Long orderId = orders.getId();// 訂單id
// 查詢(xún)訂單明細(xì)
List<OrderDetail> orderDetails = orderDetailMapper.getByOrderId(orderId);
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders, orderVO);
orderVO.setOrderDetailList(orderDetails);
list.add(orderVO);
}
}
return new PageResult(page.getTotal(), list);
}
Mapper層中
OrderMapper?
/**
* 分頁(yè)條件查詢(xún)并按下單時(shí)間排序
* @param ordersPageQueryDTO
*/
Page<Orders> pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);
對(duì)應(yīng)的映射文件
<select id="pageQuery" resultType="Orders">
select * from orders
<where>
<if test="number != null and number!=''">
and number like concat('%',#{number},'%')
</if>
<if test="phone != null and phone!=''">
and phone like concat('%',#{phone},'%')
</if>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="beginTime != null">
and order_time >= #{beginTime}
</if>
<if test="endTime != null">
and order_time <= #{endTime}
</if>
</where>
order by order_time desc
</select>
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618578.html
OrderDetailMapper
/**
* 根據(jù)訂單id查詢(xún)訂單明細(xì)
* @param orderId
* @return
*/
@Select("select * from order_detail where order_id = #{orderId}")
List<OrderDetail> getByOrderId(Long orderId);
查詢(xún)歷史訂單——功能測(cè)試
測(cè)試無(wú)誤
?查詢(xún)訂單詳情——需求分析與設(shè)計(jì)
產(chǎn)品原型
?接口設(shè)計(jì)
?查詢(xún)訂單詳情——代碼開(kāi)發(fā)
Controller層中
/**
* 查詢(xún)訂單詳情
*
* @param id
* @return
*/
@GetMapping("/orderDetail/{id}")
@ApiOperation("查詢(xún)訂單詳情")
public Result<OrderVO> details(@PathVariable("id") Long id) {
OrderVO orderVO = orderService.details(id);
return Result.success(orderVO);
}
Service層中
/**
* 查詢(xún)訂單詳情
*
* @param id
* @return
*/
public OrderVO details(Long id) {
// 根據(jù)id查詢(xún)訂單
Orders orders = orderMapper.getById(id);
// 查詢(xún)?cè)撚唵螌?duì)應(yīng)的菜品/套餐明細(xì)
List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());
// 將該訂單及其詳情封裝到OrderVO并返回
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders, orderVO);
orderVO.setOrderDetailList(orderDetailList);
return orderVO;
}
Mapper層中
/**
* 根據(jù)id查詢(xún)訂單
* @param id
*/
@Select("select * from orders where id=#{id}")
Orders getById(Long id);
?查詢(xún)訂單詳情——功能測(cè)試
?取消訂單——需求分析與設(shè)計(jì)
產(chǎn)品原型
?業(yè)務(wù)規(guī)則
-
待支付和待接單狀態(tài)下,用戶(hù)可直接取消訂單
-
商家已接單狀態(tài)下,用戶(hù)取消訂單需電話(huà)溝通商家
-
派送中狀態(tài)下,用戶(hù)取消訂單需電話(huà)溝通商家
-
如果在待接單狀態(tài)下取消訂單,需要給用戶(hù)退款
-
取消訂單后需要將訂單狀態(tài)修改為“已取消”
接口設(shè)計(jì)
?取消訂單——代碼開(kāi)發(fā)
Controller層中
/**
* 用戶(hù)取消訂單
*
* @return
*/
@PutMapping("/cancel/{id}")
@ApiOperation("取消訂單")
public Result cancel(@PathVariable("id") Long id) throws Exception {
orderService.userCancelById(id);
return Result.success();
}
Service層中
/**
* 用戶(hù)取消訂單
*
* @param id
*/
public void userCancelById(Long id) throws Exception {
// 根據(jù)id查詢(xún)訂單
Orders ordersDB = orderMapper.getById(id);
// 校驗(yàn)訂單是否存在
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}
//訂單狀態(tài) 1待付款 2待接單 3已接單 4派送中 5已完成 6已取消
if (ordersDB.getStatus() > 2) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
// 訂單處于待接單狀態(tài)下取消,需要進(jìn)行退款
if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
//調(diào)用微信支付退款接口
weChatPayUtil.refund(
ordersDB.getNumber(), //商戶(hù)訂單號(hào)
ordersDB.getNumber(), //商戶(hù)退款單號(hào)
new BigDecimal(0.01),//退款金額,單位 元
new BigDecimal(0.01));//原訂單金額
//支付狀態(tài)修改為 退款
orders.setPayStatus(Orders.REFUND);
}
// 更新訂單狀態(tài)、取消原因、取消時(shí)間
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("用戶(hù)取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
Mapper層中
沒(méi)有新東西。
?取消訂單——功能測(cè)試
因沒(méi)有搞好支付那塊,沒(méi)法在已付款待加單下測(cè)試。
?再來(lái)一單——需求分析與設(shè)計(jì)
產(chǎn)品原型
?接口設(shè)計(jì)
?業(yè)務(wù)規(guī)則
-
再來(lái)一單就是將原訂單中的商品重新加入到購(gòu)物車(chē)中
?再來(lái)一單——代碼開(kāi)發(fā)
Controller層中
/**
* 再來(lái)一單
*
* @param id
* @return
*/
@PostMapping("/repetition/{id}")
@ApiOperation("再來(lái)一單")
public Result repetition(@PathVariable Long id) {
orderService.repetition(id);
return Result.success();
}
Service層中
/**
* 再來(lái)一單
*
* @param id
*/
public void repetition(Long id) {
// 查詢(xún)當(dāng)前用戶(hù)id
Long userId = BaseContext.getCurrentId();
// 根據(jù)訂單id查詢(xún)當(dāng)前訂單詳情
List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);
// 將訂單詳情對(duì)象轉(zhuǎn)換為購(gòu)物車(chē)對(duì)象
List<ShoppingCart> shoppingCartList = orderDetailList.stream().map(x -> {
ShoppingCart shoppingCart = new ShoppingCart();
// 將原訂單詳情里面的菜品信息重新復(fù)制到購(gòu)物車(chē)對(duì)象中
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
return shoppingCart;
}).collect(Collectors.toList());
// 將購(gòu)物車(chē)對(duì)象批量添加到數(shù)據(jù)庫(kù)
shoppingCartMapper.insertBatch(shoppingCartList);
}
Mapper層中
ShoppingCartMapper
/**
* 批量插入購(gòu)物車(chē)數(shù)據(jù)
*
* @param shoppingCartList
*/
void insertBatch(List<ShoppingCart> shoppingCartList);
對(duì)應(yīng)的映射文件中
<insert id="insertBatch" parameterType="list">
insert into shopping_cart
(name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time)
values
<foreach collection="shoppingCartList" item="sc" separator=",">
(#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime})
</foreach>
</insert>
?
?再來(lái)一單——功能測(cè)試
測(cè)試無(wú)誤
接下來(lái)都是管理端的代碼
接下來(lái)都是管理端的代碼
接下來(lái)都是管理端的代碼
接下來(lái)都是管理端的代碼
訂單搜索——需求分析與設(shè)計(jì)
產(chǎn)品原型
業(yè)務(wù)規(guī)則
- 輸入訂單號(hào)/手機(jī)號(hào)進(jìn)行搜索,支持模糊搜索
- 根據(jù)訂單狀態(tài)進(jìn)行篩選
- 下單時(shí)間進(jìn)行時(shí)間篩選
- 搜索內(nèi)容為空,提示未找到相關(guān)訂單
- 搜索結(jié)果頁(yè),展示包含搜索關(guān)鍵詞的內(nèi)容
- 分頁(yè)展示搜索到的訂單數(shù)據(jù)?
接口設(shè)計(jì)
?
訂單搜索——代碼開(kāi)發(fā)
Controller層中
/**
* 訂單管理
*/
@RestController("adminOrderController")
@RequestMapping("/admin/order")
@Slf4j
@Api(tags = "訂單管理接口")
public class OrderController {
@Autowired
private OrderService orderService;
/**
* 訂單搜索
*
* @param ordersPageQueryDTO
* @return
*/
@GetMapping("/conditionSearch")
@ApiOperation("訂單搜索")
public Result<PageResult> conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
PageResult pageResult = orderService.conditionSearch(ordersPageQueryDTO);
return Result.success(pageResult);
}
}
Service層中
/**
* 訂單搜索
*
* @param ordersPageQueryDTO
* @return
*/
public PageResult conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
PageHelper.startPage(ordersPageQueryDTO.getPage(), ordersPageQueryDTO.getPageSize());
Page<Orders> page = orderMapper.pageQuery(ordersPageQueryDTO);
// 部分訂單狀態(tài),需要額外返回訂單菜品信息,將Orders轉(zhuǎn)化為OrderVO
List<OrderVO> orderVOList = getOrderVOList(page);
return new PageResult(page.getTotal(), orderVOList);
}
private List<OrderVO> getOrderVOList(Page<Orders> page) {
// 需要返回訂單菜品信息,自定義OrderVO響應(yīng)結(jié)果
List<OrderVO> orderVOList = new ArrayList<>();
List<Orders> ordersList = page.getResult();
if (!CollectionUtils.isEmpty(ordersList)) {
for (Orders orders : ordersList) {
// 將共同字段復(fù)制到OrderVO
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(orders, orderVO);
String orderDishes = getOrderDishesStr(orders);
// 將訂單菜品信息封裝到orderVO中,并添加到orderVOList
orderVO.setOrderDishes(orderDishes);
orderVOList.add(orderVO);
}
}
return orderVOList;
}
/**
* 根據(jù)訂單id獲取菜品信息字符串
*
* @param orders
* @return
*/
private String getOrderDishesStr(Orders orders) {
// 查詢(xún)訂單菜品詳情信息(訂單中的菜品和數(shù)量)
List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());
// 將每一條訂單菜品信息拼接為字符串(格式:宮保雞丁*3;)
List<String> orderDishList = orderDetailList.stream().map(x -> {
String orderDish = x.getName() + "*" + x.getNumber() + ";";
return orderDish;
}).collect(Collectors.toList());
// 將該訂單對(duì)應(yīng)的所有菜品信息拼接在一起
return String.join("", orderDishList);
}
Mapper層中
無(wú)新東西
訂單搜索——功能測(cè)試
各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)——需求分析和設(shè)計(jì)
產(chǎn)品原型
接口設(shè)計(jì)?
?
各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)——代碼開(kāi)發(fā)
Controller層中
/**
* 各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)
*
* @return
*/
@GetMapping("/statistics")
@ApiOperation("各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)")
public Result<OrderStatisticsVO> statistics() {
OrderStatisticsVO orderStatisticsVO = orderService.statistics();
return Result.success(orderStatisticsVO);
}
Service層中
/**
* 各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)
*
* @return
*/
public OrderStatisticsVO statistics() {
// 根據(jù)狀態(tài),分別查詢(xún)出待接單、待派送、派送中的訂單數(shù)量
Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED);
Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED);
Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS);
// 將查詢(xún)出的數(shù)據(jù)封裝到orderStatisticsVO中響應(yīng)
OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO();
orderStatisticsVO.setToBeConfirmed(toBeConfirmed);
orderStatisticsVO.setConfirmed(confirmed);
orderStatisticsVO.setDeliveryInProgress(deliveryInProgress);
return orderStatisticsVO;
}
Mapper層中
/**
* 根據(jù)狀態(tài)統(tǒng)計(jì)訂單數(shù)量
* @param status
*/
@Select("select count(id) from orders where status = #{status}")
Integer countStatus(Integer status);
各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)——功能測(cè)試
成功顯示
?
查詢(xún)訂單詳情——需求分析和設(shè)計(jì)
產(chǎn)品原型
業(yè)務(wù)規(guī)則
-
訂單詳情頁(yè)面需要展示訂單基本信息(狀態(tài)、訂單號(hào)、下單時(shí)間、收貨人、電話(huà)、收貨地址、金額等)
-
訂單詳情頁(yè)面需要展示訂單明細(xì)數(shù)據(jù)(商品名稱(chēng)、數(shù)量、單價(jià))
接口設(shè)計(jì)
?
?
查詢(xún)訂單詳情——代碼開(kāi)發(fā)
Controller中
/**
* 訂單詳情
*
* @param id
* @return
*/
@GetMapping("/details/{id}")
@ApiOperation("查詢(xún)訂單詳情")
public Result<OrderVO> details(@PathVariable("id") Long id) {
OrderVO orderVO = orderService.details(id);
return Result.success(orderVO);
}
Service中
前面,寫(xiě)好了已經(jīng)
Mapper中?
前面,寫(xiě)好了已經(jīng)
查詢(xún)訂單詳情——功能測(cè)試
?接單——需求分析與設(shè)計(jì)
產(chǎn)品原型
?
?
業(yè)務(wù)規(guī)則
-
商家接單其實(shí)就是將訂單的狀態(tài)修改為“已接單”
接口設(shè)計(jì)
?
接單——代碼開(kāi)發(fā)
Controller中
/**
* 接單
*
* @return
*/
@PutMapping("/confirm")
@ApiOperation("接單")
public Result confirm(@RequestBody OrdersConfirmDTO ordersConfirmDTO) {
orderService.confirm(ordersConfirmDTO);
return Result.success();
}
Service中
/**
* 接單
*
* @param ordersConfirmDTO
*/
public void confirm(OrdersConfirmDTO ordersConfirmDTO) {
Orders orders = Orders.builder()
.id(ordersConfirmDTO.getId())
.status(Orders.CONFIRMED)
.build();
orderMapper.update(orders);
}
Mapper中
前面已經(jīng)寫(xiě)好了
接單——功能測(cè)試
接單后成功修改狀態(tài)。
?
拒單——需求分析和設(shè)計(jì)
產(chǎn)品原型
?
?
業(yè)務(wù)規(guī)則
-
商家拒單其實(shí)就是將訂單狀態(tài)修改為“已取消”
-
只有訂單處于“待接單”狀態(tài)時(shí)可以執(zhí)行拒單操作
-
商家拒單時(shí)需要指定拒單原因
-
商家拒單時(shí),如果用戶(hù)已經(jīng)完成了支付,需要為用戶(hù)退款
接口設(shè)計(jì)
?
拒單——代碼開(kāi)發(fā)
Controller中
/**
* 拒單
*
* @return
*/
@PutMapping("/rejection")
@ApiOperation("拒單")
public Result rejection(@RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception {
orderService.rejection(ordersRejectionDTO);
return Result.success();
}
Service中
/**
* 拒單
*
* @param ordersRejectionDTO
*/
public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception {
// 根據(jù)id查詢(xún)訂單
Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());
// 訂單只有存在且狀態(tài)為2(待接單)才可以拒單
if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
//支付狀態(tài)
Integer payStatus = ordersDB.getPayStatus();
if (payStatus == Orders.PAID) {
//用戶(hù)已支付,需要退款
String refund = weChatPayUtil.refund(
ordersDB.getNumber(),
ordersDB.getNumber(),
new BigDecimal(0.01),
new BigDecimal(0.01));
log.info("申請(qǐng)退款:{}", refund);
}
// 拒單需要退款,根據(jù)訂單id更新訂單狀態(tài)、拒單原因、取消時(shí)間
Orders orders = new Orders();
orders.setId(ordersDB.getId());
orders.setStatus(Orders.CANCELLED);
orders.setRejectionReason(ordersRejectionDTO.getRejectionReason());
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
Mapper中
前面寫(xiě)好的直接使用
拒單——功能測(cè)試
成功拒單
取消訂單——需求分析和設(shè)計(jì)
產(chǎn)品原型
業(yè)務(wù)規(guī)則
-
取消訂單其實(shí)就是將訂單狀態(tài)修改為“已取消”
-
商家取消訂單時(shí)需要指定取消原因
-
商家取消訂單時(shí),如果用戶(hù)已經(jīng)完成了支付,需要為用戶(hù)退款
接口設(shè)計(jì)
?
取消訂單——代碼開(kāi)發(fā)
Controller中
/**
* 取消訂單
*
* @return
*/
@PutMapping("/cancel")
@ApiOperation("取消訂單")
public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {
orderService.cancel(ordersCancelDTO);
return Result.success();
}
Service中
/**
* 取消訂單
*
* @param ordersCancelDTO
*/
public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
// 根據(jù)id查詢(xún)訂單
Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());
//支付狀態(tài)
Integer payStatus = ordersDB.getPayStatus();
if (payStatus == 1) {
//用戶(hù)已支付,需要退款
String refund = weChatPayUtil.refund(
ordersDB.getNumber(),
ordersDB.getNumber(),
new BigDecimal(0.01),
new BigDecimal(0.01));
log.info("申請(qǐng)退款:{}", refund);
}
// 管理端取消訂單需要退款,根據(jù)訂單id更新訂單狀態(tài)、取消原因、取消時(shí)間
Orders orders = new Orders();
orders.setId(ordersCancelDTO.getId());
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason(ordersCancelDTO.getCancelReason());
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
Mapper中
用前面寫(xiě)好的的實(shí)現(xiàn)
取消訂單——功能測(cè)試
成功取消
派送訂單——需求分析和設(shè)計(jì)
產(chǎn)品原型
?
業(yè)務(wù)規(guī)則
-
派送訂單其實(shí)就是將訂單狀態(tài)修改為“派送中”
-
只有狀態(tài)為“待派送”的訂單可以執(zhí)行派送訂單操作
接口設(shè)計(jì)
?
派送訂單——代碼開(kāi)發(fā)
Controller中
/**
* 派送訂單
*
* @return
*/
@PutMapping("/delivery/{id}")
@ApiOperation("派送訂單")
public Result delivery(@PathVariable("id") Long id) {
orderService.delivery(id);
return Result.success();
}
Service中
/**
* 派送訂單
*
* @param id
*/
public void delivery(Long id) {
// 根據(jù)id查詢(xún)訂單
Orders ordersDB = orderMapper.getById(id);
// 校驗(yàn)訂單是否存在,并且狀態(tài)為3
if (ordersDB == null || !ordersDB.getStatus().equals(Orders.CONFIRMED)) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
// 更新訂單狀態(tài),狀態(tài)轉(zhuǎn)為派送中
orders.setStatus(Orders.DELIVERY_IN_PROGRESS);
orderMapper.update(orders);
}
Mapper中
使用前面寫(xiě)好的
派送訂單——功能測(cè)試
?
完成訂單——需求分析和設(shè)計(jì)
產(chǎn)品原型
?
業(yè)務(wù)規(guī)則
-
完成訂單其實(shí)就是將訂單狀態(tài)修改為“已完成”
-
只有狀態(tài)為“派送中”的訂單可以執(zhí)行訂單完成操作
接口設(shè)計(jì)
?
完成訂單——代碼開(kāi)發(fā)
Controller中
/**
* 完成訂單
*
* @return
*/
@PutMapping("/complete/{id}")
@ApiOperation("完成訂單")
public Result complete(@PathVariable("id") Long id) {
orderService.complete(id);
return Result.success();
}
Service中
/**
* 完成訂單
*
* @param id
*/
public void complete(Long id) {
// 根據(jù)id查詢(xún)訂單
Orders ordersDB = orderMapper.getById(id);
// 校驗(yàn)訂單是否存在,并且狀態(tài)為4
if (ordersDB == null || !ordersDB.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
// 更新訂單狀態(tài),狀態(tài)轉(zhuǎn)為完成
orders.setStatus(Orders.COMPLETED);
orders.setDeliveryTime(LocalDateTime.now());
orderMapper.update(orders);
}
Mapper中
使用前面寫(xiě)好的
完成訂單——功能測(cè)試
?
校驗(yàn)收貨地址是否超出配送范圍
1. 環(huán)境準(zhǔn)備
注冊(cè)賬號(hào):百度地圖開(kāi)放平臺(tái) | 百度地圖API SDK | 地圖開(kāi)發(fā)
登錄百度地圖開(kāi)放平臺(tái):百度地圖開(kāi)放平臺(tái) | 百度地圖API SDK | 地圖開(kāi)發(fā)
進(jìn)入控制臺(tái),創(chuàng)建應(yīng)用,獲取AK:
?
相關(guān)接口:
逆地理編碼 gc | 百度地圖API SDK
webapi | 百度地圖API SDK
?
2. 代碼開(kāi)發(fā)
2.1 application.yml
配置外賣(mài)商家店鋪地址和百度地圖的AK:
?
2.2 OrderServiceImpl
改造OrderServiceImpl,注入上面的配置項(xiàng):
@Value("${sky.shop.address}")
private String shopAddress;
@Value("${sky.baidu.ak}")
private String ak;
在OrderServiceImpl中提供校驗(yàn)方法:
/**
* 檢查客戶(hù)的收貨地址是否超出配送范圍
* @param address
*/
private void checkOutOfRange(String address) {
Map map = new HashMap();
map.put("address",shopAddress);
map.put("output","json");
map.put("ak",ak);
//獲取店鋪的經(jīng)緯度坐標(biāo)
String shopCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);
JSONObject jsonObject = JSON.parseObject(shopCoordinate);
if(!jsonObject.getString("status").equals("0")){
throw new OrderBusinessException("店鋪地址解析失敗");
}
//數(shù)據(jù)解析
JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
String lat = location.getString("lat");
String lng = location.getString("lng");
//店鋪經(jīng)緯度坐標(biāo)
String shopLngLat = lat + "," + lng;
map.put("address",address);
//獲取用戶(hù)收貨地址的經(jīng)緯度坐標(biāo)
String userCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);
jsonObject = JSON.parseObject(userCoordinate);
if(!jsonObject.getString("status").equals("0")){
throw new OrderBusinessException("收貨地址解析失敗");
}
//數(shù)據(jù)解析
location = jsonObject.getJSONObject("result").getJSONObject("location");
lat = location.getString("lat");
lng = location.getString("lng");
//用戶(hù)收貨地址經(jīng)緯度坐標(biāo)
String userLngLat = lat + "," + lng;
map.put("origin",shopLngLat);
map.put("destination",userLngLat);
map.put("steps_info","0");
//路線規(guī)劃
String json = HttpClientUtil.doGet("https://api.map.baidu.com/directionlite/v1/driving", map);
jsonObject = JSON.parseObject(json);
if(!jsonObject.getString("status").equals("0")){
throw new OrderBusinessException("配送路線規(guī)劃失敗");
}
//數(shù)據(jù)解析
JSONObject result = jsonObject.getJSONObject("result");
JSONArray jsonArray = (JSONArray) result.get("routes");
Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance");
if(distance > 5000){
//配送距離超過(guò)5000米
throw new OrderBusinessException("超出配送范圍");
}
}
在OrderServiceImpl的submitOrder方法中調(diào)用上面的校驗(yàn)方法:
?功能測(cè)試
距離過(guò)大直接報(bào)錯(cuò),并且會(huì)卡在這個(gè)頁(yè)面?
?
距離近時(shí)可以直接進(jìn)入支付頁(yè)面?
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-618578.html
?
到了這里,關(guān)于蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!