Browse Source

Merge remote-tracking branch 'origin/master'

周壕 1 year ago
parent
commit
f9606ec337

BIN
lib/aspose-cells-18.9.jar


+ 46 - 0
src/main/java/META-INF/MANIFEST.MF

@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Main-Class: com.bowintek.practice.PracticeApplication
+Class-Path: HikariCP-4.0.3.jar postgresql-42.3.4.jar java-jwt-3.9.0.jar 
+ netty-common-4.1.79.Final.jar netty-codec-4.1.79.Final.jar httpcore-4.4
+ .15.jar lucene-queryparser-4.7.2.jar commons-collections4-4.2.jar logba
+ ck-core-1.2.11.jar httpclient-4.5.9.jar lettuce-core-6.1.9.RELEASE.jar 
+ commons-pool2-2.11.1.jar spring-oxm-5.3.22.jar lucene-sandbox-4.7.2.jar
+  netty-handler-4.1.79.Final.jar spring-core-5.3.22.jar spring-jdbc-5.3.
+ 22.jar log4j-api-2.17.2.jar opentelemetry-context-1.29.0.jar mysql-conn
+ ector-java-8.0.29.jar commons-net-3.6.jar tomcat-embed-el-9.0.65.jar sn
+ akeyaml-1.30.jar spring-boot-starter-tomcat-2.7.2.jar gson-2.9.0.jar my
+ batis-3.5.9.jar spring-boot-2.7.2.jar jsr305-3.0.2.jar poi-4.0.0.jar ne
+ tty-transport-4.1.79.Final.jar jackson-core-2.13.3.jar log4j-to-slf4j-2
+ .17.2.jar httpcore-nio-4.4.15.jar jul-to-slf4j-1.7.36.jar tomcat-embed-
+ core-9.0.65.jar parsson-1.0.0.jar mybatis-spring-boot-starter-2.2.2.jar
+  spring-context-support-5.3.22.jar spring-boot-starter-jdbc-2.7.2.jar s
+ pring-boot-devtools-2.7.2.jar juh-4.1.2.jar jsqlparser-4.2.jar jackson-
+ annotations-2.13.3.jar json-20190722.jar lucene-analyzers-common-4.7.2.
+ jar pagehelper-spring-boot-autoconfigure-1.4.3.jar poi-ooxml-schemas-4.
+ 0.0.jar poi-ooxml-4.0.0.jar tomcat-embed-websocket-9.0.65.jar jakarta.a
+ nnotation-api-1.3.5.jar xmlbeans-3.0.1.jar spring-aop-5.3.22.jar spring
+ -context-5.3.22.jar lucene-core-4.7.2.jar commons-collections-3.2.2.jar
+  jodconverter-local-4.4.6.jar pagehelper-5.3.1.jar commons-beanutils-1.
+ 9.4.jar commons-compress-1.18.jar unoil-4.1.2.jar spring-webmvc-5.3.22.
+ jar spring-boot-starter-json-2.7.2.jar lombok-1.18.20.jar spring-expres
+ sion-5.3.22.jar jakarta.json-api-2.0.1.jar pagehelper-spring-boot-start
+ er-1.4.3.jar spring-boot-starter-2.7.2.jar commons-codec-1.15.jar sprin
+ g-tx-5.3.22.jar elasticsearch-java-8.11.1.jar postgresql-42.3.6.jar spr
+ ing-data-keyvalue-2.7.2.jar spring-data-redis-2.7.2.jar spring-boot-sta
+ rter-logging-2.7.2.jar spring-boot-autoconfigure-2.7.2.jar opentelemetr
+ y-api-1.29.0.jar checker-qual-3.5.0.jar lucene-queries-4.7.2.jar elasti
+ csearch-rest-client-7.17.4.jar curvesapi-1.04.jar druid-spring-boot-sta
+ rter-1.2.11.jar netty-buffer-4.1.79.Final.jar spring-data-commons-2.7.2
+ .jar aspectjweaver-1.9.7.jar spring-web-5.3.22.jar jackson-databind-2.1
+ 3.3.jar druid-1.2.11.jar fastjson-1.2.47.jar netty-transport-native-uni
+ x-common-4.1.79.Final.jar jackson-module-parameter-names-2.13.3.jar asp
+ ectjrt-1.9.7.jar jackson-datatype-jdk8-2.13.3.jar slf4j-api-1.7.36.jar 
+ spring-beans-5.3.22.jar httpasyncclient-4.1.5.jar reactor-core-3.4.21.j
+ ar netty-resolver-4.1.79.Final.jar spring-jcl-5.3.22.jar ridl-4.1.2.jar
+  jackson-datatype-jsr310-2.13.3.jar mybatis-spring-boot-autoconfigure-2
+ .2.2.jar mybatis-spring-2.0.7.jar aspose-words-15.8.0-jdk16.jar logback
+ -classic-1.2.11.jar reactive-streams-1.0.4.jar jurt-4.1.2.jar jodconver
+ ter-core-4.4.6.jar aspose-cells-18.9.jar poi-scratchpad-4.0.0.jar sprin
+ g-boot-starter-data-redis-2.7.2.jar ikanalyzer-2012_u6.jar spring-boot-
+ starter-web-2.7.2.jar commons-lang3-3.5.jar commons-logging-1.2.jar
+

+ 317 - 12
src/main/java/com/bowintek/practice/controller/WellInfoController.java

@@ -1,5 +1,10 @@
 package com.bowintek.practice.controller;
 
+import com.alibaba.druid.support.logging.Log;
+import com.aspose.cells.License;
+import com.aspose.cells.PdfSaveOptions;
+import com.aspose.cells.SaveFormat;
+import com.aspose.cells.SaveOptions;
 import com.bowintek.practice.AppConfig;
 import com.bowintek.practice.filter.exception.BaseResponse;
 import com.bowintek.practice.filter.exception.RespGenerstor;
