UserOrderController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package com.ruoyi.app.order;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.ruoyi.app.order.dto.OrderCreateInput;
  7. import com.ruoyi.app.order.dto.OrderCreatItem;
  8. import com.ruoyi.app.order.dto.OrderPushBodyDto;
  9. import com.ruoyi.app.utils.DateUtil;
  10. import com.ruoyi.app.utils.OperatingUtil;
  11. import com.ruoyi.app.utils.PayPush;
  12. import com.ruoyi.app.utils.event.PushEventService;
  13. import com.ruoyi.common.annotation.Anonymous;
  14. import com.ruoyi.common.core.controller.BaseController;
  15. import com.ruoyi.common.core.domain.AjaxResult;
  16. import com.ruoyi.common.exception.ServiceException;
  17. import com.ruoyi.common.utils.MessageUtils;
  18. import com.ruoyi.common.utils.StringUtils;
  19. import com.ruoyi.framework.manager.AsyncManager;
  20. import com.ruoyi.system.domain.*;
  21. import com.ruoyi.system.service.*;
  22. import com.ruoyi.system.utils.Auth;
  23. import com.ruoyi.system.utils.JwtUtil;
  24. import org.springframework.web.bind.annotation.*;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import java.util.Date;
  28. import java.util.List;
  29. import java.util.Optional;
  30. import java.util.TimerTask;
  31. import java.util.stream.Collectors;
  32. /**
  33. * 用户订单Controller
  34. *
  35. * @author ruoyi
  36. * @date 2020-04-01
  37. */
  38. @RestController
  39. @RequestMapping("/system/userOrder")
  40. public class UserOrderController extends BaseController {
  41. @Autowired
  42. private IOrderParentService orderParentService;
  43. @Autowired
  44. private IPosOrderService posOrderService;
  45. @Autowired
  46. private IPosStoreService posStoreService;
  47. @Autowired
  48. private IInfoAddressService infoAddressService;
  49. @Autowired
  50. private IOperatingHoursService operatingHoursService;
  51. @Autowired
  52. private IUserFootprintService userFootprintService;
  53. @Autowired
  54. private IInfoUserService infoUserService;
  55. @Autowired
  56. private PushEventService pushEventService;
  57. /**
  58. * 创建订单
  59. */
  60. @PostMapping("/createOrder")
  61. @Auth
  62. @Anonymous
  63. @Transactional(rollbackFor = Exception.class)
  64. public AjaxResult createOrder(@RequestHeader String token, @RequestBody OrderCreateInput input)
  65. {
  66. JwtUtil jwtUtil = new JwtUtil();
  67. String id = jwtUtil.getusid(token);
  68. String shdz=null;
  69. if(input.getType()==0){
  70. InfoAddress usadd = infoAddressService.getById(input.getShdzId());
  71. if (usadd == null) {
  72. throw new ServiceException(MessageUtils.message("no.address.not.exist"));
  73. }
  74. shdz= JSON.toJSONString(usadd);
  75. }
  76. createOrderParent(input,Long.valueOf(id),shdz);
  77. createOrderChild(input,Long.valueOf(id),Long.valueOf(id),shdz);
  78. OrderParent result = orderParentService.getOne(new LambdaQueryWrapper<OrderParent>().eq(OrderParent::getDdId, input.getDdId().toString()));
  79. System.out.println("创建返回信息:"+result);
  80. return super.success(result);
  81. }
  82. //创建父订单
  83. private void createOrderParent(OrderCreateInput input,Long UserId,String shdz){
  84. OrderParent orderParent = new OrderParent();
  85. orderParent.setUserId(UserId);
  86. orderParent.setOrderStatus(0L);
  87. orderParent.setTotalAmount(input.getTotalAmount());
  88. orderParent.setActualPayAmount(input.getActualPayAmount());
  89. orderParent.setPaymentMethod(input.getPaymentMethod());
  90. // orderParent.setPaymentTime(new Date());
  91. orderParent.setCreateTime(new Date());
  92. // orderParent.setUpdateTime(new Date());
  93. orderParent.setDdId(input.getDdId().toString());
  94. orderParent.setTableNum(input.getTableNum());
  95. orderParent.setShdzId(input.getShdzId());
  96. orderParent.setShAddress(shdz);
  97. orderParent.setType(input.getType());
  98. orderParent.setRemarks(input.getRemarks());
  99. orderParentService.save(orderParent);
  100. }
  101. //创建子订单
  102. private void createOrderChild(OrderCreateInput input,Long orderParentId,Long userId,String shdz){
  103. // 检查items是否为空
  104. if (input.getItems() == null || input.getItems().isEmpty()) {
  105. throw new ServiceException(MessageUtils.message("订单商品不能为空"));
  106. }
  107. String ddId = input.getDdId().toString();
  108. List<Long> mdIdList = input.getItems().stream().map(OrderCreatItem::getMdId).collect(Collectors.toList());
  109. // 将Long类型的门店ID转换为Integer类型用于查询(因为PosStore.getId()返回Integer)
  110. List<Integer> mdIdIntegerList = mdIdList.stream().map(Long::intValue).collect(Collectors.toList());
  111. List<PosStore> storeList = posStoreService.list(new LambdaQueryWrapper<PosStore>().in(PosStore::getId, mdIdIntegerList));
  112. LambdaQueryWrapper<OperatingHours> wrapper = new LambdaQueryWrapper<>();
  113. wrapper.in(OperatingHours::getMdId, mdIdList);
  114. List<OperatingHours> hourslist = operatingHoursService.list(wrapper);
  115. if(!input.getItems().isEmpty() && input.getItems().size()>1){
  116. throw new ServiceException("一次只能下单一个商家的订单");
  117. }
  118. // 循环items,为每个item创建一条PosOrder
  119. for (OrderCreatItem item : input.getItems()) {
  120. // 检查门店是否开放
  121. checkStoreOpen(storeList,hourslist,item);
  122. int index = input.getItems().indexOf(item) + 1;
  123. String subddId = ddId;
  124. PosOrder posOrder = new PosOrder();
  125. posOrder.setIsDisplay(false);
  126. handleIsDisplay(posOrder);
  127. posOrder.setShdzId(input.getShdzId());
  128. // 设置子订单的基本信息
  129. posOrder.setDdId(subddId);
  130. posOrder.setParentDdId(input.getDdId().toString()); // 设置父订单ID
  131. posOrder.setCretim(new Date());
  132. posOrder.setState(0L); // 初始状态
  133. // 根据item设置订单信息
  134. posOrder.setShId(item.getShId());
  135. posOrder.setMdId(item.getMdId());
  136. posOrder.setShdzId(input.getShdzId());
  137. posOrder.setUserId(userId);
  138. posOrder.setAmount(item.getAmount());
  139. posOrder.setRemarks(item.getRemarks());
  140. posOrder.setType(item.getType());
  141. posOrder.setDelryTime(item.getDelryTime());
  142. posOrder.setFood(JSON.toJSONString(item.getFood()));
  143. if("1".equals(input.getPaymentMethod())){
  144. posOrder.setCollectPayment("1");
  145. }
  146. // 设置支付相关信息(从父订单继承)
  147. posOrder.setPayType(input.getPaymentMethod());
  148. //设置桌号(从父订单继承)
  149. posOrder.setTableNum(input.getTableNum());
  150. posOrder.setLogo(item.getLogo());
  151. posOrder.setPosName(item.getPosName());
  152. posOrder.setJvli(item.getJvli());
  153. posOrder.setFreight(item.getFreight());
  154. posOrder.setShdzId(input.getShdzId());
  155. posOrder.setShAddress(shdz);
  156. posOrder.setFoodAmount(item.getFoodAmount());
  157. Optional<PosStore> storeOptional = storeList.stream()
  158. .filter(x -> item.getMdId().equals(Long.valueOf(x.getId())))
  159. .findFirst();
  160. if (storeOptional.isEmpty()) {
  161. throw new ServiceException(MessageUtils.message("no.mendian.not.exist"));
  162. }
  163. PosStore store = storeOptional.get();
  164. posOrder.setLongitude(store.getLongitude());
  165. posOrder.setLatitude(store.getLatitude());
  166. //设置订单分类
  167. storeList.stream().filter(s -> Long.valueOf(s.getId()).equals(item.getMdId())).findFirst().ifPresent(st -> {
  168. posOrder.setOrderCategory(String.valueOf(st.getType()));
  169. });
  170. // 保存子订单
  171. createFootprint(userId, item.getMdId());
  172. posOrderService.save(posOrder);
  173. // 创建订单成功,给商家推送"您有新订单了"
  174. InfoUser shUser = infoUserService.getById(item.getShId());
  175. if (shUser != null && !StringUtils.isEmpty(shUser.getCid())) {
  176. PayPush push = new PayPush();
  177. String title = "no.message.push.message";
  178. String content = "no.message.push.new.order";
  179. String body = OrderPushBodyDto.getJson(subddId, String.valueOf(posOrder.getState()), 0);
  180. Long shUserId = shUser.getUserId();
  181. String cid = shUser.getCid();
  182. AsyncManager.me().execute(new TimerTask() {
  183. @Override
  184. public void run() {
  185. PayPush.shPushHandleLocal(push, pushEventService, shUserId, cid, title, content, body, "", subddId);
  186. }
  187. });
  188. }
  189. }
  190. }
  191. //设置显示状态
  192. private void handleIsDisplay(PosOrder posOrder){
  193. if (StringUtils.isEmpty(posOrder.getDelryTime())) {
  194. posOrder.setIsDisplay(true);
  195. posOrder.setDisplayTime(new Date());
  196. }
  197. //预约单不在时间范围内不显示
  198. if (StringUtils.isNotEmpty(posOrder.getDelryTime())) {
  199. int minute = DateUtil.getAppoinmentOrderHandleTime();
  200. boolean isNear = DateUtil.isNearOrPastStartTime(posOrder.getDelryTime(), minute);
  201. if (isNear) {
  202. posOrder.setIsDisplay(true);
  203. posOrder.setDisplayTime(new Date());
  204. }
  205. }
  206. }
  207. private void createFootprint(Long uid,Long mdId){
  208. QueryWrapper<UserFootprint> Wrapper = new QueryWrapper<>();
  209. Wrapper.eq("user_id", uid);
  210. Wrapper.eq("md_id", mdId);
  211. UserFootprint foot = userFootprintService.getOne(Wrapper);
  212. DateUtil dateString = new DateUtil();
  213. if (foot == null) {
  214. UserFootprint usf = new UserFootprint();
  215. usf.setUserId(uid);
  216. usf.setMdId(mdId);
  217. usf.setCretim(dateString.GetDate());
  218. userFootprintService.saveOrUpdate(usf);
  219. } else {
  220. foot.setCretim(dateString.GetDate());
  221. userFootprintService.saveOrUpdate(foot);
  222. }
  223. }
  224. /**
  225. * 检查门店是否开放
  226. */
  227. private void checkStoreOpen( List<PosStore> storeList,List<OperatingHours> hourslist, OrderCreatItem item) {
  228. List<OperatingHours> storeHourslist = hourslist.stream().filter(x-> x.getMdId().equals(item.getMdId())).collect(Collectors.toList());
  229. PosStore store = storeList.stream()
  230. .filter(x -> Long.valueOf(x.getId()).equals(item.getMdId()))
  231. .findFirst()
  232. .orElseThrow(() -> new ServiceException(MessageUtils.message("no.mendian.not.exist")));
  233. if (storeHourslist.isEmpty()) {
  234. throw new ServiceException(store.getPosName()+MessageUtils.message("no.mendian.not.set.business.hours"));
  235. }
  236. if (store.getState() == 1) {
  237. throw new ServiceException(store.getPosName()+MessageUtils.message("no.mendian.is.closed"));
  238. }
  239. boolean isOperating = OperatingUtil.storeIsOperatingOfDay(storeHourslist);
  240. if (!isOperating) {
  241. throw new ServiceException(store.getPosName()+MessageUtils.message("no.mendian.is.closed"));
  242. }
  243. }
  244. /**
  245. * 获取父订单详情
  246. */
  247. @GetMapping("/getParentOrderDetail")
  248. @Auth
  249. @Anonymous
  250. public AjaxResult getParentOrderDetail(@RequestHeader String token, @RequestParam String ddId){
  251. OrderParent result = orderParentService.getOne(new LambdaQueryWrapper<OrderParent>().eq(OrderParent::getDdId,ddId));
  252. List<PosOrder> posOrders = posOrderService.list(new LambdaQueryWrapper<PosOrder>().eq(PosOrder::getParentDdId,ddId).orderBy(true,true,PosOrder::getCretim));
  253. result.setItems(posOrders);
  254. return super.success(result);
  255. }
  256. }