首页 > 试题广场 >

1. 货拉拉有下单砸金蛋的活动,每个用户(user

[问答题]

1. 货拉拉有下单砸金蛋的活动,每个用户(user)下装修订单的金额达到n就可以获得三只金蛋(age),砸金蛋得奖励,同时获得与订单金额等额的积分(point)。 请设计一套java接口并实现下单(order)逻辑。 参考(但不局限于)下面的下单逻辑: 

1) 创建订单 

2) 扣减金蛋库存

3) 增加用户积分 

4) 下单成功 

同时请回答: 

1) 数据库表结构如何设计,有哪些表,分别有什么作用? 

2) 下单过程中哪些地方可能成为瓶颈?如何解决或改善? 

3) 是否会用到数据库事务,哪些地方会用到?如果不用数据库事务,如何保证数据的一致性?

用户表userinfo,订单表orderinfo,积分表pointinfo,金蛋表egginfo, userinfo: 用户的基本信息,比如手机号,姓名,账号状态等 orderinfo: 用户id,下单的内容,下单金额,单的状态,比如是否被接单,是否支付 pointinfo: 用户id,积分 egginfo: 用户id,金蛋状态 先插入订单表,得到订单id是orderid, 如果金额达到n,就在事务里面用乐观所扣除3个金蛋数目,批量写入3条记录到egginfo,, 添加积分就异步了,不在事务中同步执行
发表于 2021-05-13 07:53:56 回复(0)
class User{ //用户实体
private String userId;//用户id
private int point ;//用户积分
//....用户信息等字段//
//setter
//getter 
}
 
class Order{//订单实体
    private String orderId;//订单编号
    private String userNumber;//下单用户id
    private double orderAmmount; //订单金额
    //....其他订单信息//
    //setter
    //getter
}
 
class Egg{//金蛋库存实体
    private String eggId;//金蛋编号
    private String userNumber;//金蛋所属用户
    private String orderNumber;//金蛋所属订单编号
    private int eggState;//金蛋状态,是否分法给用户
    private int eggPoint;//排序字段
    private String award;//金蛋奖励
}
 
//下单服务
@Service
class OrderService{
    private OrderDao orderDao;
    private EggDao eggDao;
    private UserDao userDao;
    public boolean takeOrder(String userId,String ammount){
        //创建订单
        Order order = new Order();
        order.setOrderId(uuid);
        order.setUserNumber(userId);
        order.setOrderAmmount(ammount);
        int result = orderDao.insert(order);
        if(result != -1){//创建成功
            if(ammount>n){
                List<Egg> eggList = eggDao.getThreeEggIfEnabled();
                if(eggList.size()>=3){//如果库存足够分配则分配三个金蛋给用户 
                    for(Egg e:eggList){
                        e.setUserNumber(userId);
                    }
                    eggDao.batchInsert(eggList);
                }else{
                    throw new Exception("您来晚了,金蛋库存不足!");
                }
            }
            return true;
        }
        return false;//下单失败
    }
     
     
    private boolean OpenEgg(String userId,String eggId){
        Egg egg = eggDao.selectById(eggId,userId);//userId验证金蛋是否属于该用户
        if(egg != null){
            User user = UserDao.selectById(userId);
            boolean pointSuccessAdd =  user.setPoint(user.getPoint+egg.getPint);
            //boolean awardSuccessAdd = egg.getAward();//奖励返回
            if(pointSuccessAdd && awardSuccessAdd){
                egg.setEggState(0);//设置金蛋状态失效
                return true;//成功开启金丹并获得奖励
            }else{
                return false;
            }
        }else{
            return false;//该用户没有该金蛋,开启失败
        }
    }
}
 
数据库表设计:用户表(user),订单表(order),金蛋库存表(egg)字段同以上实体类一致
 
金蛋分配会限制用户下单等待时间,将金蛋分配功能剥离出来,延后处理
 
乐观锁
发表于 2020-07-08 12:53:04 回复(0)
1.数据库表:用户表,订单表,金蛋表,奖励表
用户表:实现登录用户的功能
订单表:记录用户的订单,以及用户下单的金额是否达到规定金额,如果达到,给个字段标注该订单达到规定
金蛋表:给达到规定金额的订单,生成3个金蛋,给个状态,来标注金蛋是否砸开
奖励表:根据金蛋表的id,来写入砸开金蛋的奖励

2.下单过程中,多线程是一个问题

3.
发表于 2019-10-30 09:20:48 回复(0)
答:用户表userInfo,金蛋表ageInfo,用户积分表point,用户获取的金蛋表user_age

瓶颈:

3.会用到事务,下单过程中,当金蛋减少后,对应的订单表中要新增一条数据,并且用的积分也要相应的变化,如果不用数据库事务,可以用框架的事务来处理,或是通过代码来实现,例如,当金蛋减少后,返回成功后,在去实现下一步
发表于 2019-10-25 15:56:12 回复(0)