@@ -10,22 +15,29 @@ import com.bowintek.practice.services.service.WellInfoService;
 import com.bowintek.practice.util.RemoteHelper;
 import com.bowintek.practice.vo.query.WellInfoParams;
 import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.hwpf.HWPFDocument;
+import org.apache.poi.hwpf.extractor.WordExtractor;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.Units;
+import org.apache.poi.xssf.usermodel.*;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.io.*;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping(value = "/api/wellInfo")
+@Slf4j
 public class WellInfoController {
 
     @Autowired
@@ -132,19 +144,312 @@ public class WellInfoController {
         byte[] bytes = Base64.getMimeDecoder().decode(reData);
         OutputStream os = response.getOutputStream();
 
-        /*if (isShow == null || 1 != isShow) {
-            response.setContentType("application/force-download");// 设置强制下载不打开
-        }*/
+        if (isShow != null && 1 == isShow) {
+            //如果是预览需要把doc转docx,xls转xlsx,前端预览插件不支持这两种格式
+            if (fileName.toLowerCase().endsWith(".doc")) {
+                bytes = doc2Docx(bytes);
+            } else if (fileName.toLowerCase().endsWith(".xls")) {
+                bytes = xls2pdf(bytes);
+            }
+        }
+
         response.setContentType("multipart/form-data;charset=UTF-8");
-        response.setHeader("Content-Length", String.valueOf(bytes.length));
         response.addHeader("Content-Disposition",
                 "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));// 设置文件名
+        response.setHeader("Content-Length", String.valueOf(bytes.length));
 
-        //os.write(reData.getBytes(StandardCharsets.UTF_8));
         os.write(bytes);
+
         if (null != os) {
             os.flush();
             os.close();
         }
     }
+
+    private byte[] xls2pdf(byte[] bytes) {
+        long old = System.currentTimeMillis();
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        try {
+            License aposeLic = new License();
+            InputStream license = ClassLoader.getSystemClassLoader().getResourceAsStream("license-cell.xml");
+            aposeLic.setLicense(license);
+
+            com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(new ByteArrayInputStream(bytes));
+            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
+            pdfSaveOptions.setOnePagePerSheet(true);
+            int[] autoDrawSheets = {3};
+            //当excel中对应的sheet页宽度太大时,在PDF中会拆断并分页。此处等比缩放。
+            autoDraw(wb, autoDrawSheets);
+            wb.save(outputStream, pdfSaveOptions);
+            bytes = outputStream.toByteArray();
+            outputStream.flush();
+            long now = System.currentTimeMillis();
+            log.info("共耗时:{}", ((now - old) / 1000.0));
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } ;
+            }
+        }
+        return bytes;
+    }
+
+
+    /**
+     * 设置打印的sheet 自动拉伸比例
+     *
+     * @param wb
+     * @param page 自动拉伸的页的sheet数组
+     */
+    public static void autoDraw(com.aspose.cells.Workbook wb, int[] page) {
+        if (null != page && page.length > 0) {
+            for (int i = 0; i < page.length; i++) {
+                wb.getWorksheets().get(i).getHorizontalPageBreaks().clear();
+                wb.getWorksheets().get(i).getVerticalPageBreaks().clear();
+            }
+        }
+    }
+
+    private byte[] xls2xlsx(byte[] bytes) throws IOException {
+        InputStream fis = new ByteArrayInputStream(bytes);
+        try (HSSFWorkbook xlsWorkbook = new HSSFWorkbook(fis);
+             XSSFWorkbook xlsxWorkbook = new XSSFWorkbook()) {
+
+            for (int i = 0; i < xlsWorkbook.getNumberOfSheets(); i++) {
+                HSSFSheet xlsSheet = xlsWorkbook.getSheetAt(i);
+                XSSFSheet xlsxSheet = xlsxWorkbook.createSheet(xlsSheet.getSheetName());
+                for (int j = 0; j <= xlsSheet.getLastRowNum(); j++) {
+                    HSSFRow xlsRow = xlsSheet.getRow(j);
+                    if (xlsRow == null) {
+                        continue;
+                    }
+                    XSSFRow xlsxRow = xlsxSheet.createRow(xlsRow.getRowNum());
+
+                    for (int k = 0; k < xlsRow.getLastCellNum(); k++) {
+                        HSSFCell xlsCell = xlsRow.getCell(k);
+                        if (xlsCell == null) {
+                            continue;
+                        }
+                        XSSFCell xlsxCell = xlsxRow.createCell(xlsCell.getColumnIndex());
+                        setCellValue(xlsxCell, xlsCell, xlsWorkbook);
+                        copyCellStyle(xlsxWorkbook, xlsxCell, xlsWorkbook, xlsCell);
+                    }
+                }
+                // 复制单元格合并信息
+                List<CellRangeAddress> mergedRegions = xlsSheet.getMergedRegions();
+                for (CellRangeAddress mergedRegion : mergedRegions) {
+                    CellRangeAddress targetMergedRegion = new CellRangeAddress(
+                            mergedRegion.getFirstRow(),
+                            mergedRegion.getLastRow(),
+                            mergedRegion.getFirstColumn(),
+                            mergedRegion.getLastColumn()
+                    );
+                    xlsxSheet.addMergedRegion(targetMergedRegion);
+                }
+                // 拷贝图片
+                copyPicture(xlsSheet, xlsxSheet);
+                // 复制列宽
+                int columnCount = 0;
+                if (xlsxSheet.getRow(0) != null) {
+                    // 假设第一行包含所有列,根据第一行的列数获取列数
+                    columnCount = xlsxSheet.getRow(0).getLastCellNum();
+                }
+                for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
+                    xlsxSheet.setColumnWidth(columnIndex, xlsSheet.getColumnWidth(columnIndex));
+                }
+            }
+
+            try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();) {
+                xlsxWorkbook.write(outputStream);
+                bytes = outputStream.toByteArray();
+                outputStream.close();
+                xlsxWorkbook.close();
+            }
+            log.info("xls文件转换完成");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return bytes;
+    }
+
+    // 拷贝图片
+    public void copyPicture(HSSFSheet source, XSSFSheet destination) {
+        // 获取sheet中的图片信息
+        List<Map<String, Object>> mapList = getPicturesFromHSSFSheet(source);
+        XSSFDrawing drawing = destination.createDrawingPatriarch();
+
+        for (Map<String, Object> pictureMap : mapList) {
+
+            HSSFClientAnchor hssfClientAnchor = (HSSFClientAnchor) pictureMap.get("pictureAnchor");
+
+            HSSFRow startRow = source.getRow(hssfClientAnchor.getRow1());
+            float startRowHeight = startRow == null ? source.getDefaultRowHeightInPoints() : startRow.getHeightInPoints();
+
+            HSSFRow endRow = source.getRow(hssfClientAnchor.getRow1());
+
+            float endRowHeight = endRow == null ? source.getDefaultRowHeightInPoints() : endRow.getHeightInPoints();
+
+            // hssf的单元格,每个单元格无论宽高,都被分为 宽 1024个单位 高 256个单位。
+            // 32.00f 为默认的单元格单位宽度 单元格宽度 / 默认宽度 为像素宽度
+            XSSFClientAnchor xssfClientAnchor = drawing.createAnchor(
+                    (int) (source.getColumnWidth(hssfClientAnchor.getCol1()) / 32.00f
+                            / 1024 * hssfClientAnchor.getDx1() * Units.EMU_PER_PIXEL),
+                    (int) (startRowHeight / 256 * hssfClientAnchor.getDy1() * Units.EMU_PER_POINT),
+                    (int) (source.getColumnWidth(hssfClientAnchor.getCol2()) / 32.00f
+                            / 1024 * hssfClientAnchor.getDx2() * Units.EMU_PER_PIXEL),
+                    (int) (endRowHeight / 256 * hssfClientAnchor.getDy2() * Units.EMU_PER_POINT),
+                    hssfClientAnchor.getCol1(),
+                    hssfClientAnchor.getRow1(),
+                    hssfClientAnchor.getCol2(),
+                    hssfClientAnchor.getRow2());
+            xssfClientAnchor.setAnchorType(hssfClientAnchor.getAnchorType());
+
+            drawing.createPicture(xssfClientAnchor,
+                    destination.getWorkbook().addPicture((byte[]) pictureMap.get("pictureByteArray"),
+                            Integer.parseInt(pictureMap.get("pictureType").toString())));
+        }
+    }
+
+    /**
+     * 获取图片和位置 (xls)
+     */
+    public List<Map<String, Object>> getPicturesFromHSSFSheet(HSSFSheet sheet) {
+        List<Map<String, Object>> mapList = new ArrayList<>();
+        if (sheet.getDrawingPatriarch() == null) {
+            return mapList;
+        }
+        List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
+        for (HSSFShape shape : list) {
+            if (shape instanceof HSSFPicture) {
+                Map<String, Object> map = new HashMap<>();
+                HSSFPicture picture = (HSSFPicture) shape;
+                HSSFClientAnchor cAnchor = picture.getClientAnchor();
+                HSSFPictureData pdata = picture.getPictureData();
+                map.put("pictureAnchor", cAnchor);
+                map.put("pictureByteArray", pdata.getData());
+                map.put("pictureType", pdata.getPictureType());
+                map.put("pictureSize", picture.getImageDimension());
+                mapList.add(map);
+            }
+        }
+        return mapList;
+    }
+
+
+    private void setCellValue(Cell newCell, Cell oldCell, HSSFWorkbook xlsWorkbook) {
+        if (oldCell == null) {
+            return;
+        }
+        try {
+            switch (oldCell.getCellType()) {
+                case STRING:
+                    newCell.setCellValue(oldCell.getStringCellValue());
+                    break;
+                case NUMERIC:
+                    if (DateUtil.isCellDateFormatted(oldCell)) {
+                        newCell.setCellValue(oldCell.getDateCellValue());
+                    } else {
+                        newCell.setCellValue(oldCell.getNumericCellValue());
+                    }
+                    break;
+                case BLANK:
+                    newCell.setCellType(CellType.BLANK);
+                    break;
+                case BOOLEAN:
+                    newCell.setCellValue(oldCell.getBooleanCellValue());
+                    break;
+                case FORMULA:
+                    //  HSSFFormulaEvaluator evaluator=new HSSFFormulaEvaluator(xlsWorkbook);
+                    // CellValue tempCellValue = evaluator.evaluate(oldCell);
+                    newCell.setCellValue(oldCell.getNumericCellValue());
+                    break;
+                default:
+            }
+        } catch (Exception ex) {
+            System.out.println("setCellValue出错:" + ex.getMessage());
+            log.info("setCellValue出错:" + ex.getMessage());
+        }
+    }
+
+    private void copyCellStyle(XSSFWorkbook xssfWorkbook, XSSFCell newCell, HSSFWorkbook hssfWorkbook, HSSFCell oldCell) {
+        HSSFCellStyle oldCellStyle = oldCell.getCellStyle();
+
+        // 创建一个XSSFCellStyle(新Excel格式)
+        XSSFCellStyle newCellStyle = xssfWorkbook.createCellStyle();
+
+        // 复制对齐方式
+        newCellStyle.setAlignment(oldCellStyle.getAlignment());
+        newCellStyle.setVerticalAlignment(oldCellStyle.getVerticalAlignment());
+
+        // 复制字体属性
+        XSSFFont newFont = xssfWorkbook.createFont();
+        HSSFFont oldFont = oldCellStyle.getFont(hssfWorkbook);
+        newFont.setFontName(oldFont.getFontName());
+        newFont.setFontHeightInPoints(oldFont.getFontHeightInPoints());
+        newFont.setColor(oldFont.getColor());
+        newCellStyle.setFont(newFont);
+
+        // 复制填充颜色
+        newCellStyle.setFillPattern(oldCellStyle.getFillPattern());
+        newCellStyle.setFillForegroundColor(oldCellStyle.getFillForegroundColor());
+        newCellStyle.setFillBackgroundColor(oldCellStyle.getFillBackgroundColor());
+
+        // 复制数据格式
+        newCellStyle.setDataFormat(oldCellStyle.getDataFormat());
+
+        // 文本换行
+        newCellStyle.setWrapText(oldCellStyle.getWrapText());
+
+        newCellStyle.setBorderBottom(oldCellStyle.getBorderBottom());
+        newCellStyle.setBorderLeft(oldCellStyle.getBorderLeft());
+        newCellStyle.setBorderRight(oldCellStyle.getBorderRight());
+        newCellStyle.setBorderTop(oldCellStyle.getBorderTop());
+        newCellStyle.setBottomBorderColor(oldCellStyle.getBottomBorderColor());
+        newCellStyle.setDataFormat(oldCellStyle.getDataFormat());
+        newCellStyle.setFillBackgroundColor(oldCellStyle.getFillBackgroundColor());
+        newCellStyle.setFillPattern(oldCellStyle.getFillPattern());
+
+        newCellStyle.setHidden(oldCellStyle.getHidden());
+        newCellStyle.setIndention(oldCellStyle.getIndention());
+        newCellStyle.setLeftBorderColor(oldCellStyle.getLeftBorderColor());
+        newCellStyle.setLocked(oldCellStyle.getLocked());
+        newCellStyle.setQuotePrefixed(oldCellStyle.getQuotePrefixed());
+        newCellStyle.setReadingOrder(ReadingOrder.forLong(oldCellStyle.getReadingOrder()));
+        newCellStyle.setRightBorderColor(oldCellStyle.getRightBorderColor());
+        newCellStyle.setRotation(oldCellStyle.getRotation());
+
+        newCell.setCellStyle(newCellStyle);
+    }
+
+    private byte[] doc2Docx(byte[] bytes) throws IOException {
+        try {
+            // 将doc文件的内容读取到XWPFDocument对象中
+            InputStream fis = new ByteArrayInputStream(bytes);
+            HWPFDocument doc = new HWPFDocument(fis);
+            WordExtractor wordExtractor = new WordExtractor(doc);
+            String text = wordExtractor.getText();
+
+            XWPFDocument docx = new XWPFDocument();
+            XWPFParagraph paragraph = docx.createParagraph();
+            XWPFRun run = paragraph.createRun();
+            run.setText(text);
+
+            // 保存XWPFDocument对象到docx文件中
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            docx.write(outputStream);
+            bytes = outputStream.toByteArray();
+
+            doc.close();
+            docx.close();
+            outputStream.close();
+        } catch (Exception ex) {
+            log.info("doc2Docx文件转换失败:" + ex.getMessage());
+        }
+        return bytes;
+    }
 }

