123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- 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<String, Object> mesStock() {
- return redisCache.getCacheObject(CacheConstants.VMS_STOCK);
- }
- @ApiOperation("导出白坯预测")
- @GetMapping("/api/export/order")
- @CrossOrigin(origins = "*")
- public void orderExport(String start, String end, HttpServletResponse response) {
- //查询订单
- List<TwinOrder> orderList = orderService.selectTwinOrderListByDate(start, end);
- //按订单ID分组
- Map<Long, TwinOrder> orderMap = orderList.stream().collect(Collectors.toMap(TwinOrder::getOderId, o -> o));
- List<TwinFormulaInfo> 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<TwinCalcDay> dayList = dayService.selectTwinCalcDayListByTime(sd, sd);
- //按设备ID分组
- Map<Long, TwinCalcDay> dayMap = dayList.stream().collect(Collectors.toMap(TwinCalcDay::getDeviceId, o -> o));
- List<VmsStock> 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<VmsStock> stocks) {
- //按重量分组
- Map<Integer, List<VmsStock>> 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<VmsStock> 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<VmsStock> stocks) {
- //按重量分组
- // Map<Integer, List<VmsStock>> 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<VmsStock> 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<TwinFormulaInfo> matchFormula(String spec, List<TwinFormulaInfo> list) {
- List<TwinFormulaInfo> result = new ArrayList<>();
- //按重量分组
- Map<Float, List<TwinFormulaInfo>> 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<TwinFormulaInfo> 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;
- }
- }
|