package com.jjt.order.controller; import com.jjt.calc.domain.TwinCalcDay; import com.jjt.calc.domain.TwinFormulaInfo; import com.jjt.calc.service.ITwinCalcDayService; import com.jjt.calc.service.ITwinFormulaInfoService; import com.jjt.common.constant.CacheConstants; import com.jjt.common.core.controller.BaseController; import com.jjt.common.core.redis.RedisCache; import com.jjt.common.utils.DateUtils; import com.jjt.order.domain.TwinOrder; import com.jjt.order.domain.VmsStock; import com.jjt.order.service.ITwinOrderService; import com.jjt.order.utils.OrderExportUtil; import com.jjt.order.utils.OrderGsmExportUtil; import com.jjt.utils.MssqlUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @author ruoyi */ @Api("数据接口") @RestController @Slf4j @RequestMapping() public class OrderApiController extends BaseController { @Resource private RedisCache redisCache; @Resource private ITwinOrderService orderService; @Resource private ITwinFormulaInfoService formulaInfoService; @Resource private ITwinCalcDayService dayService; @ApiOperation("查看当前库存") @GetMapping("/api/stock") @CrossOrigin(origins = "*") @ResponseBody public Map mesStock() { return redisCache.getCacheObject(CacheConstants.VMS_STOCK); } @ApiOperation("导出白坯预测") @GetMapping("/api/export/order") @CrossOrigin(origins = "*") public void orderExport(String start, String end, HttpServletResponse response) { //查询订单 List orderList = orderService.selectTwinOrderListByDate(start, end); //按订单ID分组 Map orderMap = orderList.stream().collect(Collectors.toMap(TwinOrder::getOderId, o -> o)); List infos = formulaInfoService.selectTwinFormulaInfoList(new TwinFormulaInfo()); LocalDateTime ldt = LocalDateTime.now(); Date sd = DateUtils.toDate(LocalDate.now().minusDays(2)); if (ldt.getHour() > 7) { sd = DateUtils.toDate(LocalDate.now().minusDays(1)); } List dayList = dayService.selectTwinCalcDayListByTime(sd, sd); //按设备ID分组 Map dayMap = dayList.stream().collect(Collectors.toMap(TwinCalcDay::getDeviceId, o -> o)); List stocks = MssqlUtil.vmsStock(); try (OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ZipOutputStream zipOut = new ZipOutputStream(bos);) { // 创建临时输出流 response.reset(); response.setCharacterEncoding("UTF-8"); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("白坯布靶向预测" + start + "至" + end + ".zip", "UTF-8")); response.setContentType("application/octet-stream"); try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("tpl/order.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(inputStream);) { OrderExportUtil oe = new OrderExportUtil(); String title = "白坯布靶向生产测算-10天(" + start + " 至 " + end + ")\n按重量匹配"; oe.process(wb, title, orderList, infos, orderMap, dayMap, stocks); // 将第一个工作簿写入 ZIP ZipEntry entry = new ZipEntry("按重量匹配.xlsx"); zipOut.putNextEntry(entry); wb.write(zipOut); zipOut.closeEntry(); } catch (IOException ex) { ex.printStackTrace(); } try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("tpl/order-gsm.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(inputStream);) { OrderGsmExportUtil oe = new OrderGsmExportUtil(); String title = "白坯布靶向生产测算-10天(" + start + " 至 " + end + ")\n按平方米克重匹配"; oe.process(wb, title, orderList, infos, orderMap, dayMap, stocks); // 将第二个工作簿写入 ZIP ZipEntry entry = new ZipEntry("按平方米克重匹配.xlsx"); zipOut.putNextEntry(entry); wb.write(zipOut); zipOut.closeEntry(); } catch (IOException ex) { ex.printStackTrace(); } // 完成 ZIP 文件 zipOut.finish(); outputStream.write(bos.toByteArray()); outputStream.flush(); } catch (IOException e) { throw new RuntimeException(e); } } /** * 先按重量匹配,再匹配长或者宽大于规格的长宽 * * @param spec 规格 * @param stocks 库存 * @return 结果 */ private VmsStock matchStock(String spec, List stocks) { //按重量分组 Map> stockMap = stocks.stream().collect(Collectors.groupingBy(VmsStock::getWeight, LinkedHashMap::new, Collectors.toList())); if (spec != null) { String[] tmp = spec.split("\\*"); if (tmp.length == 3) { //长 float length = Float.parseFloat(tmp[0]); //宽 float width = Float.parseFloat(tmp[1]); //重量,单位kg,需要转换成克 int weight = (int) (Float.parseFloat(tmp[2]) * 1000); List tempList = stockMap.get(weight); if (tempList != null) { for (VmsStock stock : tempList) { if (length > stock.getLength() || width > stock.getLength()) { return stock; } } } } } return null; } /** * 匹配库存,新匹配方式,以幅宽和平方米克重来匹配 * 订单中计算得到毛毯平方米克重要求,根据长宽规格,先以产品长度匹配白胚库中的幅宽规格。 * 如没有或不足,以宽匹配,但此时要做标注,以准备网框的工艺切换。 * 白胚库的规格,只以平方米克重和幅宽为规格单位。 * * @param spec 规格 * @param stocks 库存 * @return 结果 */ private VmsStock matchStockGsm(String spec, List stocks) { //按重量分组 // Map> stockMap = stocks.stream().collect(Collectors.groupingBy(VmsStock::getWeight, LinkedHashMap::new, Collectors.toList())); // if (spec != null) { // String[] tmp = spec.split("\\*"); // if (tmp.length == 3) { // float length = Float.parseFloat(tmp[0]); // float width = Float.parseFloat(tmp[1]); // int weight = (int) (Float.parseFloat(tmp[2]) * 1000); // List tempList = stockMap.get(weight); // if (tempList != null) { // for (VmsStock stock : tempList) { // if (length > stock.getLength() || width > stock.getLength()) { // return stock; // } // } // } // } // } return null; } /** * 匹配产线 * * @param spec 规格 * @param list 产线 * @return 结果 */ private List matchFormula(String spec, List list) { List result = new ArrayList<>(); //按重量分组 Map> formulaMap = list.stream().collect(Collectors.groupingBy(TwinFormulaInfo::getFd18, LinkedHashMap::new, Collectors.toList())); if (spec != null) { String[] tmp = spec.split("\\*"); if (tmp.length == 3) { Float length = Float.parseFloat(tmp[0]); Float width = Float.parseFloat(tmp[1]); Float weight = Float.parseFloat(tmp[2]); List infos = formulaMap.get(weight); if (infos != null) { for (TwinFormulaInfo info : infos) { if (length.equals(info.getFd16()) && width.equals(info.getFd17()) || length.equals(info.getFd17()) && width.equals(info.getFd16())) { result.add(info); } } } } } return result; } }