ApiVendingController.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package org.springblade.modules.api.controller;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import cn.hutool.http.ContentType;
  5. import cn.hutool.json.JSONUtil;
  6. import io.swagger.annotations.Api;
  7. import io.swagger.annotations.ApiOperation;
  8. import lombok.AllArgsConstructor;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springblade.common.aspect.VendingFlag;
  11. import org.springblade.common.constant.CommonConstant;
  12. import org.springblade.common.enums.FacilityStatusEnum;
  13. import org.springblade.common.enums.OrderStateEnum;
  14. import org.springblade.core.log.annotation.ApiLog;
  15. import org.springblade.modules.api.request.VendingHeartReq;
  16. import org.springblade.modules.api.request.VendingOrderReq;
  17. import org.springblade.modules.api.request.VendingShipReq;
  18. import org.springblade.modules.api.response.VendingOrderGoodsRes;
  19. import org.springblade.modules.api.response.VendingOrderRes;
  20. import org.springblade.modules.api.service.VendingOrderService;
  21. import org.springblade.modules.business.entity.Facility;
  22. import org.springblade.modules.business.entity.FacilityFault;
  23. import org.springblade.modules.business.enums.FacilityFaultStatusEnum;
  24. import org.springblade.modules.business.service.IFacilityFaultService;
  25. import org.springblade.modules.business.service.IFacilityService;
  26. import org.springblade.modules.finance.entity.Order;
  27. import org.springblade.modules.finance.entity.OrderGoods;
  28. import org.springblade.modules.finance.service.IOrderGoodsService;
  29. import org.springblade.modules.finance.service.IOrderService;
  30. import org.springblade.modules.finance.vo.OrderGoodsVO;
  31. import org.springblade.modules.finance.vo.OrderVO;
  32. import org.springframework.web.bind.annotation.PostMapping;
  33. import org.springframework.web.bind.annotation.RequestBody;
  34. import org.springframework.web.bind.annotation.RequestMapping;
  35. import org.springframework.web.bind.annotation.RestController;
  36. import javax.servlet.http.HttpServletResponse;
  37. import javax.validation.Valid;
  38. import java.io.IOException;
  39. import java.nio.charset.StandardCharsets;
  40. import java.time.LocalDateTime;
  41. import java.util.*;
  42. import java.util.stream.Collectors;
  43. /**
  44. * 售货机硬件对接接口
  45. */
  46. @RestController
  47. @AllArgsConstructor
  48. @RequestMapping(CommonConstant.API_URL + "/vending")
  49. @Api(value = "售货机硬件对接接口", tags = "售货机硬件对接接口")
  50. @Slf4j
  51. public class ApiVendingController {
  52. private final VendingOrderService vendingOrderService;
  53. private final IOrderGoodsService orderGoodsService;
  54. private final IOrderService orderService;
  55. private final IFacilityService facilityService;
  56. private final IFacilityFaultService facilityFaultService;
  57. @ApiLog("查询设备订单信息")
  58. @VendingFlag
  59. @ApiOperation(value = "查询订单信息", notes = "传入售货机编号")
  60. @PostMapping("/getOrder")
  61. public void getOrder(@Valid @RequestBody VendingOrderReq vendingOrderReq, HttpServletResponse response) throws IOException {
  62. List<OrderGoodsVO> vendingOrderVOs = vendingOrderService.getVendingOrder(vendingOrderReq);
  63. //封装返回
  64. VendingOrderRes vendingOrderRes = new VendingOrderRes();
  65. vendingOrderRes.setMachineId(vendingOrderReq.getMachineId());
  66. if (CollectionUtil.isEmpty(vendingOrderVOs)) {
  67. vendingOrderRes.setSaleSn("");
  68. vendingOrderRes.setChannelNum("0");
  69. vendingOrderRes.setSaleData(new ArrayList<>());
  70. this.notifyReturn(response, vendingOrderRes);
  71. } else {
  72. //一次只返回一个订单
  73. //按订单分组
  74. Map<Long, List<OrderGoodsVO>> vendingOrderGoodMap = vendingOrderVOs.stream().collect(Collectors.groupingBy(OrderGoodsVO::getOrderId));
  75. OrderVO backOrder = vendingOrderService.getBackOrder(vendingOrderReq);
  76. if (Objects.isNull(backOrder)) {
  77. vendingOrderRes.setSaleSn("");
  78. vendingOrderRes.setChannelNum("0");
  79. vendingOrderRes.setSaleData(new ArrayList<>());
  80. this.notifyReturn(response, vendingOrderRes);
  81. return;
  82. }
  83. List<OrderGoodsVO> orderGoodsVOS = vendingOrderGoodMap.get(backOrder.getId());
  84. vendingOrderRes.setSaleSn(backOrder.getId() + "");
  85. vendingOrderRes.setChannelNum(orderGoodsVOS.size() + "");
  86. List<VendingOrderGoodsRes> saledataList = new ArrayList<>();
  87. //补充货道信息
  88. for (OrderGoodsVO orderGoodsVO : orderGoodsVOS) {
  89. VendingOrderGoodsRes vendingOrderGoodsRes = new VendingOrderGoodsRes();
  90. vendingOrderGoodsRes.setOrderGoodsId(String.valueOf(orderGoodsVO.getId()));
  91. vendingOrderGoodsRes.setChannel(orderGoodsVO.getCargoWayNo());
  92. vendingOrderGoodsRes.setChannelNum(String.valueOf(orderGoodsVO.getGoodsNum()));
  93. saledataList.add(vendingOrderGoodsRes);
  94. }
  95. vendingOrderRes.setSaleData(saledataList);
  96. this.notifyReturn(response, vendingOrderRes);
  97. }
  98. }
  99. /**
  100. * 硬件接口订单信息返回通用响应
  101. *
  102. * @param response HttpServletResponse
  103. * @param vendingOrderRes 返值
  104. */
  105. private void notifyReturn(HttpServletResponse response, VendingOrderRes vendingOrderRes) throws IOException {
  106. Map<String, Object> map = BeanUtil.beanToMap(vendingOrderRes);
  107. response.setHeader("Content-type", ContentType.JSON.toString());
  108. response.getOutputStream().write(JSONUtil.toJsonStr(map).getBytes(StandardCharsets.UTF_8));
  109. response.flushBuffer();
  110. }
  111. @ApiLog("设备出货成功回调")
  112. @ApiOperation(value = "出货成功回调", notes = "出货成功回调")
  113. @PostMapping("callback")
  114. public void callback(@Valid @RequestBody VendingShipReq req) {
  115. //设备出货成功回调
  116. OrderGoods orderGoods = orderGoodsService.getById(req.getOrderGoodsId());
  117. if (Objects.isNull(orderGoods)) {
  118. log.info("设备出货成功回调,未找到货品信息");
  119. return;
  120. }
  121. //出货量校验
  122. if (orderGoods.getGoodsNum() < orderGoods.getShipmentNum() + 1) {
  123. log.info("设备出货成功回调,出货量过多");
  124. }
  125. if ("OK".equals(req.getStatus())) {
  126. orderGoodsService.lambdaUpdate()
  127. .set(OrderGoods::getShipmentNum, orderGoods.getShipmentNum() + 1)
  128. .set(OrderGoods::getShippingTime, LocalDateTime.now())
  129. .eq(OrderGoods::getId, req.getOrderGoodsId())
  130. .update();
  131. if (orderGoods.getGoodsNum() == orderGoods.getShipmentNum() + 1) {
  132. orderService.lambdaUpdate()
  133. .set(Order::getOrderState, OrderStateEnum.COMPLETED.getValue())
  134. .eq(Order::getId, req.getSaleSn())
  135. .update();
  136. orderGoodsService.lambdaUpdate()
  137. .set(OrderGoods::getShipment, 1)
  138. .eq(OrderGoods::getId, req.getOrderGoodsId())
  139. .update();
  140. }
  141. } else {//出货故障处理
  142. //将订单状态改为出货失败
  143. orderService.lambdaUpdate()
  144. .set(Order::getOrderState, OrderStateEnum.SHIP_FAIL.getValue())
  145. .eq(Order::getId, req.getSaleSn())
  146. .update();
  147. orderGoodsService.lambdaUpdate()
  148. .set(OrderGoods::getShipment, 0)
  149. .eq(OrderGoods::getId, req.getOrderGoodsId())
  150. .update();
  151. }
  152. }
  153. @ApiLog("设备心跳")
  154. @ApiOperation(value = "设备心跳", notes = "设备心跳")
  155. @PostMapping("heartbeat")
  156. public void heartbeat(@Valid @RequestBody VendingHeartReq req) {
  157. Facility facility = facilityService.getById(req.getMachineId());
  158. if (Objects.isNull(facility)) {
  159. log.info("设备心跳,未找到设备信息");
  160. return;
  161. }
  162. Date now = new Date();
  163. facility.setHeartbeatTime(now);
  164. if ("0".equals(req.getErrorNum()) || "OK".equals(req.getStatus())) {
  165. facility.setFacilityStatus(FacilityStatusEnum.ON_LINE.getValue());
  166. facilityService.updateById(facility);
  167. FacilityFault facilityFault = new FacilityFault();
  168. facilityFault.setFacilityId(req.getMachineId());
  169. facilityFault.setFaultDesc(FacilityFaultStatusEnum.getDesc("0"));
  170. facilityFault.setFaultStatus("0");
  171. facilityFault.setCreateTime(now);
  172. facilityFaultService.save(facilityFault);
  173. return;
  174. } else {
  175. //设备故障
  176. facility.setFacilityStatus(FacilityStatusEnum.FAULT.getValue());
  177. facilityService.updateById(facility);
  178. //录入故障信息
  179. String[] split = req.getErrorArray().replace("{", "").replace("}", "").split(",");
  180. List<FacilityFault> facilityFaults = new ArrayList<>();
  181. for (String status : split) {
  182. FacilityFault facilityFault = new FacilityFault();
  183. facilityFault.setFacilityId(req.getMachineId());
  184. facilityFault.setFaultDesc(FacilityFaultStatusEnum.getDesc(status));
  185. facilityFault.setFaultStatus(status);
  186. facilityFault.setCreateTime(now);
  187. facilityFaults.add(facilityFault);
  188. }
  189. facilityFaultService.saveBatch(facilityFaults);
  190. }
  191. }
  192. }