package com.ruoyi.app.order; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.app.order.dto.OrderCreateInput; import com.ruoyi.app.order.dto.OrderCreatItem; import com.ruoyi.app.utils.DateUtil; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.service.*; import com.ruoyi.system.utils.Auth; import com.ruoyi.system.utils.JwtUtil; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * 用户订单Controller * * @author ruoyi * @date 2020-04-01 */ @RestController @RequestMapping("/system/userOrder") public class UserOrderController extends BaseController { @Autowired private IOrderParentService orderParentService; @Autowired private IPosOrderService posOrderService; @Autowired private IPosStoreService posStoreService; @Autowired private IInfoAddressService infoAddressService; @Autowired private IOperatingHoursService operatingHoursService; /** * 创建订单 */ @PostMapping("/createOrder") @Auth @Anonymous @Transactional(rollbackFor = Exception.class) public AjaxResult createOrder(@RequestHeader String token, @RequestBody OrderCreateInput input) { JwtUtil jwtUtil = new JwtUtil(); String id = jwtUtil.getusid(token); String shdz=null; if(input.getType()==0){ InfoAddress usadd = infoAddressService.getById(input.getShdzId()); if (usadd == null) { throw new ServiceException(MessageUtils.message("no.address.not.exist")); } shdz= JSON.toJSONString(usadd); } createOrderParent(input,Long.valueOf(id),shdz); createOrderChild(input,Long.valueOf(id),Long.valueOf(id),shdz); OrderParent result = orderParentService.getOne(new LambdaQueryWrapper().eq(OrderParent::getDdId, input.getDdId().toString())); return super.success(result); } //创建父订单 private void createOrderParent(OrderCreateInput input,Long UserId,String shdz){ OrderParent orderParent = new OrderParent(); orderParent.setUserId(UserId); orderParent.setOrderStatus(0L); orderParent.setTotalAmount(input.getTotalAmount()); orderParent.setActualPayAmount(input.getActualPayAmount()); orderParent.setPaymentMethod(input.getPaymentMethod()); // orderParent.setPaymentTime(new Date()); orderParent.setCreateTime(new Date()); // orderParent.setUpdateTime(new Date()); orderParent.setDdId(input.getDdId().toString()); orderParent.setTableNum(input.getTableNum()); orderParent.setShdzId(input.getShdzId()); orderParent.setShAddress(shdz); orderParent.setType(input.getType()); orderParent.setRemarks(input.getRemarks()); orderParentService.save(orderParent); } //创建子订单 private void createOrderChild(OrderCreateInput input,Long orderParentId,Long userId,String shdz){ // 检查items是否为空 if (input.getItems() == null || input.getItems().isEmpty()) { throw new ServiceException(MessageUtils.message("订单商品不能为空")); } String ddId = input.getDdId().toString(); List mdIdList = input.getItems().stream().map(OrderCreatItem::getMdId).collect(Collectors.toList()); List storeList = posStoreService.list(new LambdaQueryWrapper().in(PosStore::getId, mdIdList)); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(OperatingHours::getMdId, mdIdList); List hourslist = operatingHoursService.list(wrapper); DateUtil dateUtil = new DateUtil(); // 循环items,为每个item创建一条PosOrder for (OrderCreatItem item : input.getItems()) { // 检查门店是否开放 checkStoreOpen(storeList,hourslist,item,dateUtil); int index = input.getItems().indexOf(item) + 1; String subddId = ddId+ index; PosOrder posOrder = new PosOrder(); posOrder.setShdzId(input.getShdzId()); // 设置子订单的基本信息 posOrder.setDdId(subddId); posOrder.setParentDdId(input.getDdId().toString()); // 设置父订单ID posOrder.setCretim(new Date()); posOrder.setState(0L); // 初始状态 // 根据item设置订单信息 posOrder.setShId(item.getShId()); posOrder.setMdId(item.getMdId()); posOrder.setShdzId(input.getShdzId()); posOrder.setUserId(userId); posOrder.setAmount(item.getAmount()); posOrder.setRemarks(item.getRemarks()); posOrder.setType(item.getType()); posOrder.setDelryTime(item.getDelryTime()); posOrder.setFood(JSON.toJSONString(item.getFood())); if("1".equals(input.getPaymentMethod())){ posOrder.setCollectPayment("1"); } // 设置支付相关信息(从父订单继承) posOrder.setPayType(input.getPaymentMethod()); //设置桌号(从父订单继承) posOrder.setTableNum(input.getTableNum()); posOrder.setLogo(item.getLogo()); posOrder.setPosName(item.getPosName()); posOrder.setJvli(item.getJvli()); posOrder.setFreight(item.getFreight()); posOrder.setShdzId(input.getShdzId()); posOrder.setShAddress(shdz); Optional store= storeList.stream().filter(x-> item.getMdId().equals(x.getId())).findFirst(); if (!store.isPresent()) { throw new ServiceException(MessageUtils.message("no.mendian.not.exist")); } posOrder.setLongitude(store.get().getLongitude()); posOrder.setLatitude(store.get().getLatitude()); //设置订单分类 storeList.stream().filter(s -> Long.valueOf(s.getId()).equals(item.getMdId())).findFirst().ifPresent(st -> { posOrder.setOrderCategory(String.valueOf(st.getType())); }); // 保存子订单 posOrderService.save(posOrder); } } /** * 检查门店是否开放 */ private void checkStoreOpen( List storeList,List hourslist, OrderCreatItem item, DateUtil dateUtil) { List storeHourslist = hourslist.stream().filter(x-> x.getMdId().equals(item.getMdId())).collect(Collectors.toList()); PosStore store = storeList.stream().filter(x-> Long.valueOf(x.getId()).equals(item.getMdId())).findFirst().get(); if (storeHourslist.isEmpty()) { throw new ServiceException(store.getPosName()+MessageUtils.message("no.mendian.not.set.business.hours")); } if (store.getState() == 1) { throw new ServiceException(store.getPosName()+MessageUtils.message("no.mendian.is.closed")); } Boolean dayang = false; for (int i = 0; i < hourslist.size(); i++) { Boolean sbsj = dateUtil.isLegalTime(hourslist.get(i).getStartTime(), hourslist.get(i).getEndTime()); if (sbsj == true) { dayang = true; } } if (dayang == false) { throw new ServiceException(store.getPosName()+MessageUtils.message("no.mendian.is.closed")); } } /** * 获取父订单详情 */ @GetMapping("/getParentOrderDetail") @Auth @Anonymous public AjaxResult getParentOrderDetail(@RequestHeader String token, @RequestParam String ddId){ OrderParent result = orderParentService.getOne(new LambdaQueryWrapper().eq(OrderParent::getDdId,ddId)); List posOrders = posOrderService.list(new LambdaQueryWrapper().eq(PosOrder::getParentDdId,ddId).orderBy(true,true,PosOrder::getCretim)); result.setItems(posOrders); return super.success(result); } }