Prechádzať zdrojové kódy

平方米克重处理

wukai 11 mesiacov pred
rodič
commit
7a2298f7f2

+ 1 - 1
ruoyi-admin/pom.xml

@@ -146,7 +146,7 @@
                 </configuration>
             </plugin> -->
         </plugins>
-        <finalName>${project.artifactId}</finalName>
+        <finalName>twin</finalName>
     </build>
 
 </project>

+ 106 - 14
ruoyi-admin/src/main/java/com/ruoyi/biz/controller/ApiController.java

@@ -65,6 +65,8 @@ public class ApiController extends BaseController {
     private String totalExcelTemplate;
     @Value("${excel.formula}")
     private String formulaExcelTemplate;
+    @Value("${excel.gram}")
+    private String gramExcelTemplate;
 
     @ApiOperation("在线设备")
     @GetMapping("/device/online")
@@ -150,19 +152,6 @@ public class ApiController extends BaseController {
         return R.ok(result);
     }
 
-    @ApiOperation("配方统计")
-    @GetMapping("/formula/total")
-    @CrossOrigin(origins = "*")
-    public R<List<FormulaTotal>> formulaTotal() {
-        Object d = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_FORMULA_TOTAL);
-        if (d != null) {
-            List<FormulaTotal> list = (List<FormulaTotal>) d;
-            return R.ok(list);
-        } else {
-            return R.fail();
-        }
-    }
-
     @ApiOperation("送经量")
     @GetMapping("/warp/run-in")
     @CrossOrigin(origins = "*")
@@ -220,10 +209,113 @@ public class ApiController extends BaseController {
         }
     }
 
+
+    @ApiOperation("平方米克重")
+    @GetMapping("/gram-mass/total")
+    @CrossOrigin(origins = "*")
+    public R<List<GramMass>> gramMass() {
+        Object d = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_GRAM_MASS);
+        if (d != null) {
+            List<GramMass> list = (List<GramMass>) d;
+            return R.ok(list);
+        } else {
+            return R.fail();
+        }
+    }
+
+    @ApiOperation("平方米克重详情")
+    @GetMapping("/gram-mass/detail/{gramMass}")
+    @CrossOrigin(origins = "*")
+    public R<List<GramMassDetail>> gramMassDetail(@PathVariable Float gramMass) {
+        Object d = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_GRAM_MASS_DETAIL);
+        if (d != null) {
+            List<GramMassDetail> list = (List<GramMassDetail>) d;
+            list = list.stream().filter(detail -> detail.getGramMass().equals(gramMass)).collect(Collectors.toList());
+            return R.ok(list);
+        } else {
+            return R.fail();
+        }
+    }
+
+    @ApiOperation("平方米克重导出")
+    @GetMapping("/gram-mass/export")
+    @CrossOrigin(origins = "*")
+    public void gramMassExport(HttpServletResponse response) {
+        Object total = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_GRAM_MASS);
+        Object detail = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_GRAM_MASS_DETAIL);
+        if (total != null && detail != null) {
+            List<GramMass> list = (List<GramMass>) total;
+            List<GramMassDetail> details = (List<GramMassDetail>) detail;
+            try (FileInputStream inputStream = new FileInputStream(gramExcelTemplate); Workbook wb = new XSSFWorkbook(inputStream); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
+                Sheet sheet = wb.getSheetAt(0);
+
+                CreationHelper creationHelper = wb.getCreationHelper();
+                CellStyle percentStyle = wb.createCellStyle();
+                percentStyle.setDataFormat(creationHelper.createDataFormat().getFormat("0.00%"));
+                CellStyle p2 = wb.createCellStyle();
+                p2.setDataFormat(wb.createDataFormat().getFormat("0.00"));
+                AtomicInteger rowNum = new AtomicInteger(1);
+                list.forEach(gram -> {
+                    Row row = sheet.createRow(rowNum.get());
+                    Cell[] cells = new Cell[3];
+                    for (int i = 0; i < cells.length; i++) {
+                        cells[i] = row.createCell(i);
+                    }
+                    cells[0].setCellValue(gram.getGramMass());
+                    cells[0].setCellStyle(p2);
+                    cells[1].setCellValue(gram.getNum());
+                    cells[2].setCellValue(gram.getPercent());
+                    cells[2].setCellStyle(percentStyle);
+                    rowNum.getAndIncrement();
+                    Sheet ns = wb.cloneSheet(1);
+                    wb.setSheetName(wb.getSheetIndex(ns), gram.getGramMass() + "克明细");
+                    AtomicInteger detailRowNum = new AtomicInteger(2);
+                    details.stream().filter(d -> d.getGramMass().equals(gram.getGramMass())).forEach(d -> {
+                        Row dRow = ns.createRow(detailRowNum.get());
+                        Cell[] dCells = new Cell[24];
+                        for (int i = 0; i < dCells.length; i++) {
+                            dCells[i] = dRow.createCell(i);
+                        }
+                        dCells[2].setCellStyle(p2);
+                        d.setCells(dCells);
+                        detailRowNum.getAndIncrement();
+                    });
+                });
+                wb.removeSheetAt(1);
+                // 清空response
+                response.reset();
+                // 设置response的Header
+                response.setCharacterEncoding("UTF-8");
+                //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
+                //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
+                // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
+                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("平方米克重明细导出" + System.currentTimeMillis() + ".xlsx", "UTF-8"));
+                response.setContentType("application/octet-stream");
+                wb.write(outputStream);
+                outputStream.flush();
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    @ApiOperation("配方统计")
+    @GetMapping("/formula/total")
+    @CrossOrigin(origins = "*")
+    public R<List<FormulaTotal>> formulaTotal() {
+        Object d = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_FORMULA_TOTAL);
+        if (d != null) {
+            List<FormulaTotal> list = (List<FormulaTotal>) d;
+            return R.ok(list);
+        } else {
+            return R.fail();
+        }
+    }
+
     @ApiOperation("配方详情")
     @GetMapping("/formula/detail/{height}")
     @CrossOrigin(origins = "*")
