1.问题描述

在测试的过程中,前期的偷懒会被无线的放大,有bug的时候,前期偷懒复制粘贴懒得封装,出了问题,要改很多地方,拿我手上这个项目就是,有美食,商城,酒店,多平台结合,在生成订单的时候不应该在各自的serviceImpl里面去对订单初始化的,应该直接就把初始化这部分也定义到orderServiceImpl的insert里面去

//预定酒店
    @Override
    public int reserve(Long roomId, Long userId) {
        HotelRoom hotelRoom=hotelRoomMapper.selectHotelRoomById(roomId);
        //获取商家id
        Long merchantId=hotelMapper.selectHotelById(hotelRoom.getHotelId()).getMerchantId();

        //创建订单
        Order order=new Order();
        order.setType("hotel");
        //生成订单号
        String orderNo = "ORD-" + System.currentTimeMillis() + "-" + userId;
        order.setOrderNo(orderNo);
        order.setStatus(Order.STATUS_UNPAID);//待支付
        order.setRoomId(roomId);
        order.setUserId(userId);
        order.setMerchantId(merchantId);
        //查询用户会员等级
        MemberShip memberShip=memberShipMapper.getMemberShipByUserId(userId);
        Long level=memberShip.getMemberLevel();
        //根据酒店价格查询最低会员等级
        Long minLevel= Long.valueOf(memberLevelRuleService.calculateMemberLevel(hotelRoom.getPrice()));
        if (level >= minLevel) {//if用户等级>=calculateMemberLevel,订单押金0.99
            order.setDeposit(BigDecimal.valueOf(0.99));
            //使用会员首单折扣
            if(!memberShip.getIsUse()){
                int percent=memberLevelRuleService.selectMemberLevelRuleByLevel(level).getPercent();
                order.setPrice(hotelRoom.getPrice().multiply(BigDecimal.valueOf(percent)));
                memberShip.setIsUse(true);
            }
            //更新会员表
            memberShipMapper.updateMemberShip(memberShip);
        }
        order.setPrice(hotelRoom.getPrice());
        return orderService.insertOrder(order);

    }

因为来自不同平台的订单初始化的内容有小部分不同,当时也没站在那么高的高度去看,而是写了这个就不管了,等到后面发现其他平台也有一套订单流程,我直接复制粘贴了,实际上,关于前面

  //创建订单
        Order order=new Order();
        order.setType("hotel");
        //生成订单号
        String orderNo = "ORD-" + System.currentTimeMillis() + "-" + userId;
        order.setOrderNo(orderNo);
        order.setStatus(Order.STATUS_UNPAID);//待支付
        order.setRoomId(roomId);
        order.setUserId(userId);
        order.setMerchantId(merchantId);

这种初始化操作应该写到insertOrder里面去的,然后给insertOrder多加一个参数type

insertOrder(order,type)

然后里面把共同操作比如生成订单号放外面,其他不一样的操作在共同操作之前进行switch分别操作

2.总结

尽量的解耦,不要把订单相关的操作放在别的service层,hotelserviceImpl应该专注的做酒店的业务,而不是参杂了一些orderservice该做的事