OrderApiController.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. package com.ruoyi.order.controller;
  2. import com.ruoyi.biz.domain.TwinCalcDay;
  3. import com.ruoyi.biz.domain.TwinFormulaInfo;
  4. import com.ruoyi.biz.service.ITwinCalcDayService;
  5. import com.ruoyi.biz.service.ITwinFormulaInfoService;
  6. import com.ruoyi.common.core.controller.BaseController;
  7. import com.ruoyi.common.utils.DateUtils;
  8. import com.ruoyi.order.domain.MesStock;
  9. import com.ruoyi.order.domain.TwinOrder;
  10. import com.ruoyi.order.domain.TwinOrderDetail;
  11. import com.ruoyi.order.domain.VmsStock;
  12. import com.ruoyi.order.service.ITwinOrderService;
  13. import com.ruoyi.order.utils.MssqlUtil;
  14. import com.ruoyi.order.vo.BomVO;
  15. import com.ruoyi.order.vo.SkuVO;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiOperation;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.apache.poi.ss.usermodel.*;
  21. import org.apache.poi.ss.util.CellRangeAddress;
  22. import org.apache.poi.xddf.usermodel.chart.*;
  23. import org.apache.poi.xssf.usermodel.*;
  24. import org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbls;
  25. import org.springframework.web.bind.annotation.*;
  26. import javax.annotation.Resource;
  27. import javax.servlet.http.HttpServletResponse;
  28. import java.io.BufferedOutputStream;
  29. import java.io.IOException;
  30. import java.io.InputStream;
  31. import java.io.OutputStream;
  32. import java.math.BigDecimal;
  33. import java.net.URLEncoder;
  34. import java.time.LocalDate;
  35. import java.time.LocalDateTime;
  36. import java.util.*;
  37. import java.util.concurrent.atomic.AtomicInteger;
  38. import java.util.stream.Collectors;
  39. /**
  40. * @author ruoyi
  41. */
  42. @Api("数据接口")
  43. @RestController
  44. @Slf4j
  45. @RequestMapping()
  46. public class OrderApiController extends BaseController {
  47. @Resource
  48. private ITwinOrderService orderService;
  49. @Resource
  50. private ITwinFormulaInfoService formulaInfoService;
  51. @Resource
  52. private ITwinCalcDayService dayService;
  53. private CellStyle p2;
  54. private CellStyle percentStyle;
  55. private CellStyle bk;
  56. @ApiOperation("查看当前库存")
  57. @GetMapping("/api/stock")
  58. @CrossOrigin(origins = "*")
  59. @ResponseBody
  60. public Map<String, Object> mesStock() {
  61. LocalDate localDate = LocalDate.now();
  62. return MssqlUtil.mesStock(localDate);
  63. }
  64. @ApiOperation("查看当前库存")
  65. @GetMapping("/api/mes-trend")
  66. @CrossOrigin(origins = "*")
  67. @ResponseBody
  68. public Map<String, MesStock> mesTrend() {
  69. LocalDate localDate = LocalDate.now();
  70. Map<String, MesStock> map = MssqlUtil.mesTrend(localDate);
  71. List<MesStock> mesList = new ArrayList<>(map.values());
  72. return map;
  73. }
  74. @ApiOperation("导出白柸预测")
  75. @GetMapping("/api/export/order")
  76. @CrossOrigin(origins = "*")
  77. public void orderExport(String start, String end, HttpServletResponse response) {
  78. //查询订单
  79. List<TwinOrder> orderList = orderService.selectTwinOrderListByDate(start, end);
  80. //按订单ID分组
  81. Map<Long, TwinOrder> orderMap = orderList.stream().collect(Collectors.toMap(TwinOrder::getOderId, o -> o));
  82. List<TwinFormulaInfo> infos = formulaInfoService.selectTwinFormulaInfoList(new TwinFormulaInfo());
  83. LocalDateTime ldt = LocalDateTime.now();
  84. Date sd;
  85. if (ldt.getHour() > 7) {
  86. sd = DateUtils.toDate(LocalDate.now().minusDays(1));
  87. } else {
  88. sd = DateUtils.toDate(LocalDate.now().minusDays(2));
  89. }
  90. List<TwinCalcDay> dayList = dayService.selectTwinCalcDayListByTime(sd, sd);
  91. //按设备ID分组
  92. Map<Long, TwinCalcDay> dayMap = dayList.stream().collect(Collectors.toMap(TwinCalcDay::getDeviceId, o -> o));
  93. List<VmsStock> stocks = MssqlUtil.vmsStock();
  94. List<TwinOrderDetail> all = new ArrayList<>();
  95. orderList.forEach(to -> all.addAll(to.getTwinOrderDetailList()));
  96. //按规格分组
  97. Map<String, List<TwinOrderDetail>> allMap = all.stream().collect(Collectors.groupingBy(TwinOrderDetail::getBomSpec, LinkedHashMap::new, Collectors.toList()));
  98. List<BomVO> bomList = new ArrayList<>();
  99. List<SkuVO> skuList = new ArrayList<>();
  100. for (String spec : allMap.keySet()) {
  101. List<TwinOrderDetail> todList = allMap.get(spec);
  102. //匹配白柸布库存
  103. Float kc = 0f;
  104. VmsStock stock = matchStock(spec, stocks);
  105. if (stock != null) {
  106. kc = stock.getQty();
  107. }
  108. //匹配生产设备
  109. List<TwinFormulaInfo> matchFormula = matchFormula(spec, infos);
  110. BigDecimal cl = BigDecimal.ZERO;
  111. String deviceIds = "";
  112. for (TwinFormulaInfo match : matchFormula) {
  113. if (StringUtils.isNotEmpty(deviceIds)) {
  114. deviceIds += ",";
  115. }
  116. deviceIds += match.getDeviceId();
  117. TwinCalcDay day = dayMap.get(match.getDeviceId());
  118. if (day != null) {
  119. cl = cl.add(day.getWeight());
  120. }
  121. }
  122. cl = cl.multiply(BigDecimal.valueOf(1000));
  123. BomVO bom = new BomVO();
  124. bom.setDeviceIds(deviceIds);
  125. bom.setLast(cl.doubleValue());
  126. //统计订单数量
  127. long orders = todList.stream().map(TwinOrderDetail::getOderId).distinct().count();
  128. double totalWeight = todList.stream().mapToDouble(o -> o.getWeight().doubleValue()).sum();
  129. TwinOrderDetail tod = todList.get(0);
  130. bom.setBomCode(tod.getBomCode());
  131. bom.setBomName(tod.getBomName());
  132. bom.setBomSpec(spec);
  133. bom.setXql(totalWeight);
  134. bom.setKcl(kc);
  135. bom.setOrders(orders);
  136. double ycl = cl.multiply(BigDecimal.TEN).doubleValue();
  137. double cz = totalWeight - kc - ycl;
  138. bom.setYcl(ycl);
  139. bom.setCz(cz);
  140. bom.setCl(cz / totalWeight);
  141. SkuVO sku = new SkuVO();
  142. sku.setBomCode(tod.getBomCode());
  143. sku.setBomName(tod.getBomName());
  144. sku.setBomSpec(spec);
  145. if (stock != null) {
  146. sku.setSku(stock.getSku());
  147. sku.setDesc(stock.getDesc());
  148. sku.setNum(stock.getNum());
  149. sku.setQty(stock.getQty());
  150. } else {
  151. sku.setSku("");
  152. sku.setDesc("");
  153. sku.setNum(0);
  154. sku.setQty(0f);
  155. }
  156. sku.setXql(bom.getXql());
  157. List<TwinOrder> skuOrder = new ArrayList<>();
  158. //按订单分组
  159. Map<Long, List<TwinOrderDetail>> map = todList.stream().collect(Collectors.groupingBy(TwinOrderDetail::getOderId, LinkedHashMap::new, Collectors.toList()));
  160. for (Long oid : map.keySet()) {
  161. TwinOrder to = orderMap.get(oid);
  162. to.setTwinOrderDetailList(map.get(oid));
  163. skuOrder.add(to);
  164. }
  165. sku.setOrderList(skuOrder);
  166. bom.setOrderList(skuOrder);
  167. bomList.add(bom);
  168. skuList.add(sku);
  169. }
  170. try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("tpl/order.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(inputStream); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
  171. CreationHelper creationHelper = wb.getCreationHelper();
  172. percentStyle = wb.createCellStyle();
  173. percentStyle.setDataFormat(creationHelper.createDataFormat().getFormat("0.00%"));
  174. percentStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  175. p2 = wb.createCellStyle();
  176. p2.setDataFormat(wb.createDataFormat().getFormat("0.00"));
  177. p2.setVerticalAlignment(VerticalAlignment.CENTER);
  178. bk = wb.createCellStyle();
  179. bk.setFillForegroundColor(IndexedColors.LIGHT_ORANGE.getIndex());
  180. bk.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  181. XSSFSheet sheet0 = wb.getSheetAt(0);
  182. Cell title = sheet0.getRow(0).getCell(0);
  183. title.setCellValue("白柸布靶向生产测算-10天(" + start + " 至 " + end + ")");
  184. sheet0(sheet0, bomList);
  185. sheet1(wb.getSheetAt(1), stocks);
  186. sheet2(wb.getSheetAt(2), skuList);
  187. sheet3(wb.getSheetAt(3), bomList);
  188. sheet4(wb.getSheetAt(4), infos);
  189. response.reset();
  190. // 设置response的Header
  191. response.setCharacterEncoding("UTF-8");
  192. //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
  193. //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
  194. // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
  195. response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("白柸布靶向预测" + start + "至" + end + ".xlsx", "UTF-8"));
  196. response.setContentType("application/octet-stream");
  197. wb.write(outputStream);
  198. outputStream.flush();
  199. } catch (IOException ex) {
  200. ex.printStackTrace();
  201. }
  202. }
  203. /**
  204. * 总览
  205. *
  206. * @param sheet sheet
  207. * @param bomList 物料列表
  208. */
  209. private void sheet0(XSSFSheet sheet, List<BomVO> bomList) {
  210. AtomicInteger num = new AtomicInteger(3);
  211. BomVO bom = new BomVO();
  212. bom.setOrders(0L);
  213. bom.setXql(0d);
  214. bom.setKcl(0f);
  215. bom.setYcl(0d);
  216. bom.setCz(0d);
  217. bom.setCl(0d);
  218. bomList.forEach(obj -> {
  219. Row row = sheet.createRow(num.getAndIncrement());
  220. Cell[] cells = new Cell[10];
  221. for (int i = 0; i < cells.length; i++) {
  222. cells[i] = row.createCell(i);
  223. }
  224. cells[0].setCellValue(obj.getBomCode());
  225. cells[1].setCellValue(obj.getBomName());
  226. cells[2].setCellValue(obj.getBomSpec());
  227. cells[3].setCellValue(obj.getOrders());
  228. cells[4].setCellValue(obj.getXql());
  229. cells[5].setCellValue(obj.getKcl());
  230. cells[7].setCellValue(obj.getYcl());
  231. cells[8].setCellValue(obj.getCz());
  232. cells[9].setCellValue(obj.getCl());
  233. cells[9].setCellStyle(percentStyle);
  234. bom.setOrders(bom.getOrders() + obj.getOrders());
  235. bom.setXql(bom.getXql() + obj.getXql());
  236. bom.setKcl(bom.getKcl() + obj.getKcl());
  237. bom.setYcl(bom.getYcl() + obj.getYcl());
  238. bom.setCz(bom.getCz() + obj.getCz());
  239. bom.setCl(bom.getCl() + obj.getCl());
  240. });
  241. Row row = sheet.createRow(num.getAndIncrement());
  242. Cell[] cells = new Cell[10];
  243. for (int i = 0; i < cells.length; i++) {
  244. cells[i] = row.createCell(i);
  245. }
  246. cells[0].setCellValue("合计");
  247. // cells[3].setCellValue(bom.getOrders());
  248. cells[4].setCellValue(bom.getXql());
  249. cells[5].setCellValue(bom.getKcl());
  250. cells[7].setCellValue(bom.getYcl());
  251. cells[8].setCellValue(bom.getCz());
  252. for (int i = 4; i < 9; i++) {
  253. cells[i].setCellStyle(p2);
  254. }
  255. cells[9].setCellValue(bom.getCl() / bomList.size());
  256. cells[9].setCellStyle(percentStyle);
  257. // 创建一个画布
  258. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  259. // 前四个默认0,[0,4]:从0列4行开始;[7,20]:到7列20行结束
  260. // 默认宽度(14-8)*12
  261. XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 11, 3, 17, 20);
  262. // 创建一个chart对象
  263. XSSFChart chart = drawing.createChart(anchor);
  264. // 标题
  265. chart.setTitleText("需求重量占比图");
  266. // 标题是否覆盖图表
  267. chart.setTitleOverlay(false);
  268. // 图例位置
  269. XDDFChartLegend legend = chart.getOrAddLegend();
  270. legend.setPosition(LegendPosition.TOP_RIGHT);
  271. XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(3, num.get() - 2, 2, 2));
  272. // 数据1,单元格范围位置[1, 0]到[1, 6]
  273. XDDFNumericalDataSource<Double> area = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(3, num.get() - 2, 4, 4));
  274. // XDDFChartData data = chart.createData(ChartTypes.PIE3D, null, null);
  275. XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
  276. // 设置为可变颜色
  277. data.setVaryColors(true);
  278. // 图表加载数据
  279. data.addSeries(countries, area);
  280. // 绘制
  281. chart.plot(data);
  282. CTDLbls dLbls = chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();
  283. dLbls.addNewShowVal().setVal(false);
  284. dLbls.addNewShowLegendKey().setVal(false);
  285. dLbls.addNewShowCatName().setVal(true);
  286. // 类别名称
  287. dLbls.addNewShowSerName().setVal(false);
  288. dLbls.addNewShowPercent().setVal(true);
  289. // 百分比
  290. dLbls.addNewShowLeaderLines().setVal(true);
  291. // 引导线
  292. dLbls.setSeparator("\n");
  293. // 分隔符为分行符
  294. }
  295. /**
  296. * 白柸布全量
  297. *
  298. * @param sheet sheet
  299. * @param stocks 库存
  300. */
  301. private void sheet1(Sheet sheet, List<VmsStock> stocks) {
  302. AtomicInteger num = new AtomicInteger(2);
  303. stocks.forEach(stock -> {
  304. Row row = sheet.createRow(num.getAndIncrement());
  305. Cell[] cells = new Cell[6];
  306. for (int i = 0; i < cells.length; i++) {
  307. cells[i] = row.createCell(i);
  308. }
  309. cells[0].setCellValue(stock.getSku());
  310. cells[1].setCellValue(stock.getDesc());
  311. cells[2].setCellValue(stock.getNum());
  312. cells[3].setCellValue(stock.getQty());
  313. cells[3].setCellStyle(p2);
  314. // cells[4].setCellValue();
  315. // cells[5].setCellValue();
  316. });
  317. }
  318. /**
  319. * 白柸库存匹配
  320. *
  321. * @param sheet sheet
  322. * @param skuList 库存
  323. */
  324. private void sheet2(Sheet sheet, List<SkuVO> skuList) {
  325. AtomicInteger num = new AtomicInteger(3);
  326. skuList.forEach(sku -> {
  327. int sr = num.get();
  328. Row row = sheet.createRow(num.getAndIncrement());
  329. Cell[] cells = new Cell[18];
  330. for (int i = 0; i < cells.length; i++) {
  331. cells[i] = row.createCell(i);
  332. }
  333. cells[0].setCellValue(sku.getSku());
  334. cells[1].setCellValue(sku.getDesc());
  335. cells[2].setCellValue(sku.getNum());
  336. cells[3].setCellValue(sku.getQty());
  337. cells[4].setCellValue(sku.getXql());
  338. cells[3].setCellStyle(p2);
  339. cells[4].setCellStyle(p2);
  340. cells[5].setCellValue(sku.getBomCode());
  341. cells[6].setCellValue(sku.getBomName());
  342. cells[7].setCellValue(sku.getBomSpec());
  343. boolean out = false;
  344. for (TwinOrder order : sku.getOrderList()) {
  345. if (out) {
  346. row = sheet.createRow(num.getAndIncrement());
  347. cells = new Cell[18];
  348. for (int i = 0; i < cells.length; i++) {
  349. cells[i] = row.createCell(i);
  350. }
  351. }
  352. cells[8].setCellValue(DateUtils.parseDateToStr(order.getOrderDate()));
  353. cells[9].setCellValue(order.getOrderCode());
  354. cells[10].setCellValue(order.getCustomerCode());
  355. cells[11].setCellValue(order.getCustomerName());
  356. boolean in = false;
  357. int ssr = num.get() - 1;
  358. for (TwinOrderDetail detail : order.getTwinOrderDetailList()) {
  359. if (in) {
  360. row = sheet.createRow(num.getAndIncrement());
  361. cells = new Cell[18];
  362. for (int i = 0; i < cells.length; i++) {
  363. cells[i] = row.createCell(i);
  364. }
  365. }
  366. cells[12].setCellValue(detail.getColor());
  367. cells[13].setCellValue(detail.getPrice().doubleValue());
  368. cells[14].setCellValue(detail.getTotalPrice().doubleValue());
  369. cells[15].setCellValue(detail.getUnit());
  370. cells[16].setCellValue(detail.getNum().doubleValue());
  371. cells[17].setCellValue(detail.getWeight().doubleValue());
  372. in = true;
  373. }
  374. out = true;
  375. int eer = num.get() - 1;
  376. for (int i = 8; i < 12; i++) {
  377. sheet.addMergedRegion(new CellRangeAddress(ssr, eer, i, i));
  378. }
  379. }
  380. int er = num.get() - 1;
  381. for (int i = 0; i < 8; i++) {
  382. sheet.addMergedRegion(new CellRangeAddress(sr, er, i, i));
  383. }
  384. });
  385. }
  386. /**
  387. * 经编机规格分布
  388. *
  389. * @param sheet sheet
  390. * @param bomList 库存
  391. */
  392. private void sheet3(Sheet sheet, List<BomVO> bomList) {
  393. AtomicInteger num = new AtomicInteger(3);
  394. bomList.forEach(obj -> {
  395. int sr = num.get();
  396. Row row = sheet.createRow(num.getAndIncrement());
  397. Cell[] cells = new Cell[18];
  398. for (int i = 0; i < cells.length; i++) {
  399. cells[i] = row.createCell(i);
  400. }
  401. cells[0].setCellValue(obj.getBomCode());
  402. cells[1].setCellValue(obj.getBomName());
  403. cells[2].setCellValue(obj.getBomSpec());
  404. cells[3].setCellValue(obj.getXql());
  405. cells[4].setCellValue(obj.getDeviceIds());
  406. cells[5].setCellValue(obj.getLast());
  407. cells[6].setCellValue(obj.getYcl());
  408. boolean out = false;
  409. for (TwinOrder order : obj.getOrderList()) {
  410. if (out) {
  411. row = sheet.createRow(num.getAndIncrement());
  412. cells = new Cell[18];
  413. for (int i = 0; i < cells.length; i++) {
  414. cells[i] = row.createCell(i);
  415. }
  416. }
  417. Cell xql = cells[7];
  418. cells[8].setCellValue(DateUtils.parseDateToStr(order.getOrderDate()));
  419. cells[9].setCellValue(order.getOrderCode());
  420. cells[10].setCellValue(order.getCustomerCode());
  421. cells[11].setCellValue(order.getCustomerName());
  422. boolean in = false;
  423. int ssr = num.get() - 1;
  424. BigDecimal ow = BigDecimal.ZERO;
  425. for (TwinOrderDetail detail : order.getTwinOrderDetailList()) {
  426. if (in) {
  427. row = sheet.createRow(num.getAndIncrement());
  428. cells = new Cell[18];
  429. for (int i = 0; i < cells.length; i++) {
  430. cells[i] = row.createCell(i);
  431. }
  432. }
  433. cells[12].setCellValue(detail.getColor());
  434. cells[13].setCellValue(detail.getPrice().doubleValue());
  435. cells[14].setCellValue(detail.getTotalPrice().doubleValue());
  436. cells[15].setCellValue(detail.getUnit());
  437. cells[16].setCellValue(detail.getNum().doubleValue());
  438. cells[17].setCellValue(detail.getWeight().doubleValue());
  439. ow = ow.add(detail.getWeight());
  440. in = true;
  441. }
  442. xql.setCellValue(ow.doubleValue());
  443. xql.setCellStyle(p2);
  444. out = true;
  445. int eer = num.get() - 1;
  446. for (int i = 7; i < 12; i++) {
  447. sheet.addMergedRegion(new CellRangeAddress(ssr, eer, i, i));
  448. }
  449. }
  450. int er = num.get() - 1;
  451. for (int i = 0; i < 7; i++) {
  452. sheet.addMergedRegion(new CellRangeAddress(sr, er, i, i));
  453. }
  454. });
  455. }
  456. /**
  457. * 白柸布库存--全量
  458. *
  459. * @param sheet sheet
  460. * @param infos 库存
  461. */
  462. private void sheet4(Sheet sheet, List<TwinFormulaInfo> infos) {
  463. AtomicInteger num = new AtomicInteger(3);
  464. infos.sort(Comparator.comparing(TwinFormulaInfo::getFd18).reversed().thenComparing(TwinFormulaInfo::getFd16).thenComparing(TwinFormulaInfo::getFd17).thenComparing(TwinFormulaInfo::getFd3));
  465. infos.forEach(info -> {
  466. Row row = sheet.createRow(num.getAndIncrement());
  467. Cell[] cells = new Cell[35];
  468. for (int i = 0; i < cells.length; i++) {
  469. cells[i] = row.createCell(i);
  470. }
  471. cells[0].setCellValue(info.getFd18());
  472. cells[1].setCellValue(info.getFd16());
  473. cells[2].setCellValue(info.getFd17());
  474. cells[3].setCellValue(info.getFd3());
  475. cells[4].setCellValue(info.getFd15());
  476. cells[5].setCellValue(info.getFd4());
  477. cells[6].setCellValue(info.getFd5());
  478. cells[7].setCellValue(info.getFd6());
  479. cells[8].setCellValue(info.getFd2());
  480. cells[9].setCellValue(info.getFd1());
  481. cells[10].setCellValue(info.getFd13());
  482. cells[11].setCellValue(info.getFd14());
  483. cells[12].setCellValue(info.getFd24());
  484. cells[13].setCellValue(info.getFd25());
  485. cells[14].setCellValue(info.getCd10());
  486. cells[15].setCellValue(info.getCd11());
  487. cells[16].setCellValue(info.getCd12());
  488. cells[17].setCellValue(info.getCd13());
  489. cells[18].setCellValue(info.getCd14());
  490. cells[19].setCellValue(info.getCd15());
  491. cells[20].setCellValue(info.getCd16());
  492. cells[21].setCellValue(info.getCd17());
  493. cells[22].setCellValue(info.getCd18());
  494. cells[23].setCellValue(info.getCd19());
  495. cells[24].setCellValue(info.getFd19());
  496. cells[25].setCellValue(info.getFd20());
  497. cells[26].setCellValue(info.getFd21());
  498. cells[27].setCellValue(info.getFd22());
  499. cells[28].setCellValue(info.getFd23());
  500. cells[29].setCellValue(info.getFd7());
  501. cells[30].setCellValue(info.getFd8());
  502. cells[31].setCellValue(info.getFd9());
  503. cells[32].setCellValue(info.getFd10());
  504. cells[33].setCellValue(info.getFd11());
  505. cells[34].setCellValue(info.getFd12());
  506. });
  507. }
  508. /**
  509. * 匹配库存
  510. *
  511. * @param spec 规格
  512. * @param stocks 库存
  513. * @return 结果
  514. */
  515. private VmsStock matchStock(String spec, List<VmsStock> stocks) {
  516. //按重量分组
  517. Map<Integer, List<VmsStock>> stockMap = stocks.stream().collect(Collectors.groupingBy(VmsStock::getWeight, LinkedHashMap::new, Collectors.toList()));
  518. if (spec != null) {
  519. String[] tmp = spec.split("\\*");
  520. if (tmp.length == 3) {
  521. Float length = Float.parseFloat(tmp[0]);
  522. Float width = Float.parseFloat(tmp[1]);
  523. int weight = (int) (Float.parseFloat(tmp[2]) * 1000);
  524. List<VmsStock> tempList = stockMap.get(weight);
  525. if (tempList != null) {
  526. for (VmsStock stock : tempList) {
  527. if (length > stock.getLength() || width > stock.getLength()) {
  528. return stock;
  529. }
  530. }
  531. }
  532. }
  533. }
  534. return null;
  535. }
  536. /**
  537. * 匹配产线
  538. *
  539. * @param spec 规格
  540. * @param list 产线
  541. * @return 结果
  542. */
  543. private List<TwinFormulaInfo> matchFormula(String spec, List<TwinFormulaInfo> list) {
  544. List<TwinFormulaInfo> result = new ArrayList<>();
  545. //按重量分组
  546. Map<Float, List<TwinFormulaInfo>> formulaMap = list.stream().collect(Collectors.groupingBy(TwinFormulaInfo::getFd18, LinkedHashMap::new, Collectors.toList()));
  547. if (spec != null) {
  548. String[] tmp = spec.split("\\*");
  549. if (tmp.length == 3) {
  550. Float length = Float.parseFloat(tmp[0]);
  551. Float width = Float.parseFloat(tmp[1]);
  552. Float weight = Float.parseFloat(tmp[2]);
  553. List<TwinFormulaInfo> infos = formulaMap.get(weight);
  554. if (infos != null) {
  555. for (TwinFormulaInfo info : infos) {
  556. if (length.equals(info.getFd16()) && width.equals(info.getFd17()) ||
  557. length.equals(info.getFd17()) && width.equals(info.getFd16())) {
  558. result.add(info);
  559. }
  560. }
  561. }
  562. }
  563. }
  564. return result;
  565. }
  566. }