+ 12 - 0
src/main/resources/license-cell.xml

@@ -0,0 +1,12 @@
+<License>
+  <Data>
+    <Products>
+      <Product>Aspose.Total for Java</Product>
+    </Products>
+    <EditionType>Enterprise</EditionType>
+    <SubscriptionExpiry>20991231</SubscriptionExpiry>
+    <LicenseExpiry>20991231</LicenseExpiry>
+    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
+  </Data>
+  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
+</License>

+ 13 - 15
src/main/resources/mapping/cquery/FactWellCQuery.xml

@@ -29,24 +29,22 @@
     <select id="getMonthGroupList" resultType="com.bowintek.practice.vo.FactWell.FactWellGroupList">
         SELECT t.well_id,
             t.prod_time_str time_str,
-            SUM(t.gas_prod_mon) gas,
-            SUM(t.oil_prod_mon) oil,
-            SUM(t.water_prod_mon) water,
-            SUM(t.fluid_prod_mon) fluid,
+            MAX(t.gas_prod_mon) gas,
+            MAX(t.oil_prod_mon) oil,
+            MAX(t.water_prod_mon) water,
+            MAX(t.fluid_prod_mon) fluid,
             0 watercut
         FROM (  SELECT wm.well_id,
-                    to_char(to_date(CONCAT(wm.prod_date,'-01'), 'YYYY-MM-DD'), 'YYYY年MM月') prod_time_str,
-                    COALESCE(wm.gas_prod_mon, 0) gas_prod_mon,
-                    COALESCE(wm.oil_prod_mon, 0) oil_prod_mon,
-                    COALESCE(wm.water_prod_mon, 0) water_prod_mon,
-                    COALESCE(wm.fluid_prod_mon, 0) fluid_prod_mon
-                FROM by_dwr.fact_dwr_pc_pro_well_vol_m wm
+                    TO_CHAR(wm.prod_date , 'YYYY-MM-DD') prod_time_str,
+                    COALESCE(wm.gas_prod_cum, 0) gas_prod_mon,
+                    COALESCE(wm.oil_prod_cum, 0) oil_prod_mon,
+                    COALESCE(wm.water_prod_cum, 0) water_prod_mon,
+                    COALESCE(wm.liquid_prod_cum, 0) fluid_prod_mon
+                FROM by_dwr.fact_dwr_pc_pro_well_vol_d wm
                 WHERE wm.prod_date is not null
-                    and to_date(CONCAT(wm.prod_date,'-01'), 'YYYY-MM-DD')  <![CDATA[ >= ]]> to_date(#{startDay},'YYYY-MM-DD')
-                    and to_date(CONCAT(wm.prod_date,'-01'), 'YYYY-MM-DD')  <![CDATA[ <= ]]> to_date(#{endDay},'YYYY-MM-DD')
-        <if test="wellId!='' and wellId!=null">
-            and wm.well_id=#{wellId}
-        </if>
+                    and wm.prod_date <![CDATA[ >= ]]> to_date(#{startDay},'YYYY-MM-DD')
+                    and wm.prod_date <![CDATA[ <= ]]> to_date(#{endDay},'YYYY-MM-DD')
+                  and wm.well_id=#{wellId}
             ) t
         GROUP BY t.well_id, t.prod_time_str
     </select>

+ 17 - 10
src/main/resources/mapping/cquery/WellInfoCQuery.xml

@@ -3,7 +3,10 @@
 <mapper namespace="com.bowintek.practice.mapper.cquery.WellInfoCQuery">
 
     <select id="getWellInfo" resultType="java.util.HashMap">
-        select well.*,
+        select
+            well.well_id, well.well_common_name, well_purpose, well.well_type,  well.budgeted_md, well.completion_formation,
+            well.completion_method, well.org_id_a1, well.org_id_a2,  well.org_name_a2,well.project_id, well.project_name,
+            TO_CHAR(well.spud_date , 'YYYY-MM-dd') spud_date,TO_CHAR(well.end_drilling_date , 'YYYY-MM-dd') end_drilling_date,
                fact_daily.fluid_prod_daily,
                fact_daily.oil_prod_daily,
                fact_daily.water_cut,
@@ -24,16 +27,17 @@
                str.ko_horizontal_dislocation,
                str.azimuth_angle,
                str.well_coordinates_x,
-               str.well_coordinates_y
+               str.well_coordinates_y,
+            intr.well_state
         from by_dwr.fact_dwr_well_basic_information well
                  left join by_dwr.fact_dwr_well_structure str on well.well_id = str.well_id
+            left join  by_dwr.fact_dwr_well_history_introduction intr on well.well_id=intr.well_id
                  left join (
             select daily.*
             from by_dwr.fact_dwr_pc_pro_well_vol_d daily
                      inner join(
                 select well_id, max(prod_date) prod_date from by_dwr.fact_dwr_pc_pro_well_vol_d group by well_id
             ) maxdaily on daily.well_id = maxdaily.well_id and daily.prod_date = maxdaily.prod_date
-            limit  1
         ) fact_daily on well.well_id = fact_daily.well_id
                  left join (
             select intr.*
@@ -43,37 +47,40 @@
                 from by_dwr.fact_dwr_well_history_introduction
                 group by well_id
             ) maxintr on intr.well_id = maxintr.well_id and intr.start_prod_date = maxintr.start_prod_date
-            limit  1
         ) fact_intr on well.well_id = fact_intr.well_id
         where well.well_id = #{well_id}
     </select>
     <select id="getWellInfoList" parameterType="com.bowintek.practice.vo.query.WellInfoParams"
             resultType="java.util.HashMap">
         select
-        well.*,
+        well.well_id, well.well_common_name, well_purpose, well.well_type,  well.end_drilling_date, well.budgeted_md, well.completion_formation,
+               well.completion_method, well.org_id_a1, well.org_id_a2,  well.org_name_a2,well.project_id, well.project_name,
+        TO_CHAR(well.spud_date , 'YYYY-MM-dd') spud_date,TO_CHAR(well.end_drilling_date , 'YYYY-MM-dd') end_drilling_date,
+               station.name  org_name_a1,
         TO_CHAR(fact_daily.oil_prod_begin_date , 'YYYY-MM-dd') oil_prod_begin_date,
         TO_CHAR(fact_daily.oil_prod_recent_date , 'YYYY-MM-dd') oil_prod_recent_date,
         fact_daily.current_state,fact_daily.water_cut,
         fact_mon.oil_prod_mon,fact_mon.gas_prod_mon,fact_mon.gas_prod_year,fact_mon.oil_prod_year
         ,fact_mon.water_prod_mon,fact_mon.water_prod_year,
         well_stt.well_coordinates_x x,
-        well_stt.well_coordinates_y y
+        well_stt.well_coordinates_y y,
+        intr.well_state
         from by_dwr.fact_dwr_well_basic_information well
+        left join  by_dwr.fact_dwr_well_history_introduction intr on well.well_id=intr.well_id
         left join (
         select daily.* from by_dwr.fact_dwr_pc_pro_well_vol_d daily
         inner join(
         select well_id, max(prod_date) prod_date from by_dwr.fact_dwr_pc_pro_well_vol_d group by well_id
         ) maxdaily on daily.well_id=maxdaily.well_id and daily.prod_date=maxdaily.prod_date
-        limit  1
         )fact_daily on well.well_id= fact_daily.well_id
         left join (
         select mon.* from by_dwr.fact_dwr_pc_pro_well_vol_m mon
         inner join(
         select well_id, max(prod_date) prod_date from by_dwr.fact_dwr_pc_pro_well_vol_m group by well_id
         ) maxmon on mon.well_id=maxmon.well_id and mon.prod_date=maxmon.prod_date
-        limit  1
         )fact_mon on well.well_id= fact_mon.well_id
         left join by_dwr.fact_dwr_well_structure well_stt on well.well_id = well_stt.well_id
+        left join by_dim.v_plant_site_station station on well.org_id_a1=station.id
         where 1=1
         <if test="well_common_name!='' and well_common_name!=null">
             and well.well_common_name like Concat('%',#{well_common_name},'%')
@@ -199,7 +206,7 @@
     </select>
     <select id="selectAnalyticalAssaysList" resultType="java.util.HashMap">
         select *
-        from by_dm.dws_dm_analytical_assays aa
+        from by_dm.dws_dm_analytical_assays_new aa
         where aa.well_id = #{well_id}
     </select>
     <select id="selectAnalyticalAssaysSummary" resultType="java.util.HashMap">
@@ -212,7 +219,7 @@
                SUM(CASE WHEN item_code = '录井综合解释' THEN 1 ELSE 0 END)      AS 录井综合解释,
                SUM(CASE WHEN item_code = '气测解释' THEN 1 ELSE 0 END)        AS 气测解释,
                SUM(CASE WHEN item_code = '定量荧光解释' THEN 1 ELSE 0 END)      AS 定量荧光解释
-        FROM by_dm.dws_dm_analytical_assays
+        FROM by_dm.dws_dm_analytical_assays_new
         where well_id = #{well_id}
         GROUP BY item_code;
     </select>

+ 43 - 41
target/classes/META-INF/MANIFEST.MF

@@ -1,44 +1,46 @@
 Manifest-Version: 1.0
 Main-Class: com.bowintek.practice.PracticeApplication
-Class-Path: mybatis-spring-2.0.7.jar reactor-core-3.4.21.jar lettuce-cor
- e-6.1.9.RELEASE.jar spring-data-keyvalue-2.7.2.jar jackson-databind-2.1
- 3.3.jar jackson-datatype-jdk8-2.13.3.jar spring-boot-starter-data-redis
- -2.7.2.jar spring-boot-starter-jdbc-2.7.2.jar lucene-queries-4.7.2.jar 
- snakeyaml-1.30.jar netty-handler-4.1.79.Final.jar jackson-module-parame
- ter-names-2.13.3.jar jackson-core-2.13.3.jar poi-4.0.0.jar spring-webmv
- c-5.3.22.jar commons-collections4-4.2.jar fastjson-1.2.47.jar spring-be
- ans-5.3.22.jar commons-lang3-3.5.jar httpasyncclient-4.1.5.jar netty-re
- solver-4.1.79.Final.jar spring-boot-starter-json-2.7.2.jar lombok-1.18.
- 20.jar spring-boot-autoconfigure-2.7.2.jar reactive-streams-1.0.4.jar a
- spectjrt-1.9.7.jar spring-expression-5.3.22.jar jul-to-slf4j-1.7.36.jar
-  checker-qual-3.5.0.jar netty-codec-4.1.79.Final.jar parsson-1.0.0.jar 
- slf4j-api-1.7.36.jar xmlbeans-3.0.1.jar lucene-queryparser-4.7.2.jar to
- mcat-embed-core-9.0.65.jar opentelemetry-api-1.29.0.jar spring-jdbc-5.3
- .22.jar mysql-connector-java-8.0.29.jar spring-core-5.3.22.jar poi-ooxm
- l-4.0.0.jar pagehelper-spring-boot-starter-1.4.3.jar elasticsearch-java
- -8.11.1.jar mybatis-3.5.9.jar elasticsearch-rest-client-7.17.4.jar jsql
- parser-4.2.jar netty-common-4.1.79.Final.jar jakarta.annotation-api-1.3
- .5.jar spring-tx-5.3.22.jar netty-transport-4.1.79.Final.jar ikanalyzer
- -2012_u6.jar httpcore-4.4.15.jar mybatis-spring-boot-autoconfigure-2.2.
- 2.jar jakarta.json-api-2.0.1.jar log4j-to-slf4j-2.17.2.jar spring-boot-
- 2.7.2.jar druid-spring-boot-starter-1.2.11.jar pagehelper-spring-boot-a
- utoconfigure-1.4.3.jar spring-data-redis-2.7.2.jar commons-beanutils-1.
- 9.4.jar log4j-api-2.17.2.jar lucene-sandbox-4.7.2.jar httpclient-4.5.9.
- jar jsr305-3.0.2.jar HikariCP-4.0.3.jar tomcat-embed-websocket-9.0.65.j
- ar spring-boot-starter-web-2.7.2.jar postgresql-42.3.6.jar commons-coll
- ections-3.2.2.jar logback-classic-1.2.11.jar logback-core-1.2.11.jar po
- i-ooxml-schemas-4.0.0.jar spring-boot-devtools-2.7.2.jar netty-buffer-4
- .1.79.Final.jar pagehelper-5.3.1.jar commons-pool2-2.11.1.jar spring-bo
- ot-starter-2.7.2.jar spring-data-commons-2.7.2.jar commons-codec-1.15.j
- ar spring-aop-5.3.22.jar curvesapi-1.04.jar spring-boot-starter-tomcat-
- 2.7.2.jar opentelemetry-context-1.29.0.jar aspectjweaver-1.9.7.jar spri
- ng-web-5.3.22.jar commons-logging-1.2.jar aspose-words-15.8.0-jdk16.jar
-  postgresql-42.3.4.jar java-jwt-3.9.0.jar jackson-annotations-2.13.3.ja
- r lucene-analyzers-common-4.7.2.jar tomcat-embed-el-9.0.65.jar json-201
- 90722.jar druid-1.2.11.jar jackson-datatype-jsr310-2.13.3.jar mybatis-s
- pring-boot-starter-2.2.2.jar commons-compress-1.18.jar spring-oxm-5.3.2
- 2.jar httpcore-nio-4.4.15.jar spring-context-support-5.3.22.jar spring-
- context-5.3.22.jar netty-transport-native-unix-common-4.1.79.Final.jar 
- commons-net-3.6.jar poi-scratchpad-4.0.0.jar spring-jcl-5.3.22.jar spri
- ng-boot-starter-logging-2.7.2.jar lucene-core-4.7.2.jar
+Class-Path: HikariCP-4.0.3.jar postgresql-42.3.4.jar java-jwt-3.9.0.jar 
+ netty-common-4.1.79.Final.jar netty-codec-4.1.79.Final.jar httpcore-4.4
+ .15.jar lucene-queryparser-4.7.2.jar commons-collections4-4.2.jar logba
+ ck-core-1.2.11.jar httpclient-4.5.9.jar lettuce-core-6.1.9.RELEASE.jar 
+ commons-pool2-2.11.1.jar spring-oxm-5.3.22.jar lucene-sandbox-4.7.2.jar
+  netty-handler-4.1.79.Final.jar spring-core-5.3.22.jar spring-jdbc-5.3.
+ 22.jar log4j-api-2.17.2.jar opentelemetry-context-1.29.0.jar mysql-conn
+ ector-java-8.0.29.jar commons-net-3.6.jar tomcat-embed-el-9.0.65.jar sn
+ akeyaml-1.30.jar spring-boot-starter-tomcat-2.7.2.jar gson-2.9.0.jar my
+ batis-3.5.9.jar spring-boot-2.7.2.jar jsr305-3.0.2.jar poi-4.0.0.jar ne
+ tty-transport-4.1.79.Final.jar jackson-core-2.13.3.jar log4j-to-slf4j-2
+ .17.2.jar httpcore-nio-4.4.15.jar jul-to-slf4j-1.7.36.jar tomcat-embed-
+ core-9.0.65.jar parsson-1.0.0.jar mybatis-spring-boot-starter-2.2.2.jar
+  spring-context-support-5.3.22.jar spring-boot-starter-jdbc-2.7.2.jar s
+ pring-boot-devtools-2.7.2.jar juh-4.1.2.jar jsqlparser-4.2.jar jackson-
+ annotations-2.13.3.jar json-20190722.jar lucene-analyzers-common-4.7.2.
+ jar pagehelper-spring-boot-autoconfigure-1.4.3.jar poi-ooxml-schemas-4.
+ 0.0.jar poi-ooxml-4.0.0.jar tomcat-embed-websocket-9.0.65.jar jakarta.a
+ nnotation-api-1.3.5.jar xmlbeans-3.0.1.jar spring-aop-5.3.22.jar spring
+ -context-5.3.22.jar lucene-core-4.7.2.jar commons-collections-3.2.2.jar
+  jodconverter-local-4.4.6.jar pagehelper-5.3.1.jar commons-beanutils-1.
+ 9.4.jar commons-compress-1.18.jar unoil-4.1.2.jar spring-webmvc-5.3.22.
+ jar spring-boot-starter-json-2.7.2.jar lombok-1.18.20.jar spring-expres
+ sion-5.3.22.jar jakarta.json-api-2.0.1.jar pagehelper-spring-boot-start
+ er-1.4.3.jar spring-boot-starter-2.7.2.jar commons-codec-1.15.jar sprin
+ g-tx-5.3.22.jar elasticsearch-java-8.11.1.jar postgresql-42.3.6.jar spr
+ ing-data-keyvalue-2.7.2.jar spring-data-redis-2.7.2.jar spring-boot-sta
+ rter-logging-2.7.2.jar spring-boot-autoconfigure-2.7.2.jar opentelemetr
+ y-api-1.29.0.jar checker-qual-3.5.0.jar lucene-queries-4.7.2.jar elasti
+ csearch-rest-client-7.17.4.jar curvesapi-1.04.jar druid-spring-boot-sta
+ rter-1.2.11.jar netty-buffer-4.1.79.Final.jar spring-data-commons-2.7.2
+ .jar aspectjweaver-1.9.7.jar spring-web-5.3.22.jar jackson-databind-2.1
+ 3.3.jar druid-1.2.11.jar fastjson-1.2.47.jar netty-transport-native-uni
+ x-common-4.1.79.Final.jar jackson-module-parameter-names-2.13.3.jar asp
+ ectjrt-1.9.7.jar jackson-datatype-jdk8-2.13.3.jar slf4j-api-1.7.36.jar 
+ spring-beans-5.3.22.jar httpasyncclient-4.1.5.jar reactor-core-3.4.21.j
+ ar netty-resolver-4.1.79.Final.jar spring-jcl-5.3.22.jar ridl-4.1.2.jar
+  jackson-datatype-jsr310-2.13.3.jar mybatis-spring-boot-autoconfigure-2
+ .2.2.jar mybatis-spring-2.0.7.jar aspose-words-15.8.0-jdk16.jar logback
+ -classic-1.2.11.jar reactive-streams-1.0.4.jar jurt-4.1.2.jar jodconver
+ ter-core-4.4.6.jar aspose-cells-18.9.jar poi-scratchpad-4.0.0.jar sprin
+ g-boot-starter-data-redis-2.7.2.jar ikanalyzer-2012_u6.jar spring-boot-
+ starter-web-2.7.2.jar commons-lang3-3.5.jar commons-logging-1.2.jar
 

+ 1 - 1
vue/public/appconfig.json

@@ -1,5 +1,5 @@
 {
   "isDev": true,
   "SSOLoginUrl": "",
-  "huabeiHost": "http://10.73.178.206:8077"
+  "huabeiHost": "http://10.73.178.206:8077/"
 }

+ 13 - 9
vue/src/components/basic/file-preview/index.vue

@@ -1,16 +1,20 @@
 <template>
-  <a-button type="link" size="small" @click="loadFile">预览</a-button>
+  <a-spin tip="" size="small" :spinning="spinning">
+    <a-button type="link" size="small" @click="loadFile">预览</a-button>
+  </a-spin>
   <a-modal :visible="visible" :ok-button-props="{ style: { display: 'none' } }"
            wrap-class-name="full-modal" style="text-align: center"
            cancel-text="关闭" @cancel="visible = !visible">
     <a-spin tip="加载中..." size="small" :spinning="spinning">
-      <vue-office-excel v-if="fileSuffix=='xlsx'||fileSuffix=='xls'" :src="previewUrl" style="height: 90vh;"
+      <vue-office-excel v-if="fileSuffix=='xlsx'" :src="previewUrl" style="height: 90vh;"
                         @rendered="rendered" @error="renderedError"/>
+      <vue-office-pdf v-else-if="fileSuffix=='xls'" :src="previewUrl" class="docx-calss" @rendered="rendered"
+                      @error="renderedError" style="height: 90vh;"/>
       <vue-office-docx v-else-if="fileSuffix=='docx'||fileSuffix=='doc'" :src="previewUrl" @rendered="rendered"
-                      @error="renderedError"
-                      style="width: 100%; height: 90vh;"/>
-       <vue-office-pdf v-else  :src="previewUrl" class="docx-calss" @rendered="rendered"
-                        @error="renderedError" style="height: 90vh;"/>
+                       @error="renderedError"
+                       style="width: 100%; height: 90vh;"/>
+      <vue-office-pdf v-else :src="previewUrl" class="docx-calss" @rendered="rendered"
+                      @error="renderedError" style="height: 90vh;"/>
     </a-spin>
   </a-modal>
 </template>
@@ -36,7 +40,7 @@ export default defineComponent({
     filePath: {type: String, default: ""},
     accept: {
       type: String,
-      default: '.docx,.xlsx,.pdf',
+      default: '.docx,.doc,.xlsx,.xls,.pdf',
     },
   },
   setup(props) {
@@ -50,13 +54,13 @@ export default defineComponent({
         $message.error("不支持预览的文件格式!");
         return;
       }
-      spinning.value =true;
+      spinning.value = true;
       handleloadByGet("/api/wellInfo/downFile", {
         isShow: 1,
         fileName: props.fileName,
         filePath: props.filePath
       }, "获取文件失败!").then(res => {
-        previewUrl.value=res.data;
+        previewUrl.value = res.data;
         if (previewUrl.value == undefined) {
           $message.error("文件加载失败!");
           return;

+ 3 - 3
vue/src/views/subject/index.vue

@@ -39,13 +39,13 @@
       </a-row>
       <a-row class="edit-operation">
         <a-col :span="24" style="text-align: right">
-          <a-button type="primary" html-type="button" @click="add" functioncode="T010601">新增</a-button>
+          <a-button type="primary" html-type="button" @click="add" functioncode="T010801">新增</a-button>
           <BExportExcel :title="'导出'" :filename="'主题信息'" :url="'subject/exportSubject'"
                         :params="{...formState, idList:selectedRowKeys}"></BExportExcel>
           <a-popconfirm placement="leftTop"
             title="是否删除数据?"
             @confirm="onDelete()">
-            <a-button type="primary" style="margin: 0 8px" html-type="button" functioncode="T010604">删除</a-button>
+            <a-button type="primary" style="margin: 0 8px" html-type="button" functioncode="T010804">删除</a-button>
           </a-popconfirm>
         </a-col>
       </a-row>
@@ -60,7 +60,7 @@
           <template v-if="column.key === 'operation'">
             <a-button type="link" size="small" @click="detail(record.subId)">查看
             </a-button>
-            <a-button type="link" size="small" @click="edit(record.subId)" functioncode="T010603">编辑
+            <a-button type="link" size="small" @click="edit(record.subId)" functioncode="T010803">编辑
             </a-button>
           </template>
         </template>

+ 3 - 3
vue/src/views/system/role/edit.vue

@@ -150,7 +150,7 @@ export default defineComponent({
       loadData(id);
       loadUserTypeList();
       loadDataRangeList();
-      loadFunctionCodeList();
+      loadFunctionCodeList(id);
       visible.value = true;
 
     };
@@ -197,8 +197,8 @@ export default defineComponent({
       });
     }
 
-    const loadFunctionCodeList = () => {
-      getFunctionCodeTreeList(dataModel.value.roleID, "1").then(data => {
+    const loadFunctionCodeList = (id) => {
+      getFunctionCodeTreeList(id, "1").then(data => {
         treeList.value =  data;
 
         let rowDataList = treeToList(deepCopy(data));

+ 5 - 5
vue/src/views/wellinfo/table.ts

@@ -151,10 +151,10 @@ export const columns: TableColumnsType = [
     width: 120,
     fixed: 'left'
   },
-  {title: '组织机构', dataIndex: 'org_name_a1', key: 'org_name_a1', width: 120, customHeaderCell: onHeaderCell},
-  {title: '地质单元', dataIndex: 'project_name', key: 'project_name', width: 120, customHeaderCell: onHeaderCell},
-  {title: '井别', dataIndex: 'well_purpose', key: 'well_purpose', width: 120, customHeaderCell: onHeaderCell},
-  {title: '井型', dataIndex: 'well_type', key: 'well_type', width: 120, customHeaderCell: onHeaderCell},
+  {title: '组织机构', dataIndex: 'org_name_a1', key: 'org_name_a1', width: 150,ellipsis:true, customHeaderCell: onHeaderCell},
+  {title: '地质单元', dataIndex: 'project_name', key: 'project_name', width: 120,ellipsis:true,  customHeaderCell: onHeaderCell},
+  {title: '井别', dataIndex: 'well_purpose', key: 'well_purpose', width: 100, customHeaderCell: onHeaderCell},
+  {title: '井型', dataIndex: 'well_type', key: 'well_type', width: 80, customHeaderCell: onHeaderCell},
   {
     title: '开钻日期',
     dataIndex: 'spud_date',
@@ -196,7 +196,7 @@ export const columns: TableColumnsType = [
     customRender: ({record}) =>
       record.oil_prod_recent_date == null ? "" : (dayjs(record.oil_prod_recent_date).format('YYYY-MM-DD'))
   },
-  {title: '状态', dataIndex: 'current_state_name', key: 'current_state', width: 120, customHeaderCell: onHeaderCell},
+  {title: '状态', dataIndex: 'well_state', key: 'well_state', width: 120, customHeaderCell: onHeaderCell},
   {title: '设计井深(m)', dataIndex: 'budgeted_md', key: 'tempNo', width: 120, customHeaderCell: onHeaderCell},
   {
     title: '含水率',