OrderApiController.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package com.jjt.order.controller;
  2. import com.jjt.calc.domain.TwinCalcDay;
  3. import com.jjt.calc.domain.TwinFormulaInfo;
  4. import com.jjt.calc.service.ITwinCalcDayService;
  5. import com.jjt.calc.service.ITwinFormulaInfoService;
  6. import com.jjt.common.constant.CacheConstants;
  7. import com.jjt.common.core.controller.BaseController;
  8. import com.jjt.common.core.redis.RedisCache;
  9. import com.jjt.common.utils.DateUtils;
  10. import com.jjt.order.domain.TwinOrder;
  11. import com.jjt.order.domain.VmsStock;
  12. import com.jjt.order.service.ITwinOrderService;
  13. import com.jjt.order.utils.OrderExportUtil;
  14. import com.jjt.order.utils.OrderGsmExportUtil;
  15. import com.jjt.utils.MssqlUtil;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiOperation;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  20. import org.springframework.web.bind.annotation.*;
  21. import javax.annotation.Resource;
  22. import javax.servlet.http.HttpServletResponse;
  23. import java.io.*;
  24. import java.net.URLEncoder;
  25. import java.time.LocalDate;
  26. import java.time.LocalDateTime;
  27. import java.util.*;
  28. import java.util.stream.Collectors;
  29. import java.util.zip.ZipEntry;
  30. import java.util.zip.ZipOutputStream;
  31. /**
  32. * @author ruoyi
  33. */
  34. @Api("数据接口")
  35. @RestController
  36. @Slf4j
  37. @RequestMapping()
  38. public class OrderApiController extends BaseController {
  39. @Resource
  40. private RedisCache redisCache;
  41. @Resource
  42. private ITwinOrderService orderService;
  43. @Resource
  44. private ITwinFormulaInfoService formulaInfoService;
  45. @Resource
  46. private ITwinCalcDayService dayService;
  47. @ApiOperation("查看当前库存")
  48. @GetMapping("/api/stock")
  49. @CrossOrigin(origins = "*")
  50. @ResponseBody
  51. public Map<String, Object> mesStock() {
  52. return redisCache.getCacheObject(CacheConstants.VMS_STOCK);
  53. }
  54. @ApiOperation("导出白坯预测")
  55. @GetMapping("/api/export/order")
  56. @CrossOrigin(origins = "*")
  57. public void orderExport(String start, String end, HttpServletResponse response) {
  58. //查询订单
  59. List<TwinOrder> orderList = orderService.selectTwinOrderListByDate(start, end);
  60. //按订单ID分组
  61. Map<Long, TwinOrder> orderMap = orderList.stream().collect(Collectors.toMap(TwinOrder::getOderId, o -> o));
  62. List<TwinFormulaInfo> infos = formulaInfoService.selectTwinFormulaInfoList(new TwinFormulaInfo());
  63. LocalDateTime ldt = LocalDateTime.now();
  64. Date sd = DateUtils.toDate(LocalDate.now().minusDays(2));
  65. if (ldt.getHour() > 7) {
  66. sd = DateUtils.toDate(LocalDate.now().minusDays(1));
  67. }
  68. List<TwinCalcDay> dayList = dayService.selectTwinCalcDayListByTime(sd, sd);
  69. //按设备ID分组
  70. Map<Long, TwinCalcDay> dayMap = dayList.stream().collect(Collectors.toMap(TwinCalcDay::getDeviceId, o -> o));
  71. List<VmsStock> stocks = MssqlUtil.vmsStock();
  72. try (OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ZipOutputStream zipOut = new ZipOutputStream(bos);) {
  73. // 创建临时输出流
  74. response.reset();
  75. response.setCharacterEncoding("UTF-8");
  76. response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("白坯布靶向预测" + start + "至" + end + ".zip", "UTF-8"));
  77. response.setContentType("application/octet-stream");
  78. try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("tpl/order.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(inputStream);) {
  79. OrderExportUtil oe = new OrderExportUtil();
  80. String title = "白坯布靶向生产测算-10天(" + start + " 至 " + end + ")\n按重量匹配";
  81. oe.process(wb, title, orderList, infos, orderMap, dayMap, stocks);
  82. // 将第一个工作簿写入 ZIP
  83. ZipEntry entry = new ZipEntry("按重量匹配.xlsx");
  84. zipOut.putNextEntry(entry);
  85. wb.write(zipOut);
  86. zipOut.closeEntry();
  87. } catch (IOException ex) {
  88. ex.printStackTrace();
  89. }
  90. try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("tpl/order-gsm.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(inputStream);) {
  91. OrderGsmExportUtil oe = new OrderGsmExportUtil();
  92. String title = "白坯布靶向生产测算-10天(" + start + " 至 " + end + ")\n按平方米克重匹配";
  93. oe.process(wb, title, orderList, infos, orderMap, dayMap, stocks);
  94. // 将第二个工作簿写入 ZIP
  95. ZipEntry entry = new ZipEntry("按平方米克重匹配.xlsx");
  96. zipOut.putNextEntry(entry);
  97. wb.write(zipOut);
  98. zipOut.closeEntry();
  99. } catch (IOException ex) {
  100. ex.printStackTrace();
  101. }
  102. // 完成 ZIP 文件
  103. zipOut.finish();
  104. outputStream.write(bos.toByteArray());
  105. outputStream.flush();
  106. } catch (IOException e) {
  107. throw new RuntimeException(e);
  108. }
  109. }
  110. /**
  111. * 先按重量匹配,再匹配长或者宽大于规格的长宽
  112. *
  113. * @param spec 规格
  114. * @param stocks 库存
  115. * @return 结果
  116. */
  117. private VmsStock matchStock(String spec, List<VmsStock> stocks) {
  118. //按重量分组
  119. Map<Integer, List<VmsStock>> stockMap = stocks.stream().collect(Collectors.groupingBy(VmsStock::getWeight, LinkedHashMap::new, Collectors.toList()));
  120. if (spec != null) {
  121. String[] tmp = spec.split("\\*");
  122. if (tmp.length == 3) {
  123. //长
  124. float length = Float.parseFloat(tmp[0]);
  125. //宽
  126. float width = Float.parseFloat(tmp[1]);
  127. //重量,单位kg,需要转换成克
  128. int weight = (int) (Float.parseFloat(tmp[2]) * 1000);
  129. List<VmsStock> tempList = stockMap.get(weight);
  130. if (tempList != null) {
  131. for (VmsStock stock : tempList) {
  132. if (length > stock.getLength() || width > stock.getLength()) {
  133. return stock;
  134. }
  135. }
  136. }
  137. }
  138. }
  139. return null;
  140. }
  141. /**
  142. * 匹配库存,新匹配方式,以幅宽和平方米克重来匹配
  143. * 订单中计算得到毛毯平方米克重要求,根据长宽规格,先以产品长度匹配白胚库中的幅宽规格。
  144. * 如没有或不足,以宽匹配,但此时要做标注,以准备网框的工艺切换。
  145. * 白胚库的规格,只以平方米克重和幅宽为规格单位。
  146. *
  147. * @param spec 规格
  148. * @param stocks 库存
  149. * @return 结果
  150. */
  151. private VmsStock matchStockGsm(String spec, List<VmsStock> stocks) {
  152. //按重量分组
  153. // Map<Integer, List<VmsStock>> stockMap = stocks.stream().collect(Collectors.groupingBy(VmsStock::getWeight, LinkedHashMap::new, Collectors.toList()));
  154. // if (spec != null) {
  155. // String[] tmp = spec.split("\\*");
  156. // if (tmp.length == 3) {
  157. // float length = Float.parseFloat(tmp[0]);
  158. // float width = Float.parseFloat(tmp[1]);
  159. // int weight = (int) (Float.parseFloat(tmp[2]) * 1000);
  160. // List<VmsStock> tempList = stockMap.get(weight);
  161. // if (tempList != null) {
  162. // for (VmsStock stock : tempList) {
  163. // if (length > stock.getLength() || width > stock.getLength()) {
  164. // return stock;
  165. // }
  166. // }
  167. // }
  168. // }
  169. // }
  170. return null;
  171. }
  172. /**
  173. * 匹配产线
  174. *
  175. * @param spec 规格
  176. * @param list 产线
  177. * @return 结果
  178. */
  179. private List<TwinFormulaInfo> matchFormula(String spec, List<TwinFormulaInfo> list) {
  180. List<TwinFormulaInfo> result = new ArrayList<>();
  181. //按重量分组
  182. Map<Float, List<TwinFormulaInfo>> formulaMap = list.stream().collect(Collectors.groupingBy(TwinFormulaInfo::getFd18, LinkedHashMap::new, Collectors.toList()));
  183. if (spec != null) {
  184. String[] tmp = spec.split("\\*");
  185. if (tmp.length == 3) {
  186. Float length = Float.parseFloat(tmp[0]);
  187. Float width = Float.parseFloat(tmp[1]);
  188. Float weight = Float.parseFloat(tmp[2]);
  189. List<TwinFormulaInfo> infos = formulaMap.get(weight);
  190. if (infos != null) {
  191. for (TwinFormulaInfo info : infos) {
  192. if (length.equals(info.getFd16()) && width.equals(info.getFd17()) ||
  193. length.equals(info.getFd17()) && width.equals(info.getFd16())) {
  194. result.add(info);
  195. }
  196. }
  197. }
  198. }
  199. }
  200. return result;
  201. }
  202. }