好久好久了 终于基本做完预约单的需求了 总结一下
一:基本逻辑:
1.从有赞收到订单后,根据delivery_start_time判断,如果该字段不为空,则判定为预约单,主表设置其不可派单,设置其expressType=99作为预约单标志
if(addressInfo.getDate("delivery_start_time").toString()!="") {
order.setExpressType(99);
order.setEnableToDispatch(Constrants.enableToDispatch.disable);
//初始化一个预约单对象并赋值,
BookingOrder bookingOrder = new BookingOrder();
bookingOrder.setOrderId(order.getOrderId());
bookingOrder.setEnableToDispatch(0);
bookingOrder.setDeliveryStartTime(addressInfo.getDate("delivery_start_time"));
bookingOrder.setDeliveryEndTime(addressInfo.getDate("delivery_end_time"));
//isUseFul数据是否被处理过,1 未被处理,2 被处理过
bookingOrder.setIsUseFul(1);
//插入到预约单表里
bookingOrderService.insert(bookingOrder);
}
2.如果是预约单,向bookingOrder表里插一条数据,包括订单id,预约开始时间,预约结束时间,是否被处理过isUseFul(默认为未处理1;已处理为2)
3.一个两分钟运行一次的方法,查找bookingOrder表里前20条数据按照预约时间排序,遍历这些数据,查看是否到可派单时间,如果到 则设置其对应的主表的是否可派单改为可派单,并把isUseFul改为2
//每两分钟执行一次变更预约单状态的方法 全局
public void updateBookingOrderStatus(){
Timer timer=new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
bookingOrderService.findBookingOrderNeedDispatchAndDispatch();
}
},0,120000);
4.5秒运行一次的主派单逻辑:派出所有enableToDispatch=1的单
二:订单所有商品被预约的数量
这个方法写的头皮发麻,结果也不是很好,可以优化的地方还有很多,但是能跑就懒得改了(习惯不是很好)
1.根据订单编号查出该订单的所有商品
2.根据商品查出所有符合条件的订单(预约单,待派单,待拣货)包含该商品的数量
3 sum起来
ps:看起来很简单,但是数据表结构有些问题,蛮多东西都不好查,
a.有一个订单表,订单详情表,是一对多的关系,一个订单表对应多个订单详情表(关联订单id),
b.每一个订单详情表,对应订单表的一种商品,
3.也就是一个订单有多少种商品就有多少条与之对应的订单详情表的记录(有点绕)
//根据该订单所有商品已被预约的数量
@Override
public Map<String,String> findCount(String orderId) {
//通过订单id查询订单详情,返回一个订单详情实体的列表
List<OrderDetail> list=orderDetailMapper.getItemsByOrderId(orderId);
List<Long> goodsList =new ArrayList();
List<Order> orderList=new ArrayList();
Map<String ,String > countMap =new HashMap<>();
//遍历这个订单详情实体的列表(这个列表的所有orderId都是相同的),获得该订单的所有商品
for(OrderDetail orderDetail:list) {
//获得该订单的所有商品id
Long item_id = orderDetail.getItem_id();
goodsList.add(item_id);
}
//遍历商品列表,通过商品查找符合条件的订单
for(int i=0;i<goodsList.size();i++) {
Long item_id = goodsList.get(i);
//根据商品id查询所有符合条件的包含该商品的订单,并将这些订单的全部放入到orderList中
orderList = orderDetailMapper.findOrdersByGood(item_id);
for(Order order:orderList){
//allOrderList.add(order);
//遍历这些订单,获取每个订单id,并通过orderId和商品itemId查订单详情表中,包含这个itemId
int sum=0;
for(int j=0;j<orderList.size();j++){
String orderId2=orderList.get(j).getOrderId();
// Long item_id = goodsList.get(j);
int count = orderDetailMapper.selectCountFromOrderDetailByOrderIdAndItemId(orderId2, item_id);
sum += count;
}
countMap.put(item_id+"",sum+"");
}
}
return countMap;
}
业务逻辑写完了 ===========剩下的就是把消息推送给小程序(Socket),还不怎么还熟,dalao封装好了,按照那个方法写的,