-    public R<List> formulaDetail(@PathVariable Float height) {
+    public R<List<FormulaDetail>> formulaDetail(@PathVariable Float height) {
         Object d = CacheUtils.get(Constants.IOT_TOKEN, Constants.INDEX_FORMULA_DETAIL);
         if (d != null) {
             List<FormulaDetail> list = (List<FormulaDetail>) d;

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/biz/domain/GramMass.java

@@ -0,0 +1,22 @@
+package com.ruoyi.biz.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 平方米克重
+ *
+ * @author wukai
+ * @date 2024/5/8 15:50
+ */
+@ApiModel(value = "GramMass", description = "平方米克重统计")
+@Data
+public class GramMass {
+    @ApiModelProperty("平方米克重")
+    private Float gramMass;
+    @ApiModelProperty("数量")
+    private Integer num;
+    @ApiModelProperty("占比")
+    private Float percent;
+}

+ 144 - 0
ruoyi-admin/src/main/java/com/ruoyi/biz/domain/GramMassDetail.java

@@ -0,0 +1,144 @@
+package com.ruoyi.biz.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.poi.ss.usermodel.Cell;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Map;
+
+/**
+ * 平方米克重
+ *
+ * @author wukai
+ * @date 2024/5/8 15:50
+ */
+@ApiModel(value = "GramMass", description = "平方米克重统计")
+@Data
+public class GramMassDetail {
+    @ApiModelProperty("设备信息")
+    private String device;
+    @ApiModelProperty("平方米克重")
+    private Float gramMass;
+    @ApiModelProperty("配方号")
+    private Integer formula_data_1;
+    @ApiModelProperty("机台号")
+    private Integer formula_data_2;
+    @ApiModelProperty("米克重")
+    private Integer formula_data_3;
+    @ApiModelProperty("L1、L5纱线规格D")
+    private Integer formula_data_4;
+    @ApiModelProperty("L2、L4纱线规格D")
+    private Integer formula_data_5;
+    @ApiModelProperty("L3纱线规格D")
+    private Integer formula_data_6;
+    @ApiModelProperty("L1、L5纱线规格F")
+    private Integer formula_data_7;
+    @ApiModelProperty("L2、L4纱线规格F")
+    private Integer formula_data_8;
+    @ApiModelProperty("L3纱线规格F")
+    private Integer formula_data_9;
+    @ApiModelProperty("L1、L5盘头根数")
+    private Integer formula_data_10;
+    @ApiModelProperty("L2、L4盘头根数")
+    private Integer formula_data_11;
+    @ApiModelProperty("L3盘头根数")
+    private Integer formula_data_12;
+    @ApiModelProperty("卷曲幅宽")
+    private Float formula_data_13;
+    @ApiModelProperty("下布长度")
+    private Float formula_data_14;
+    @ApiModelProperty("毛高")
+    private Float formula_data_15;
+    @ApiModelProperty("成品长")
+    private Float formula_data_16;
+    @ApiModelProperty("成品宽")
+    private Float formula_data_17;
+    @ApiModelProperty("成品重")
+    private Float formula_data_18;
+    @ApiModelProperty("GB1送经量")
+    private Integer formula_data_19;
+    @ApiModelProperty("GB2送经量")
+    private Integer formula_data_20;
+    @ApiModelProperty("GB3送经量")
+    private Integer formula_data_21;
+    @ApiModelProperty("GB4送经量")
+    private Integer formula_data_22;
+    @ApiModelProperty("GB5送经量")
+    private Integer formula_data_23;
+    @ApiModelProperty("牵拉密度")
+    private Float formula_data_24;
+    @ApiModelProperty("卷曲张力系数")
+    private Float formula_data_25;
+
+    public GramMassDetail(Map<String, Object> map) {
+        TwinDevice twinDevice = (TwinDevice) map.get("device");
+        this.device = twinDevice.getDeviceName();
+        this.formula_data_1 = (int) map.get("Formula_data_1");
+        this.formula_data_2 = (int) map.get("Formula_data_2");
+        this.formula_data_3 = (int) map.get("Formula_data_3");
+        this.formula_data_4 = (int) map.get("Formula_data_4");
+        this.formula_data_5 = (int) map.get("Formula_data_5");
+        this.formula_data_6 = (int) map.get("Formula_data_6");
+        this.formula_data_7 = (int) map.get("Formula_data_7");
+        this.formula_data_8 = (int) map.get("Formula_data_8");
+        this.formula_data_9 = (int) map.get("Formula_data_9");
+        this.formula_data_10 = (int) map.get("Formula_data_10");
+        this.formula_data_11 = (int) map.get("Formula_data_11");
+        this.formula_data_12 = (int) map.get("Formula_data_12");
+        this.formula_data_13 = (float) map.get("Formula_data_13");
+        this.formula_data_14 = (float) map.get("Formula_data_14");
+        this.formula_data_15 = (float) map.get("Formula_data_15");
+        this.formula_data_16 = (float) map.get("Formula_data_16");
+        this.formula_data_17 = (float) map.get("Formula_data_17");
+        this.formula_data_18 = (float) map.get("Formula_data_18");
+        this.formula_data_19 = (int) map.get("Formula_data_19");
+        this.formula_data_20 = (int) map.get("Formula_data_20");
+        this.formula_data_21 = (int) map.get("Formula_data_21");
+        this.formula_data_22 = (int) map.get("Formula_data_22");
+        this.formula_data_23 = (int) map.get("Formula_data_23");
+        this.formula_data_24 = (float) map.get("Formula_data_24");
+        this.formula_data_25 = (float) map.get("Formula_data_25");
+        this.gramMass = 0f;
+        //长
+        BigDecimal length = BigDecimal.valueOf(this.formula_data_16);
+        //宽
+        BigDecimal width = BigDecimal.valueOf(this.formula_data_17);
+        //面积
+        BigDecimal area = length.multiply(width);
+        //重量,单位kg,需要转换成克
+        BigDecimal weight = BigDecimal.valueOf(this.formula_data_18 * 1000);
+        if (area.floatValue() != 0 && weight.floatValue() != 0) {
+            this.gramMass = weight.divide(area, 2, RoundingMode.HALF_UP).floatValue();
+        }
+    }
+
+    public void setCells(Cell[] cells) {
+        cells[0].setCellValue(this.device);
+        cells[1].setCellValue(this.formula_data_2);
+        cells[2].setCellValue(this.gramMass);
+        cells[3].setCellValue(this.formula_data_19);
+        cells[4].setCellValue(this.formula_data_20);
+        cells[5].setCellValue(this.formula_data_21);
+        cells[6].setCellValue(this.formula_data_22);
+        cells[7].setCellValue(this.formula_data_23);
+        cells[8].setCellValue(this.formula_data_4);
+        cells[9].setCellValue(this.formula_data_5);
+        cells[10].setCellValue(this.formula_data_6);
+        cells[11].setCellValue(this.formula_data_7);
+        cells[12].setCellValue(this.formula_data_8);
+        cells[13].setCellValue(this.formula_data_9);
+        cells[14].setCellValue(this.formula_data_10);
+        cells[15].setCellValue(this.formula_data_11);
+        cells[16].setCellValue(this.formula_data_12);
+        cells[17].setCellValue(this.formula_data_13);
+        cells[18].setCellValue(this.formula_data_14);
+        cells[19].setCellValue(this.formula_data_16);
+        cells[20].setCellValue(this.formula_data_17);
+        cells[21].setCellValue(this.formula_data_18);
+        cells[22].setCellValue(this.formula_data_24);
+        cells[23].setCellValue(this.formula_data_25);
+    }
+}

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/biz/domain/WarpRunIn.java

@@ -9,7 +9,7 @@ import org.apache.poi.ss.usermodel.CellStyle;
 import java.util.Map;
 
 /**
- * 周曲线
+ * 送经量
  *
  * @author wukai
  * @date 2024/5/8 15:50

+ 24 - 2
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/ApiServiceImpl.java

@@ -108,9 +108,15 @@ public class ApiServiceImpl implements IApiService {
         List<IndexPan> panList = new ArrayList<>();
         //配方统计数据
         List<FormulaTotal> formulaTotal = new ArrayList<>();
-        List<WarpRunIn> warpList = new ArrayList<>();
         //配方明细数据
         List<FormulaDetail> formulaDetail = new ArrayList<>();
+        //送经量
+        List<WarpRunIn> warpList = new ArrayList<>();
+        //平方米克重统计数据
+        List<GramMass> gramMasses = new ArrayList<>();
+        //平方米克重明细数据
+        List<GramMassDetail> gramMassDetails = new ArrayList<>();
+
         int stop1 = 0, stop2 = 0, stop6 = 0, stop8 = 0;
         iotService.getToken();
         TwinDevice searchDevice = new TwinDevice();
@@ -143,7 +149,9 @@ public class ApiServiceImpl implements IApiService {
                 //处理送经量数据
                 WarpRunIn warpRunIn = new WarpRunIn(map);
                 warpList.add(warpRunIn);
-
+                //处理平方米克重明细数据
+                GramMassDetail gramMassDetail = new GramMassDetail(map);
+                gramMassDetails.add(gramMassDetail);
 
                 int data4 = (int) map.get("Capacity_data_4");
                 if (data4 == 0) {
@@ -257,9 +265,23 @@ public class ApiServiceImpl implements IApiService {
             formulaTotal.add(total);
         }
 
+        temp = gramMassDetails.stream().collect(Collectors.groupingBy(GramMassDetail::getGramMass, Collectors.counting()));
+        for (Float v : temp.keySet()) {
+            GramMass total = new GramMass();
+            total.setGramMass(v);
+            int num = Math.toIntExact(temp.get(v));
+            total.setNum(num);
+            float percent = BigDecimal.valueOf(num).divide(BigDecimal.valueOf(list.size()), 2, RoundingMode.HALF_UP).floatValue();
+            total.setPercent(percent);
+            gramMasses.add(total);
+        }
+
+
         CacheUtils.put(Constants.IOT_TOKEN, Constants.INDEX_FORMULA_TOTAL, formulaTotal);
         CacheUtils.put(Constants.IOT_TOKEN, Constants.INDEX_FORMULA_DETAIL, formulaDetail);
         CacheUtils.put(Constants.IOT_TOKEN, Constants.INDEX_WARP_RUN_IN, warpList);
+        CacheUtils.put(Constants.IOT_TOKEN, Constants.INDEX_GRAM_MASS, gramMasses);
+        CacheUtils.put(Constants.IOT_TOKEN, Constants.INDEX_GRAM_MASS_DETAIL, gramMassDetails);
     }
 
     @PostConstruct

+ 29 - 0
ruoyi-admin/src/main/java/com/ruoyi/biz/tools/Tools.java

@@ -2,6 +2,7 @@ package com.ruoyi.biz.tools;
 
 import cn.hutool.json.JSONArray;
 import javafx.util.Pair;
+import org.apache.poi.ss.usermodel.*;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -240,4 +241,32 @@ public class Tools {
         return new Pair<>(sTime, eTime);
     }
 
+    /**
+     * 复制sheet
+     *
+     * @param sourceSheet 源sheet
+     * @param targetSheet 目录sheet
+     * @param workbook    wb
+     */
+    public static void copyTitleRowWithStyles(Sheet sourceSheet, Sheet targetSheet, Workbook workbook) {
+        if (sourceSheet != null && targetSheet != null) {
+            Row sourceRow = sourceSheet.getRow(0);
+            // 假设标题行在第0行
+            if (sourceRow != null) {
+                Row targetRow = targetSheet.createRow(0);
+                for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
+                    Cell sourceCell = sourceRow.getCell(i);
+                    Cell targetCell = targetRow.createCell(i);
+                    // 复制单元格值
+                    targetCell.setCellValue(sourceCell.getStringCellValue());
+                    // 复制单元格样式
+                    CellStyle sourceCellStyle = sourceCell.getCellStyle();
+                    CellStyle targetCellStyle = workbook.createCellStyle();
+                    targetCellStyle.cloneStyleFrom(sourceCellStyle);
+                    targetCell.setCellStyle(targetCellStyle);
+                }
+            }
+        }
+    }
+
 }

+ 1 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -10,6 +10,7 @@ iot:
 excel:
   total: D:\SYSTEM\Desktop\temp\excel\total.xlsx
   formula: D:\SYSTEM\Desktop\temp\excel\formula.xlsx
+  gram: D:\SYSTEM\Desktop\temp\excel\gram.xlsx
 #数据补录
 #data:
 #  bl: false

+ 8 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -90,6 +90,14 @@ public class Constants {
      */
     public static final String INDEX_WARP_RUN_IN = "indexWarpRunIn";
     /**
+     * 平方米克重明细
+     */
+    public static final String INDEX_GRAM_MASS_DETAIL = "indexGramMassDetail";
+    /**
+     * 平方米克重
+     */
+    public static final String INDEX_GRAM_MASS = "indexGramMass";
+    /**
      * 首页配方明细缓存
      */
     public static final String INDEX_FORMULA_DETAIL = "indexFormulaDetail";