zhouxingyu 5 dni temu
rodzic
commit
9310e437ed

+ 21 - 1
srm-module-code/src/main/java/org/jeecg/modules/saleCode/controller/SaleInterfaceSyncController.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.saleCode.controller;
 
 import java.awt.*;
 import java.io.File;
+import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.io.IOException;
 import java.net.URLDecoder;
@@ -491,8 +492,11 @@ public class SaleInterfaceSyncController {
 	     String type = request.getParameter("type");
 		 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
 		 MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象
+         PDDocument document = null;
+         InputStream inputStream = null;
 		 try {
-			 PDDocument document = PDDocument.load(file.getInputStream());
+             inputStream = file.getInputStream();
+             document = PDDocument.load(inputStream);
 			 PDFTextStripper pdfStripper = new PDFTextStripper();
 			 String text = pdfStripper.getText(document);
 
@@ -503,6 +507,22 @@ public class SaleInterfaceSyncController {
 		 }catch (Exception ex){
 			 return Result.error(ex.getMessage());
 		 }
+         finally {
+             if(document != null){
+                 try {
+                     document.close();
+                 } catch (IOException e) {
+                     log.error("pdf文档关闭失败");
+                 }
+             }
+             if(inputStream != null){
+                 try {
+                     inputStream.close();
+                 } catch (IOException e) {
+                     e.printStackTrace();
+                 }
+             }
+         }
 	 }
 
 

+ 289 - 93
srm-module-code/src/main/java/org/jeecg/modules/saleCode/service/impl/SaleInterfaceSyncServiceImpl.java

@@ -1,10 +1,12 @@
 package org.jeecg.modules.saleCode.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.alibaba.fastjson.JSONArray;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.JsonObject;
 import io.micrometer.core.instrument.util.StringUtils;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.shiro.SecurityUtils;
@@ -507,52 +509,94 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
     @Override
     public void parsePdfByType(String type, String txt, MultipartFile file) throws Exception{
         switch(type) {
-            case "0" :
-                parseCSL(txt);
             case "1" :
-                parseNorthern(txt, file);
+                parseCSL(file);
+                break;
             case "2" :
-                parseNorthern2(txt, file);
+                parseNorthern(file);
+                break;
             case "3" :
-                parseBSM(txt, file);
+                parseNorthern2(file);
+                break;
+            case "4" :
+                parseBSM(file);
+                break;
+            case "5" :
+                parseWallem(file);
+                break;
+            case "6" :
+                parseVShips(file);
+                break;
             case "7" :
-                parseWarine(txt, file);
+                parseWarine(file);
+                break;
             default:
                 return;
         }
     }
 
-    public void parseCSL(String txt) {
-        String[] nodes = txt.split("\n");
+    public void parseCSL(MultipartFile file) {
         SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String id = UUIDGenerator.generate();
+        saleInterfaceSync.setId(id);
         saleInterfaceSync.setCreateBy(sysUser.getUsername());
-        for(int index = 0; index < nodes.length; index ++) {
-            if(nodes[index].contains("Request For Quote No.")) {
-                saleInterfaceSync.setReferenceNumber(nodes[index].replace("Request For Quote No. ", ""));
-            }
-            if(nodes[index].contains("Spare Part Type")) {
-                saleInterfaceSync.setPriority(nodes[index - 1]);
-            }
-            if(nodes[index].contains("Account Code")) {
-                saleInterfaceSync.setBuyerName(nodes[index].replace("Account Code ", ""));
-            }
-            if(nodes[index].contains("Account Code")) {
-                saleInterfaceSync.setBuyerName(nodes[index].replace("Account Code ", ""));
+        List<String> fieldList = new ArrayList<>();
+        fieldList.add("Item");
+        fieldList.add("Qty");
+        fieldList.add("UOM");
+        fieldList.add("Description");
+        fieldList.add("Makers Reference");
+        fieldList.add("Drawing Position");
+        fieldList.add("Discount");
+        fieldList.add("Unit Price");
+        fieldList.add("Total Price");
+
+        List<String> ignoreList = new ArrayList<>();
+        ignoreList.add("Page");
+        ignoreList.add("Request For Quotation");
+        ignoreList.add("LIMITED as Managers");
+        ignoreList.add("behalf of Owners Abundance");
+        ignoreList.add("Shipsure Version Number");
+        ignoreList.add("Plate / Sheet No");
+        ignoreList.add("Order Line Notes");
+        ignoreList.add("Sub Total");
+        ignoreList.add("Freight Cost");
+        ignoreList.add("Packaging Cost");
+        ignoreList.add("Grand Total");
+        ignoreList.add("(%)");
+
+        saleInterfaceSync.setPriority(PDFTableReader.getFields(file, "Priority", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerName(PDFTableReader.getFields(file, "Company Name:", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerContactName(PDFTableReader.getFields(file, "Our Contact", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerTelephone(PDFTableReader.getFields(file, "Tel.", "", true).get(0).trim());
+        saleInterfaceSync.setReferenceNumber(PDFTableReader.getFields(file, "Request For Quote No.", "", true).get(0).trim());
+        saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO Number").get(0).trim());
+        saleInterfaceSync.setVesselCode(PDFTableReader.getFields(file, "Vessel Name", "", true).get(0).trim());
+
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "Sub Total", -1, "mediate", "Request For Quote No", "Makers Reference");
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() == 8) {
+                continue;
             }
+            SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+            saleInterfaceItem.setDescription(jsonObject.getString("Description"));
+            saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+            saleInterfaceItem.setSyncItemCode(jsonObject.getString("Makers Reference"));
+            saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UOM"));
+            saleInterfaceItem.setHeadId(id);
+            saleInterfaceItemMapper.insert(saleInterfaceItem);
         }
+        saleInterfaceSyncMapper.insert(saleInterfaceSync);
     }
 
-    public void parseNorthern(String txt, MultipartFile file) throws Exception{
-        String[] nodes = txt.split("\n");
+    public void parseNorthern(MultipartFile file) throws Exception{
         SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String id = UUIDGenerator.generate();
         saleInterfaceSync.setId(id);
         saleInterfaceSync.setCreateBy(sysUser.getUsername());
-        List<String> buyerNodes = PDFTableReader.getMultipleLineFields(file, "Supplier", "RFQ Details", true);
-        List<String> RFQNodes = PDFTableReader.getMultipleLineFields(file, "RFQ Details", "Buyer Message", true);
-        List<String> detailNodes = PDFTableReader.getMultipleLineFields(file, "UoM", "", true);
         saleInterfaceSync.setBuyerName(PDFTableReader.getNextLineFields(file, "Company Name:").get(0));
         saleInterfaceSync.setSupplierName(PDFTableReader.getNextLineFields(file, "Name:").get(1));
         saleInterfaceSync.setBuyerContactName(PDFTableReader.getNextLineFields(file, "Contact:").get(0));
@@ -560,68 +604,99 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         saleInterfaceSync.setReferenceNumber(PDFTableReader.getNextLineFields(file, "Requisition No.:").get(0));
         saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO:").get(0));
         saleInterfaceSync.setVesselCode(PDFTableReader.getNextLineFields(file, "Vessel:").get(0));
-        saleInterfaceSync.setCurrencyCode(PDFTableReader.getNextLineFields(file, "Requested Currency:").get(0));
-
-        detailNodes = detailNodes.stream().filter(item -> !item.contains("Page")).collect(Collectors.toList());
-        int detailIndex = 0;
-        if(detailNodes != null) {
-            detailIndex = detailNodes.indexOf("1");
-            while(detailIndex + 7 <= detailNodes.size()) {
-                SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
-                saleInterfaceItem.setDescription(detailNodes.get(detailIndex + 1));
-                saleInterfaceItem.setQuantity(detailNodes.get(detailIndex + 5));
-                saleInterfaceItem.setSyncItemCode(detailNodes.get(detailIndex + 2));
-                saleInterfaceItem.setUnitOfMeasure(detailNodes.get(detailIndex + 6));
-                saleInterfaceItem.setHeadId(id);
-                saleInterfaceItemMapper.insert(saleInterfaceItem);
-                detailIndex += 7;
 
-            }
+        List<String> fieldList = new ArrayList<>();
+        fieldList.add("Description");
+        fieldList.add("Item Code/Part");
+        fieldList.add("Ref. No.");
+        fieldList.add("Drawing");
+        fieldList.add("Quantity");
+        fieldList.add("UoM");
 
+        List<String> ignoreList = new ArrayList<>();
+        ignoreList.add("Page");
+        ignoreList.add("Request For Quotation");
+        ignoreList.add("LIMITED as Managers");
+        ignoreList.add("behalf of Owners Abundance");
+        ignoreList.add("Shipsure Version Number");
+        ignoreList.add("Plate / Sheet No");
+        ignoreList.add("Order Line Notes");
+        ignoreList.add("Sub Total");
+        ignoreList.add("Freight Cost");
+        ignoreList.add("Packaging Cost");
+        ignoreList.add("Grand Total");
+        ignoreList.add("(%)");
+
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "", -1, "left", "Request For Quote No", "Item Code/Part");
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() == 6) {
+                continue;
+            }
+            SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+            saleInterfaceItem.setDescription(jsonObject.getString("Description"));
+            saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+            saleInterfaceItem.setSyncItemCode(jsonObject.getString("Makers Reference"));
+            saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UOM"));
+            saleInterfaceItem.setHeadId(id);
+            saleInterfaceItemMapper.insert(saleInterfaceItem);
         }
         saleInterfaceSyncMapper.insert(saleInterfaceSync);
 
     }
 
-    public void parseNorthern2(String txt, MultipartFile file) {
-        String[] nodes = txt.split("\n");
+    public void parseNorthern2(MultipartFile file) {
         SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String id = UUIDGenerator.generate();
         saleInterfaceSync.setId(id);
         saleInterfaceSync.setCreateBy(sysUser.getUsername());
-        List<String> detailNodes = PDFTableReader.getMultipleLineFields(file, "Enquiry", "Vendor Details", true);
-        saleInterfaceSync.setBuyerName(PDFTableReader.getNextLineFields(file, "Company Name:").get(0));
-        saleInterfaceSync.setSupplierName(PDFTableReader.getNextLineFields(file, "Name:").get(1));
-        saleInterfaceSync.setBuyerContactName(PDFTableReader.getNextLineFields(file, "Contact:").get(0));
-        saleInterfaceSync.setBuyerTelephone(PDFTableReader.getNextLineFields(file, "Phone:").get(0));
-        saleInterfaceSync.setReferenceNumber(PDFTableReader.getNextLineFields(file, "Requisition No.:").get(0));
-        saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO:").get(0));
-        saleInterfaceSync.setVesselCode(PDFTableReader.getNextLineFields(file, "Vessel:").get(0));
-        saleInterfaceSync.setCurrencyCode(PDFTableReader.getNextLineFields(file, "Requested Currency:").get(0));
-
-        int detailIndex = 0;
-        if(detailNodes != null) {
-            detailIndex = detailNodes.indexOf("1");
-            while(detailIndex < detailNodes.size()) {
-                SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
-                saleInterfaceItem.setDescription(detailNodes.get(detailIndex + 1));
-                saleInterfaceItem.setQuantity(detailNodes.get(detailIndex + 5));
-                saleInterfaceItem.setSyncItemCode(detailNodes.get(detailIndex + 2));
-                saleInterfaceItem.setUnitOfMeasure(detailNodes.get(detailIndex + 6));
-                saleInterfaceItem.setHeadId(id);
-                // saleInterfaceItemMapper.insert(saleInterfaceItem);
-                detailIndex += 7;
+        //saleInterfaceSync.setBuyerName(PDFTableReader.getNextLineFields(file, "Company Name:").get(0));
+        //saleInterfaceSync.setSupplierName(PDFTableReader.getNextLineFields(file, "Name:").get(1));
+        saleInterfaceSync.setBuyerContactName(PDFTableReader.getFields(file, "Contact:", "", true).get(0));
+        saleInterfaceSync.setBuyerTelephone(PDFTableReader.getFields(file, "Telephone:", "", true).get(0));
+        saleInterfaceSync.setReferenceNumber(PDFTableReader.getFields(file, "Reference:", "", true).get(0).trim());
+        //saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO:").get(0));
+        saleInterfaceSync.setVesselCode(PDFTableReader.getFields(file, "Ship Name:", "", true).get(0));
 
-            }
+        List<String> fieldList = new ArrayList<>();
+        fieldList.add("Qty");
+        fieldList.add("UoM");
+        fieldList.add("Part No.");
+        fieldList.add("Description");
 
+        List<String> ignoreList = new ArrayList<>();
+        ignoreList.add("Page");
+        ignoreList.add("Request For Quotation");
+        ignoreList.add("LIMITED as Managers");
+        ignoreList.add("behalf of Owners Abundance");
+        ignoreList.add("Shipsure Version Number");
+        ignoreList.add("Plate / Sheet No");
+        ignoreList.add("Order Line Notes");
+        ignoreList.add("Sub Total");
+        ignoreList.add("Freight Cost");
+        ignoreList.add("Packaging Cost");
+        ignoreList.add("Grand Total");
+        ignoreList.add("(%)");
+
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "Contact:", -1, "left", "Contact:", "Part No.");
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() == 4) {
+                continue;
+            }
+            SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+            saleInterfaceItem.setDescription(jsonObject.getString("Description"));
+            saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+            saleInterfaceItem.setSyncItemCode(jsonObject.getString("Makers Reference"));
+            saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UOM"));
+            saleInterfaceItem.setHeadId(id);
+            saleInterfaceItemMapper.insert(saleInterfaceItem);
         }
-        //   saleInterfaceSyncMapper.insert(saleInterfaceSync);
-
+        saleInterfaceSyncMapper.insert(saleInterfaceSync);
     }
 
-    public void parseBSM(String txt, MultipartFile file) {
-        String[] nodes = txt.split("\n");
+    public void parseBSM(MultipartFile file) {
         SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String id = UUIDGenerator.generate();
@@ -675,15 +750,68 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
 
     }
 
-    public void parseWarine(String txt, MultipartFile file) {
-        String[] nodes = txt.split("\n");
+    public void parseWallem(MultipartFile file) {
+        SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String id = UUIDGenerator.generate();
+        saleInterfaceSync.setId(id);
+        saleInterfaceSync.setCreateBy(sysUser.getUsername());
+        List<String> fieldList = new ArrayList<>();
+        fieldList.add("Type");
+        fieldList.add("Part Number");
+        fieldList.add("Supplier Part");
+        fieldList.add("Item Description");
+        fieldList.add("Quality");
+        fieldList.add("Custom");
+        fieldList.add("UoM");
+        fieldList.add("Qty");
+
+        List<String> ignoreList = new ArrayList<>();
+        ignoreList.add("Page");
+        ignoreList.add("Request For Quotation");
+        ignoreList.add("LIMITED as Managers");
+        ignoreList.add("behalf of Owners Abundance");
+        ignoreList.add("Shipsure Version Number");
+        ignoreList.add("Plate / Sheet No");
+        ignoreList.add("Order Line Notes");
+        ignoreList.add("Sub Total");
+        ignoreList.add("Freight Cost");
+        ignoreList.add("Packaging Cost");
+        ignoreList.add("Grand Total");
+        ignoreList.add("(%)");
+
+        //saleInterfaceSync.setPriority(PDFTableReader.getFields(file, "Priority", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerName(PDFTableReader.getNextLineFields(file, "Buyer Details:").get(0).trim());
+        //saleInterfaceSync.setBuyerContactName(PDFTableReader.getFields(file, "Our Contact", "", true).get(0).trim());
+        //saleInterfaceSync.setBuyerTelephone(PDFTableReader.getFields(file, "Tel.", "", true).get(0).trim());
+        saleInterfaceSync.setReferenceNumber(PDFTableReader.getFields(file, "RFQ Ref:", "", true).get(0).trim());
+        saleInterfaceSync.setSupplierName(PDFTableReader.getNextLineFields(file, "Supplier Details:").get(0).trim());
+        //saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO Number").get(0).trim());
+        saleInterfaceSync.setVesselCode(PDFTableReader.getFields(file, "Vessel:", "", true).get(0).trim());
+        saleInterfaceSync.setCurrencyCode(PDFTableReader.getFields(file, "Currency: ", "", true).get(0).trim());
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "ShipServ Buyer Record:", -1, "left", "Buyer Details:", "Supplier Part");
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() == 8) {
+                continue;
+            }
+            SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+            saleInterfaceItem.setDescription(jsonObject.getString("Description"));
+            saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+            saleInterfaceItem.setSyncItemCode(jsonObject.getString("Makers Reference"));
+            saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UOM"));
+            saleInterfaceItem.setHeadId(id);
+            saleInterfaceItemMapper.insert(saleInterfaceItem);
+        }
+        saleInterfaceSyncMapper.insert(saleInterfaceSync);
+    }
+
+    public void parseWarine(MultipartFile file) {
         SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String id = UUIDGenerator.generate();
         saleInterfaceSync.setId(id);
         saleInterfaceSync.setCreateBy(sysUser.getUsername());
-        List<String> buyerNodes = PDFTableReader.getMultipleLineFields(file, "Supplier", "RFQ Details", true);
-        List<String> RFQNodes = PDFTableReader.getMultipleLineFields(file, "RFQ Details", "Buyer Message", true);
         saleInterfaceSync.setBuyerName(PDFTableReader.getNextLineFields(file, "Company Name:").get(0));
         saleInterfaceSync.setSupplierName(PDFTableReader.getNextLineFields(file, "Name:").get(1));
         saleInterfaceSync.setBuyerContactName(PDFTableReader.getNextLineFields(file, "Contact:").get(0));
@@ -693,35 +821,103 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         saleInterfaceSync.setVesselCode(PDFTableReader.getNextLineFields(file, "Vessel:").get(0));
 
         List<String> fieldList = new ArrayList<>();
-        fieldList.add("No.");
         fieldList.add("Description");
         fieldList.add("Item Code/Part");
         fieldList.add("Ref. No.");
         fieldList.add("Drawing");
         fieldList.add("Quantity");
         fieldList.add("UoM");
-        JSONArray table = PDFTableReader.getTable(file, fieldList);
 
-        int detailIndex = 0;
-//        if(detailNodes != null) {
-//            detailIndex = detailNodes.indexOf("1");
-//            while(detailIndex < detailNodes.size()) {
-//                SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
-//                saleInterfaceItem.setDescription(detailNodes.get(detailIndex + 1));
-//                saleInterfaceItem.setQuantity(detailNodes.get(detailIndex + 5));
-//                saleInterfaceItem.setSyncItemCode(detailNodes.get(detailIndex + 2));
-//                saleInterfaceItem.setUnitOfMeasure(detailNodes.get(detailIndex + 6));
-//                saleInterfaceItem.setHeadId(id);
-//                //saleInterfaceItemMapper.insert(saleInterfaceItem);
-//                detailIndex += 7;
-//
-//            }
-//
-//        }
-        //saleInterfaceSyncMapper.insert(saleInterfaceSync);
+        List<String> ignoreList = new ArrayList<>();
+        ignoreList.add("Page");
+        ignoreList.add("Request For Quotation");
+        ignoreList.add("LIMITED as Managers");
+        ignoreList.add("behalf of Owners Abundance");
+        ignoreList.add("Shipsure Version Number");
+        ignoreList.add("Plate / Sheet No");
+        ignoreList.add("Order Line Notes");
+        ignoreList.add("Sub Total");
+        ignoreList.add("Freight Cost");
+        ignoreList.add("Packaging Cost");
+        ignoreList.add("Grand Total");
+        ignoreList.add("(%)");
+
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "", -1, "left", "Buyer Message", "Item Code/Part");
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() == 6) {
+                continue;
+            }
+            SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+            saleInterfaceItem.setDescription(jsonObject.getString("Description"));
+            saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+            saleInterfaceItem.setSyncItemCode(jsonObject.getString("Makers Reference"));
+            saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UOM"));
+            saleInterfaceItem.setHeadId(id);
+            saleInterfaceItemMapper.insert(saleInterfaceItem);
+        }
+        saleInterfaceSyncMapper.insert(saleInterfaceSync);
 
     }
 
+    public void parseVShips(MultipartFile file) throws Exception{
+        SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String id = UUIDGenerator.generate();
+        saleInterfaceSync.setId(id);
+        saleInterfaceSync.setCreateBy(sysUser.getUsername());
+        List<String> fieldList = new ArrayList<>();
+        fieldList.add("Item");
+        fieldList.add("Qty");
+        fieldList.add("UOM");
+        fieldList.add("Description");
+        fieldList.add("Makers Reference");
+        fieldList.add("Drawing Position");
+        fieldList.add("Discount");
+        fieldList.add("Unit Price");
+        fieldList.add("Total Price");
+
+        List<String> ignoreList = new ArrayList<>();
+        ignoreList.add("Page");
+        ignoreList.add("Request For Quotation");
+        ignoreList.add("LIMITED as Managers");
+        ignoreList.add("behalf of Owners Abundance");
+        ignoreList.add("Shipsure Version Number");
+        ignoreList.add("Plate / Sheet No");
+        ignoreList.add("Order Line Notes");
+        ignoreList.add("Sub Total");
+        ignoreList.add("Freight Cost");
+        ignoreList.add("Packaging Cost");
+        ignoreList.add("Grand Total");
+        ignoreList.add("(%)");
+
+        saleInterfaceSync.setPriority(PDFTableReader.getFields(file, "Priority", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerName(PDFTableReader.getFields(file, "Company Name:", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerContactName(PDFTableReader.getFields(file, "Our Contact", "", true).get(0).trim());
+        saleInterfaceSync.setBuyerTelephone(PDFTableReader.getFields(file, "Tel.", "", true).get(0).trim());
+        saleInterfaceSync.setReferenceNumber(PDFTableReader.getFields(file, "Request For Quote No.", "", true).get(0).trim());
+        saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO Number").get(0).trim());
+        saleInterfaceSync.setVesselCode(PDFTableReader.getFields(file, "Vessel Name", "", true).get(0).trim());
+
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "Sub Total", -1, "mediate", "Request For Quote No", "Makers Reference");
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() == 8) {
+                continue;
+            }
+            SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+            saleInterfaceItem.setDescription(jsonObject.getString("Description"));
+            saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+            saleInterfaceItem.setSyncItemCode(jsonObject.getString("Makers Reference"));
+            saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UOM"));
+            saleInterfaceItem.setHeadId(id);
+            saleInterfaceItemMapper.insert(saleInterfaceItem);
+        }
+        saleInterfaceSyncMapper.insert(saleInterfaceSync);
+    }
+
+
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 305 - 8
srm-module-code/src/main/java/org/jeecg/modules/saleCode/util/PDFTableReader.java

@@ -4,10 +4,16 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.apache.ibatis.jdbc.Null;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.text.PDFTextStripper;
 import org.apache.pdfbox.text.TextPosition;
+import org.jeecg.modules.saleCode.vo.PdfCell;
+import org.jeecg.modules.saleCode.vo.PdfRow;
+import org.jeecg.modules.saleCode.vo.PdfTable;
+import org.jeecg.modules.saleCode.vo.PdfTextPosition;
 import org.springframework.web.multipart.MultipartFile;
 import technology.tabula.*;
 import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
@@ -15,8 +21,10 @@ import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.util.*;
+import java.util.stream.Collectors;
 
 public class PDFTableReader<T> {
     // 换行符
@@ -261,8 +269,11 @@ public class PDFTableReader<T> {
     public static List<String> getFields(MultipartFile file, String startText, String endText, boolean sort) {
         //获取文档坐标
         List<String> result = new ArrayList<>();
+        InputStream inputStream = null;
+        PDDocument document = null;
         try {
-            PDDocument document =  PDDocument.load(file.getInputStream());
+            inputStream = file.getInputStream();
+            document =  PDDocument.load(inputStream);
             PDFTextStripper textStripper = new PDFTextStripper() {
                 @Override
                 protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
@@ -294,10 +305,27 @@ public class PDFTableReader<T> {
 
             document.close();
 
+
         } catch (IOException e) {
             e.printStackTrace();
+        }finally {
+            if(document != null){
+                try {
+                    document.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(inputStream != null){
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
         }
-        if(result == null && result.size() == 0) {
+        if(result == null || result.size() == 0) {
             result.add(" ");
         }
         return result;
@@ -308,8 +336,11 @@ public class PDFTableReader<T> {
         //获取文档坐标
         List<String> result = new ArrayList<>();
         final boolean[] startRecord = {false};
+        InputStream inputStream = null;
+        PDDocument document = null;
         try {
-            PDDocument document =  PDDocument.load(file.getInputStream());
+            inputStream = file.getInputStream();
+            document =  PDDocument.load(inputStream);
             PDFTextStripper textStripper = new PDFTextStripper() {
                 @Override
                 protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
@@ -338,8 +369,24 @@ public class PDFTableReader<T> {
 
         } catch (IOException e) {
             e.printStackTrace();
+        }finally {
+            if(document != null){
+                try {
+                    document.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(inputStream != null){
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
         }
-        if(result == null && result.size() == 0) {
+        if(result == null || result.size() == 0) {
             result.add(" ");
         }
         return result;
@@ -349,8 +396,11 @@ public class PDFTableReader<T> {
         //获取文档坐标
         List<String> result = new ArrayList<>();
         final boolean[] startRecord = {false};
+        InputStream inputStream = null;
+        PDDocument document = null;
         try {
-            PDDocument document =  PDDocument.load(file.getInputStream());
+            inputStream = file.getInputStream();
+            document =  PDDocument.load(inputStream);
             PDFTextStripper textStripper = new PDFTextStripper() {
                 @Override
                 protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
@@ -372,23 +422,254 @@ public class PDFTableReader<T> {
             textStripper.getText(document);
 
             document.close();
+            inputStream.close();
 
         } catch (IOException e) {
             e.printStackTrace();
+        }finally {
+            if(document != null){
+                try {
+                    document.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(inputStream != null){
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
         }
-        if(result == null && result.size() == 0) {
+        if(result == null || result.size() == 0) {
             result.add(" ");
         }
         return result;
     }
 
+    public static JSONArray getTableByPosition(MultipartFile file, List<String> fields, List<String> ignoreFields, String endKey, int tableEndIndex, String headerAlignment, String standardX, String headerYText) {
+        //获取文档坐标
+        JSONArray result = new JSONArray();
+        Map<String, List<PdfTextPosition>> documentPositions = new HashMap<>();
+        Map<Float, JSONObject> limitObject = new HashMap<>();
+        PdfTable pdfTable = getHeaderAndIgnoreLine(file, fields, ignoreFields, endKey, tableEndIndex, documentPositions, headerAlignment, standardX, headerYText);
+
+        List<PdfCell> cells = pdfTable.getHeaderRow().getCell().stream().sorted(Comparator.comparing(PdfCell::getCellStartX)).collect(Collectors.toList());
+        int index = 0;
+        cells = cells.stream().filter(item -> !(item.getCellY() < pdfTable.getHeaderRow().getRowY())).collect(Collectors.toList());
+        for(PdfCell cell : cells) {
+            //设置第一个表头宽度
+            if(index == 0) {
+                if (headerAlignment.equals("mediate")) {
+                    float space = cell.getCellStartX() - pdfTable.getStandardPosition();
+                    cell.setCellStartX(pdfTable.getStandardPosition());
+                    //单元格结束x值为起始x值 - 偏移量 + 结束x值
+                    cell.setCellEndX(cell.getCellEndX() + space);
+                } else if (headerAlignment.equals("left")) {
+                    cell.setCellStartX(0);
+                }
+                index ++;
+            }else {
+                if (headerAlignment.equals("mediate")) {
+                    //获取前一个单元格
+                    PdfCell prePdfCell = cells.get(index - 1);
+                    float space = cell.getCellStartX() - prePdfCell.getCellEndX();
+                    cell.setCellStartX(prePdfCell.getCellEndX());
+                    cell.setCellEndX(cell.getCellEndX() + space);
+                } else if (headerAlignment.equals("left")) {
+                    //获取前一个单元格
+                    PdfCell prePdfCell = cells.get(index - 1);
+                    //设置前一个单元格的endx值为当前单元格的startx
+                    prePdfCell.setCellEndX(cell.getCellStartX());
+                    if (cell.getHeaderText().equals(fields.get(fields.size() - 1))) {
+                        cell.setCellEndX(pdfTable.getWidth());
+                    }
+                }
+                index ++;
+            }
+
+        }
+
+        for (String key : documentPositions.keySet()) {
+            List<PdfTextPosition> item = documentPositions.get(key);
+            //处理在表格起始行下和结束行上并且不在忽略行中的数据
+            if ((item.get(0).getY() > pdfTable.getTableStartY() &&
+                    item.get(0).getY() < pdfTable.getTableEndY())
+                    && pdfTable.getIgnoreRows().get(item.get(0).getY()) == null) {
+                for (PdfCell pdfCell : pdfTable.getHeaderRow().getCell()) {
+                    //判断此文本的起始x值或结束x值是否存在于表格头对应的单元格的x值区间内,是就添加为此表头对应的数据
+                    float cellStartX = item.get(0).getX();
+                    float cellY = item.get(0).getY();
+                    float cellEndX = item.get(item.size() - 1).getX();
+                    if (cellEndX < pdfCell.getCellEndX() && cellEndX > pdfCell.getCellStartX()) {
+                        JSONObject jsonObject = limitObject.get(cellY) == null ? new JSONObject() : limitObject.get(cellY);
+                        if(jsonObject.get(pdfCell.getHeaderText()) == null) {
+                            jsonObject.put(pdfCell.getHeaderText(), key.split("-@@@-")[0]);
+                        }
+                        limitObject.put(cellY, jsonObject);
+                    }
+                }
+            }
+        }
+
+        for(Float key : limitObject.keySet()) {
+            result.add(limitObject.get(key));
+        }
+        if (result == null || result.size() == 0) {
+            result.add(" ");
+        }
+        return result;
+    }
+
+    public static PdfTable getHeaderAndIgnoreLine(MultipartFile file, List<String> fields, List<String> ignoreFields, String endKey, int tableEndIndex, Map<String, List<PdfTextPosition>> documentPositions, String headerAlignment, String standardX, String headerYText) {
+        PdfTable pdfTable = new PdfTable();
+
+        try {
+            InputStream inputStream = file.getInputStream();
+            PDDocument document = PDDocument.load(inputStream);
+            PdfRow headerRow = new PdfRow();
+            PDFTextStripper textStripper = new PDFTextStripper() {
+                private int pageNumber = 0;
+                float width = 0;
+                float height = 0;
+                float standardXPosition = 0;
+                @Override
+                protected void writePage() throws IOException {
+                    pageNumber++;
+                    PDPage page = document.getPage(pageNumber - 1);
+                    width = page.getMediaBox().getWidth();
+                    height = page.getMediaBox().getHeight();
+                    pdfTable.setWidth(width);
+                    pdfTable.setHeight(height);
+                    super.writePage();
+                }
+
+                @Override
+                protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
+                    //设置左侧空白偏移量
+                    if(text.contains(standardX)) {
+                        pdfTable.setStandardPosition(textPositions.get(0).getX());
+                    }
+
+                    //重置textPositions各字段高度,加上每页页码*高度
+                    List<PdfTextPosition> positions = new ArrayList<>();
+                    for(TextPosition textPosition : textPositions) {
+                        PdfTextPosition position = new PdfTextPosition();
+                        position.setX(textPosition.getX());
+                        position.setY(textPosition.getY() + (pageNumber - 1) * height);
+                        position.setPageNum(pageNumber);
+                        positions.add(position);
+                    }
+                    documentPositions.put(text + "-@@@-" + (positions.get(0).getX() + positions.get(0).getY()), positions);
+                    //设置行高
+                    if(text.contains(headerYText)) {
+                        headerRow.setRowY(positions.get(0).getY());
+                    }
+                    //获取header所在行
+                    List<PdfCell> pdfCells = headerRow.getCell() == null ? new ArrayList<>() : headerRow.getCell();
+
+                    for (String filed : fields) {
+                        if (text.contains(filed)) {
+                            PdfCell pdfCell = new PdfCell();
+//                            //处理表格头的单元格边界,根据表头的排列方式来决定单元格宽度
+//                            if (pdfCells != null && pdfCells.size() > 0) {
+//                                //居中对齐,字符串左右宽度一致,从第一个开始往后顺
+//                                if(headerAlignment.equals("mediate")) {
+//                                    //获取前一个单元格
+//                                    PdfCell prePdfCell = pdfCells.get(pdfCells.size() - 1);
+//                                    float space = textPositions.get(0).getX() - prePdfCell.getCellEndX();
+//                                    pdfCell.setCellStartX(prePdfCell.getCellEndX());
+//                                    pdfCell.setCellEndX(textPositions.get(textPositions.size() - 1).getX() + space);
+//                                }else if(headerAlignment.equals("left")) {
+//                                    //获取前一个单元格
+//                                    PdfCell prePdfCell = pdfCells.get(pdfCells.size() - 1);
+//                                    //设置前一个单元格的endx值为当前单元格的startx
+//                                    prePdfCell.setCellEndX(textPositions.get(0).getX());
+//                                    pdfCell.setCellStartX(textPositions.get(0).getX());
+//                                    if(filed.equals(fields.get(fields.size() - 1))) {
+//                                        pdfCell.setCellEndX(width);
+//                                    }
+//                                }
+//
+//                            } else {
+//                                //设置第一个表头宽度
+//                                if(headerAlignment.equals("mediate")) {
+//                                    pdfCell.setCellStartX(standardXPosition);
+//                                    //单元格结束x值为起始x值 - 偏移量 + 结束x值
+//                                    pdfCell.setCellEndX(textPositions.get(textPositions.size() - 1).getX() + textPositions.get(0).getX() - standardXPosition);
+//                                }else if(headerAlignment.equals("left")) {
+//                                    pdfCell.setCellStartX(0);
+//                                }
+//                            }
+                            pdfCell.setCellY(positions.get(0).getY());
+                            pdfCell.setHeaderText(filed);
+                            pdfCell.setCellStartX(textPositions.get(0).getX());
+                            pdfCell.setCellEndX(textPositions.get(textPositions.size() - 1).getX());
+                            pdfCells.add(pdfCell);
+
+                        }
+                    }
+
+
+                    //添加忽略行
+                    for (String ignoreField : ignoreFields) {
+                        if (text.contains(ignoreField)) {
+                            Map<Float, Boolean> ignoreRows = pdfTable.getIgnoreRows() == null ? new HashMap<>() : pdfTable.getIgnoreRows();
+                            PdfRow pdfRow = new PdfRow();
+                            pdfRow.setRowY(positions.get(0).getY());
+                            ignoreRows.put(pdfRow.getRowY(), true);
+                            pdfTable.setIgnoreRows(ignoreRows);
+                        }
+                    }
+                    headerRow.setCell(pdfCells);
+
+                    if(headerRow.getCell() != null && headerRow.getCell().size() > 0) {
+                        pdfTable.setTableStartY(headerRow.getCell().get(0).getCellY());
+                        //提供了表格结束行数据就用,不用就按给的字段模糊匹
+                        if (tableEndIndex == -1) {
+                            if(Strings.isBlank(endKey)) {
+                                pdfTable.setTableEndY(document.getNumberOfPages() * height);
+                            }else if (text.contains(endKey)) {
+                                pdfTable.setTableEndY(positions.get(0).getY());
+                            }
+                        } else {
+                            pdfTable.setTableEndY(tableEndIndex);
+                        }
+                    }
+
+                    pdfTable.setHeaderRow(headerRow);
+                }
+            };
+
+            textStripper.setSortByPosition(true);
+            textStripper.setStartPage(1);
+            textStripper.setEndPage(document.getNumberOfPages());
+            textStripper.getText(document);
+            document.close();
+            inputStream.close();
+
+
+
+        } catch (IOException e) {
+            System.out.println("测试出问题了");
+            e.printStackTrace();
+        }
+        return pdfTable;
+
+    }
+
     public static JSONArray getTable(MultipartFile file, List<String> header) {
 
 
         JSONArray jsonArray = new JSONArray();
         SpreadsheetExtractionAlgorithm algorithm = new SpreadsheetExtractionAlgorithm();
-
-        try (PDDocument document = PDDocument.load(file.getInputStream())) {
+        PDDocument document = null;
+        InputStream inputStream = null;
+        try {
+            inputStream = file.getInputStream();
+            document = PDDocument.load(inputStream);
             ObjectExtractor extractor = new ObjectExtractor(document);
             PageIterator pi = extractor.extract();
             // 遍历页
@@ -413,6 +694,22 @@ public class PDFTableReader<T> {
             }
         } catch (Exception e) {
             e.printStackTrace();
+        }finally {
+            if(document != null){
+                try {
+                    document.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(inputStream != null){
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
         }
         return jsonArray;
     }

+ 15 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/vo/PdfCell.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.saleCode.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PdfCell {
+    float cellStartX;
+    float cellEndX;
+    float cellY;
+    String headerText;
+}

+ 17 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/vo/PdfRow.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.saleCode.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PdfRow {
+    int rowNum;
+    float rowX;
+    float rowY;
+    List<PdfCell> cell;
+}

+ 27 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/vo/PdfTable.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.saleCode.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.ibatis.jdbc.Null;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PdfTable {
+    float tableStartX;
+    float tableStartY;
+    float tableEndX;
+    float tableEndY;
+    float ignoreY;
+    float standardPosition;
+    float width;
+    float height;
+    float pageNums;
+    PdfRow headerRow;
+    List<PdfRow> pdfRows;
+    Map<Float, Boolean> ignoreRows;
+}

+ 14 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/vo/PdfTextPosition.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.saleCode.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PdfTextPosition {
+    float X;
+    float Y;
+    int pageNum;
+}