国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端)

這篇具有很好參考價(jià)值的文章主要介紹了蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

查詢(xún)歷史訂單——需求分析與設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?業(yè)務(wù)規(guī)則

  • 分頁(yè)查詢(xún)歷史訂單

  • 可以根據(jù)訂單狀態(tài)查詢(xún)

  • 展示訂單數(shù)據(jù)時(shí),需要展示的數(shù)據(jù)包括:下單時(shí)間、訂單狀態(tài)、訂單金額、訂單明細(xì)(商品名稱(chēng)、圖片)

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

查詢(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 &gt;= #{beginTime}
            </if>
            <if test="endTime != null">
                and order_time &lt;= #{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ú)誤

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?查詢(xún)訂單詳情——需求分析與設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?查詢(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è)試

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?取消訂單——需求分析與設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?業(yè)務(wù)規(guī)則

  • 待支付和待接單狀態(tài)下,用戶(hù)可直接取消訂單

  • 商家已接單狀態(tài)下,用戶(hù)取消訂單需電話(huà)溝通商家

  • 派送中狀態(tài)下,用戶(hù)取消訂單需電話(huà)溝通商家

  • 如果在待接單狀態(tài)下取消訂單,需要給用戶(hù)退款

  • 取消訂單后需要將訂單狀態(tài)修改為“已取消”

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?取消訂單——代碼開(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è)試。

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?再來(lái)一單——需求分析與設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?業(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)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

業(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ì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

訂單搜索——代碼開(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è)試

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

各個(gè)狀態(tài)的訂單數(shù)量統(tǒng)計(jì)——需求分析和設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

接口設(shè)計(jì)?

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

各個(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è)試

成功顯示

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

查詢(xún)訂單詳情——需求分析和設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

業(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è)試

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?接單——需求分析與設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

業(yè)務(wù)規(guī)則

  • 商家接單其實(shí)就是將訂單的狀態(tài)修改為“已接單”

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

接單——代碼開(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)。

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

拒單——需求分析和設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

業(yè)務(wù)規(guī)則

  • 商家拒單其實(shí)就是將訂單狀態(tài)修改為“已取消”

  • 只有訂單處于“待接單”狀態(tài)時(shí)可以執(zhí)行拒單操作

  • 商家拒單時(shí)需要指定拒單原因

  • 商家拒單時(shí),如果用戶(hù)已經(jīng)完成了支付,需要為用戶(hù)退款

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

拒單——代碼開(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)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

業(yè)務(wù)規(guī)則

  • 取消訂單其實(shí)就是將訂單狀態(tài)修改為“已取消”

  • 商家取消訂單時(shí)需要指定取消原因

  • 商家取消訂單時(shí),如果用戶(hù)已經(jīng)完成了支付,需要為用戶(hù)退款

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

取消訂單——代碼開(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)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

業(yè)務(wù)規(guī)則

  • 派送訂單其實(shí)就是將訂單狀態(tài)修改為“派送中”

  • 只有狀態(tài)為“待派送”的訂單可以執(zhí)行派送訂單操作

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

派送訂單——代碼開(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è)試

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

完成訂單——需求分析和設(shè)計(jì)

產(chǎn)品原型

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

業(yè)務(wù)規(guī)則

  • 完成訂單其實(shí)就是將訂單狀態(tài)修改為“已完成”

  • 只有狀態(tài)為“派送中”的訂單可以執(zhí)行訂單完成操作

接口設(shè)計(jì)

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot?

完成訂單——代碼開(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è)試

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

校驗(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:

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot?

相關(guān)接口:

逆地理編碼 gc | 百度地圖API SDK

webapi | 百度地圖API SDK

?

2. 代碼開(kāi)發(fā)

2.1 application.yml

配置外賣(mài)商家店鋪地址和百度地圖的AK:

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?

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)方法:

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

?功能測(cè)試

距離過(guò)大直接報(bào)錯(cuò),并且會(huì)卡在這個(gè)頁(yè)面?

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot?

距離近時(shí)可以直接進(jìn)入支付頁(yè)面?

蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端),SpringBoot,微信,spring boot?

?

到了這里,關(guān)于蒼穹外賣(mài)day09——?dú)v史訂單模塊(用戶(hù)端)+訂單管理模塊(管理端)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序---- 外賣(mài)小程序查看實(shí)時(shí)地圖路線(騎手端&用戶(hù)端)【高德地圖】

    微信小程序---- 外賣(mài)小程序查看實(shí)時(shí)地圖路線(騎手端&用戶(hù)端)【高德地圖】

    前言:1. 在小程序中需要使用map組件,文檔鏈接:https://developers.weixin.qq.com/miniprogram/dev/component/map.html 2.使用的是高德地圖,所以需要引進(jìn)相關(guān)的js,下載鏈接:https://lbs.amap.com/api/wx/download 3.去往高德官方申請(qǐng)需要用的key,操作鏈接:https://lbs.amap.com/api/wx/guide/create-project/get-key

    2024年02月16日
    瀏覽(95)
  • 蒼穹外賣(mài)day11筆記

    蒼穹外賣(mài)day11筆記

    今日首先介紹前端技術(shù)Apache ECharts,說(shuō)明后端需要準(zhǔn)備的數(shù)據(jù),然后講解具體統(tǒng)計(jì)功能的實(shí)現(xiàn),包括營(yíng)業(yè)額統(tǒng)計(jì)、用戶(hù)統(tǒng)計(jì)、訂單統(tǒng)計(jì)、銷(xiāo)量排名。 ECharts是一款基于 Javascript 的數(shù)據(jù)可視化圖表庫(kù)。我們用它來(lái)展示圖表數(shù)據(jù)。 步驟 1). 引入echarts.js 文件 2). 為 ECharts 準(zhǔn)備一個(gè)設(shè)

    2024年02月13日
    瀏覽(25)
  • 蒼穹外賣(mài)day02項(xiàng)目日志

    蒼穹外賣(mài)day02項(xiàng)目日志

    參考產(chǎn)品原型,設(shè)計(jì)表和接口。 1.1.1設(shè)計(jì)表 看員工管理的產(chǎn)品原型: 有員工姓名、賬號(hào)、手機(jī)號(hào)、賬號(hào)狀態(tài)、最后操作時(shí)間等。 注意,操作一欄不是字段,其中的啟用禁用才是。 再看添加員工的原型: ?可以發(fā)現(xiàn)還有性別和身份證號(hào)。 不要忘了旁邊: 還有密碼。 總結(jié)出了

    2024年02月14日
    瀏覽(27)
  • 項(xiàng)目實(shí)戰(zhàn)————蒼穹外賣(mài)(DAY11)

    項(xiàng)目實(shí)戰(zhàn)————蒼穹外賣(mài)(DAY11)

    Apache ECharts 營(yíng)業(yè)額統(tǒng)計(jì) 用戶(hù)統(tǒng)計(jì) 訂單統(tǒng)計(jì) 銷(xiāo)量排名Top10 功能實(shí)現(xiàn): 數(shù)據(jù)統(tǒng)計(jì) 數(shù)據(jù)統(tǒng)計(jì)效果圖: 1.1 介紹 Apache ECharts 是一款基于 Javascript 的數(shù)據(jù)可視化圖表庫(kù),提供直觀,生動(dòng),可交互,可個(gè)性化定制的數(shù)據(jù)可視化圖表。 官網(wǎng)地址:Apache ECharts 常見(jiàn)效果展示: 1). 柱形圖

    2024年01月20日
    瀏覽(25)
  • 黑馬蒼穹外賣(mài)學(xué)習(xí)Day12

    黑馬蒼穹外賣(mài)學(xué)習(xí)Day12

    結(jié)果 Controller層 Service實(shí)現(xiàn)類(lèi)

    2024年01月25日
    瀏覽(18)
  • 蒼穹外賣(mài) day1 搭建成功環(huán)境

    蒼穹外賣(mài) day1 搭建成功環(huán)境

    idea找不到打包生成的文件目錄怎么辦,首先點(diǎn)擊這個(gè)小齒輪 然后就能找到隱藏的文件 這個(gè)jar包內(nèi)含tomcat,可以直接丟在linux上用 開(kāi)發(fā)環(huán)境:開(kāi)發(fā)人員在開(kāi)發(fā)階段使用的環(huán)境,一般外部用戶(hù)無(wú)法訪問(wèn) 測(cè)試環(huán)境:專(zhuān)門(mén)給測(cè)試人員使用的環(huán)境,測(cè)試項(xiàng)目用 生產(chǎn)環(huán)境:正式對(duì)外提

    2024年02月11日
    瀏覽(34)
  • 【學(xué)習(xí)筆記】java項(xiàng)目—蒼穹外賣(mài)day11

    【學(xué)習(xí)筆記】java項(xiàng)目—蒼穹外賣(mài)day11

    Apache ECharts 營(yíng)業(yè)額統(tǒng)計(jì) 用戶(hù)統(tǒng)計(jì) 訂單統(tǒng)計(jì) 銷(xiāo)量排名Top10 功能實(shí)現(xiàn): 數(shù)據(jù)統(tǒng)計(jì) 數(shù)據(jù)統(tǒng)計(jì)效果圖: 1.1 介紹 Apache ECharts 是一款基于 Javascript 的數(shù)據(jù)可視化圖表庫(kù),提供直觀,生動(dòng),可交互,可個(gè)性化定制的數(shù)據(jù)可視化圖表。 官網(wǎng)地址:https://echarts.apache.org/zh/index.html 常見(jiàn)效果

    2024年04月09日
    瀏覽(29)
  • 蒼穹外賣(mài)-day14:前端環(huán)境搭建、員工管理

    蒼穹外賣(mài)-day14:前端環(huán)境搭建、員工管理

    前端環(huán)境搭建 員工分頁(yè)查詢(xún) 啟用禁用員工賬號(hào) 新增員工 修改員工 1.1 技術(shù)選型 本項(xiàng)目使用到的前端技術(shù)如下: node.js vue ElementUI axios vuex vue-router typescript 1.2 熟悉前端代碼結(jié)構(gòu) 直接導(dǎo)入課程資料中提供的蒼穹外賣(mài)項(xiàng)目前端初始工程,此工程中已經(jīng)開(kāi)發(fā)了部分功能,后續(xù)我們

    2024年04月28日
    瀏覽(24)
  • 蒼穹外賣(mài) day2 反向代理和負(fù)載均衡

    蒼穹外賣(mài) day2 反向代理和負(fù)載均衡

    前端請(qǐng)求地址:http://localhost/api/employee/login 路徑并不匹配 后端接口地址:http://localhost:8080/admin/employee/login 在這個(gè)頁(yè)面上點(diǎn)擊f12 后轉(zhuǎn)到networ驗(yàn)證,出現(xiàn)一些詳細(xì)的地址信息 原因就是nginx的反向代理,將前端數(shù)據(jù)轉(zhuǎn)發(fā)到了后端 相當(dāng)于轉(zhuǎn)發(fā)一次請(qǐng)求 優(yōu)點(diǎn): 提高訪問(wèn)速度,相當(dāng)于

    2024年02月12日
    瀏覽(31)
  • 蒼穹外賣(mài)day07——緩存菜品套餐+購(gòu)物車(chē)功能實(shí)現(xiàn)

    蒼穹外賣(mài)day07——緩存菜品套餐+購(gòu)物車(chē)功能實(shí)現(xiàn)

    用戶(hù)訪問(wèn)量過(guò)大帶來(lái)的一個(gè)直接效果就是響應(yīng)速度慢,使用體驗(yàn)下降。 使用redis緩存菜品數(shù)據(jù),減少數(shù)據(jù)庫(kù)查詢(xún)操作。 ?頁(yè)面展示上基本就是同一個(gè)分類(lèi)在同一頁(yè),所以key-value結(jié)構(gòu)可以使用不同的分類(lèi)來(lái)做key。 在小程序每一次點(diǎn)擊不同的分類(lèi),后端哪里都會(huì)刷刷刷的連接數(shù)據(jù)

    2024年02月14日
    瀏覽(34)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包