<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 數據庫設計 ![](https://box.kancloud.cn/a1ed19f8a3cbc7aaffd1fc0f8565d4ca_615x635.png) 包括訂單主表、訂單信息表、商品信息表、商品類型表 # 服務環境設計 ![](https://box.kancloud.cn/b3f49a47a44fcdf30e93af9e56ff1543_1752x900.png) # Dao設計 以訂單接口為例 訂單dao層示例 ~~~ public interface OrderDetailRepository extends JpaRepository<OrderDetail, String>{ List<OrderDetail> findByOrderId(String orderId); } ~~~ 訂餐實現層示例 ~~~ public interface OrderService { //創建訂單 OrderDTO create(OrderDTO orderDTO); //查詢單個訂單詳情 OrderDTO findOne(String orderId); //查詢訂單總列表(買家用) Page<OrderDTO> findList(String buyerOpenid, Pageable pageable); //取消訂單 OrderDTO cancel(OrderDTO orderDTO); //完結訂單 OrderDTO finish(OrderDTO orderDTO); //支付訂單 OrderDTO paid(OrderDTO orderDTO); //查詢訂單列表(賣家管理系統用的) Page<OrderDTO> findList(Pageable pageable); } ~~~ 實現層細節: ~~~ @Service @Slf4j public class OrderServiceImpl implements OrderService { @Autowired private ProductService productService; @Autowired private OrderDetailRepository orderDetailRepository; @Autowired private OrderMasterRepository orderMasterRepository; @Autowired private PayService payService; @Autowired private WebSocket webSocket; @Override @Transactional//事務管理,一旦失敗就回滾 public OrderDTO create(OrderDTO orderDTO) { //設置下訂單id(是個隨機,這里調用了根據時間產生6位隨機數的方法) String orderId = KeyUtil.genUniqueKey(); //給總價賦值 BigDecimal orderAmount = new BigDecimal(BigInteger.ZERO); //List<CartDTO> cartDTOList = new ArrayList<>(); //1.查詢商品(數量,價格) for (OrderDetail orderDetail : orderDTO.getOrderDetailList()){ ProductInfo productInfo = productService.findOne(orderDetail.getProductId()); if(productInfo == null){ throw new SellException(ResultEnum.PRODUCT_NOT_EXIST); } //2.計算總價=單價*數量+orderAmount orderAmount = productInfo.getProductPrice() .multiply(new BigDecimal(orderDetail.getProductQuantity())) .add(orderAmount); //3.訂單詳情入庫(OrderMaster和orderDetail) //利用BeanUtils方法把前端查找出來的productInfo商品信息復制給訂單詳情 BeanUtils.copyProperties(productInfo, orderDetail);//先復制,再賦值 orderDetail.setDetailId(KeyUtil.genUniqueKey()); orderDetail.setOrderId(orderId); orderDetailRepository.save(orderDetail); /* CartDTO cartDTO = new CartDTO(orderDetail.getProductId(), orderDetail.getProductQuantity()); cartDTOList.add(cartDTO);*/ } //3.訂單總表入庫(OrderMaster和orderDetail) OrderMaster orderMaster = new OrderMaster(); orderDTO.setOrderId(orderId); BeanUtils.copyProperties(orderDTO, orderMaster); orderMaster.setOrderAmount(orderAmount);//是一個整個訂單的總價,所以在foe循環之外設置 orderMaster.setOrderStatus(OrderStatusEnum.New.getCode()); orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode()); orderMasterRepository.save(orderMaster); //4.扣庫存 List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream().map(e -> new CartDTO(e.getProductId(), e.getProductQuantity()) ).collect(Collectors.toList()); productService.decreaseStock(cartDTOList); //發送websocket消息 webSocket.sendMessage(orderDTO.getOrderId()); return orderDTO; } ~~~ # 控制層示例 ~~~ @RestController @RequestMapping("/buyer/order") @Slf4j public class BuyerOrderController { @Autowired private OrderService orderService; @Autowired private BuyerService buyerService; //創建訂單 @PostMapping(value = "/create") public ResultVO<Map<String, String>> creat(@Valid OrderForm orderForm, BindingResult bindingResult){ if(bindingResult.hasErrors()){ log.error("【創建訂單】 參數不正確, orderForm={}", orderForm); throw new SellException(ResultEnum.PARAM_ERROR.getCode(), bindingResult.getFieldError().getDefaultMessage()); } OrderDTO orderDTO = OrderFormZOrderDTOConverter.convert(orderForm); if(CollectionUtils.isEmpty(orderDTO.getOrderDetailList())){ log.error("【創建訂單】 購物車不能為空"); throw new SellException(ResultEnum.CART_EMPTY); } OrderDTO createResult = orderService.create(orderDTO); Map<String, String> map = new HashMap<>(); map.put("orderId", createResult.getOrderId()); return ResultVOUtil.success(map); } //訂單列表 @GetMapping(value = "/list") public ResultVO<List<OrderDTO>> list(@RequestParam("openid") String openid, @RequestParam(value = "page", defaultValue = "0") Integer page, @RequestParam(value = "size", defaultValue = "10") Integer size){ if(StringUtils.isNullOrEmpty(openid)){ log.error("【查詢訂單列表】 openid為空"); throw new SellException(ResultEnum.PARAM_ERROR); } PageRequest request = new PageRequest(page, size); Page<OrderDTO> orderDTOPage = orderService.findList(openid, request); //只用返回當前頁面的數據集合就行了,因為前端傳過來的就是第幾頁和每一頁的size(一般都會定好) return ResultVOUtil.success(orderDTOPage.getContent()); } //訂單詳情 @GetMapping("/detail") public ResultVO<OrderDTO> detail(@RequestParam("openid") String openid, @RequestParam("orderId") String orderId){ /* //TODO 不安全的做法,改進 OrderDTO orderDTO = orderService.findOne(orderId);*/ OrderDTO orderDTO = buyerService.findOrderOne(openid, orderId); return ResultVOUtil.success(orderDTO); } //取消訂單 @PostMapping("/cancel") public ResultVO cancel(@RequestParam("openid") String openid, @RequestParam("orderId") String orderId){ /* //TODO 不安全的做法,改進 OrderDTO orderDTO = orderService.findOne(orderId); orderService.cancle(orderDTO);*/ buyerService.cancelOrder(openid, orderId); return ResultVOUtil.success(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看