浏览代码

anglo模板导入

zhouxingyu 1 周之前
父节点
当前提交
49a63f6f17

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

@@ -38,6 +38,8 @@ import org.jeecg.modules.saleCode.service.ISaleInterfaceSyncService;
 import org.jeecg.modules.saleCode.util.HttpUtils;
 import org.jeecg.modules.saleCode.util.MonthUtil;
 import org.jeecg.modules.saleCode.util.PDFTableReader;
+import org.jeecg.modules.saleCode.vo.PdfCell;
+import org.jeecg.modules.saleCode.vo.PdfTable;
 import org.jeecg.modules.system.mapper.SysDictMapper;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.stereotype.Service;
@@ -561,6 +563,9 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
             case "9" :
                 parseTechnava(file);
                 break;
+            case "10":
+                parseAnglo(file);
+                break;
             default:
                 return;
         }
@@ -619,7 +624,8 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         saleInterfaceSync.setReferenceNumber(PDFTableReader.getFields(file, "Request For Quote No.", "", true).get(0));
         saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO Number").get(0));
         saleInterfaceSync.setVesselCode(PDFTableReader.getFields(file, "Vessel Name", "", true).get(0).toUpperCase());
-        saleInterfaceSync.setSubject(PDFTableReader.getLineByTitle(file, "Request For Quote No", "Order Title", "Priority", "Spare Part Type"));
+        PdfTable pdfTable = PDFTableReader.initTable(file, "Request For Quote No");
+        saleInterfaceSync.setSubject(PDFTableReader.getLineByTitle(pdfTable, "Order Title", "Priority", "Spare Part Type"));
         String[] removeLine = {"Page", "Request For Quotation", "CSL Australia", "vessel m/v CSL RELIANCE", "Shipsure Version", "Notes"};
         saleInterfaceSync.setComment(Strings.join(PDFTableReader.getMultipleLineFields(file, "Supplier Notes", "Terms and Conditions", removeLine, true), ' '));
 
@@ -847,25 +853,37 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         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));
-        //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));
-        saleInterfaceSync.setSupplierName(PDFTableReader.getNextLineFields(file, "Supplier Details:").get(0));
-        //saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO Number").get(0).trim());
-        saleInterfaceSync.setVesselCode(PDFTableReader.getFields(file, "Vessel:", "", true).get(0));
-        saleInterfaceSync.setCurrencyCode(PDFTableReader.getFields(file, "Currency: ", "", true).get(0));
-
-        String[] extra = {"Page", "Equipment Section Name"};
+        PdfTable pdfTable = PDFTableReader.initTable(file, "Buyer Details:");
+        saleInterfaceSync.setReferenceNumber(PDFTableReader.getLineByTitle(pdfTable, "RFQ Ref:", "Vessel:", null));
+        saleInterfaceSync.setSubject(PDFTableReader.getLineByTitle(pdfTable, "Subject:", "Vessel Arrival Est.:", "Requested Delivery:"));
+        String vessel = PDFTableReader.getLineByTitle(pdfTable, "Vessel:", null, null);
+        String[] split = vessel.split("\\(");
+        saleInterfaceSync.setVesselCode(split[0]);
+        saleInterfaceSync.setVesselImo(split[1].replaceAll("\\)", ""));
+        saleInterfaceSync.setCurrencyCode(PDFTableReader.getLineByTitle(pdfTable, "Currency:", null, null));
+        List<PdfCell> rowsByTitle = PDFTableReader.getRowsByTitle(pdfTable, "Buyer Details:", "Supplier Details:", "Vessel:");
+        saleInterfaceSync.setBuyerName(rowsByTitle.get(1).getText());
+        saleInterfaceSync.setBuyerContactName(rowsByTitle.get(rowsByTitle.size() - 4).getText());
+        saleInterfaceSync.setBuyerTelephone(rowsByTitle.get(rowsByTitle.size() - 3).getText());
+        saleInterfaceSync.setBuyerEmail(rowsByTitle.get(rowsByTitle.size() - 2).getText());
+
+        List<PdfCell> time = PDFTableReader.getRowsByTitle(pdfTable, "Request For Quote", null, "Currency:");
+        try {
+            String[] date = time.get(2).getText().split(",")[0].split(" ");
+            String day = date[2] + "-" + MonthUtil.getMonthValue(date[1]) + "-" + date[0];
+            saleInterfaceSync.setSubmittedDate(DateUtils.parseDate(day, "yyyy-MM-dd"));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        String[] extra = {"Buyer comments:"};
         JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "ShipServ Buyer Record:", -1, "left", "Buyer Details:", "Item Description", extra, 5, 0);
         for(Object node : jsonArray) {
             JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
-            if(jsonObject.size() == 0) {
+            if(jsonObject.size() >= 0) {
                 SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
                 saleInterfaceItem.setDescription(jsonObject.getString("Item Description"));
                 saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
-                saleInterfaceItem.setSyncItemCode(jsonObject.getString("Part Number"));
+                saleInterfaceItem.setSupplierPartNumber(jsonObject.getString("Part Number"));
                 saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UoM"));
                 saleInterfaceItem.setHeadId(id);
                 saleInterfaceItemMapper.insert(saleInterfaceItem);
@@ -915,7 +933,7 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "", -1, "left", "Buyer Message", "Item Code/Part", extra, 6, 0);
         for(Object node : jsonArray) {
             JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
-            if(jsonObject.size() == 0) {
+            if(jsonObject.size() >= 0) {
                 SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
                 saleInterfaceItem.setDescription(jsonObject.getString("Description"));
                 saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
@@ -978,7 +996,8 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         if (matcher.find()) {
             saleInterfaceSync.setBuyerEmail(matcher.group(1));
         }
-        saleInterfaceSync.setSubject(PDFTableReader.getLineByTitle(file, "Request For Quote No", "Order Title", "Priority", "Spare Part Type"));
+        PdfTable pdfTable = PDFTableReader.initTable(file, "Request For Quote No");
+        saleInterfaceSync.setSubject(PDFTableReader.getLineByTitle(pdfTable, "Order Title", "Priority", "Spare Part Type"));
         saleInterfaceSync.setBuyerTelephone(PDFTableReader.getFields(file, "Tel.", "", true).get(0));
         saleInterfaceSync.setReferenceNumber(PDFTableReader.getFields(file, "Request For Quote No.", "", true).get(0));
         saleInterfaceSync.setVesselImo(PDFTableReader.getNextLineFields(file, "IMO Number").get(0));
@@ -1009,6 +1028,74 @@ public class SaleInterfaceSyncServiceImpl extends ServiceImpl<SaleInterfaceSyncM
         saleInterfaceSyncMapper.insert(saleInterfaceSync);
     }
 
+    public void parseAnglo(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("#");
+        fieldList.add("Part Number");
+        fieldList.add("Item Description");
+        fieldList.add("Quality");
+        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("(%)");
+
+        PdfTable pdfTable = PDFTableReader.initTable(file, "Buyer Details:");
+        saleInterfaceSync.setReferenceNumber(PDFTableReader.getLineByTitle(pdfTable, "RFQ Ref:", "Vessel:", null));
+        saleInterfaceSync.setSubject(PDFTableReader.getLineByTitle(pdfTable, "Subject:", "Vessel Arrival Est.:", "Requested Delivery:"));
+        String vessel = PDFTableReader.getLineByTitle(pdfTable, "Vessel:", null, null);
+        String[] split = vessel.split("\\(");
+        saleInterfaceSync.setVesselCode(split[0]);
+        saleInterfaceSync.setVesselImo(split[1].replaceAll("\\)", ""));
+        saleInterfaceSync.setCurrencyCode(PDFTableReader.getLineByTitle(pdfTable, "Currency:", null, null));
+        List<PdfCell> rowsByTitle = PDFTableReader.getRowsByTitle(pdfTable, "Buyer Details:", "Supplier Details:", "Vessel:");
+        saleInterfaceSync.setBuyerName(rowsByTitle.get(1).getText());
+        saleInterfaceSync.setBuyerContactName(rowsByTitle.get(rowsByTitle.size() - 4).getText());
+        saleInterfaceSync.setBuyerTelephone(rowsByTitle.get(rowsByTitle.size() - 3).getText());
+        saleInterfaceSync.setBuyerEmail(rowsByTitle.get(rowsByTitle.size() - 2).getText());
+
+        List<PdfCell> time = PDFTableReader.getRowsByTitle(pdfTable, "Request For Quote", null, "Currency:");
+        try {
+            String[] date = time.get(2).getText().split(",")[0].split(" ");
+            String day = date[2] + "-" + MonthUtil.getMonthValue(date[1]) + "-" + date[0];
+            saleInterfaceSync.setSubmittedDate(DateUtils.parseDate(day, "yyyy-MM-dd"));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        String[] extra = {"Buyer comments:"};
+        JSONArray jsonArray = PDFTableReader.getTableByPosition(file, fieldList, ignoreList, "ShipServ Buyer Record:", -1, "left", "Buyer Details:", "Item Description", extra, 5, 0);
+        for(Object node : jsonArray) {
+            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(node));
+            if(jsonObject.size() >= 0) {
+                SaleInterfaceItem saleInterfaceItem = new SaleInterfaceItem();
+                saleInterfaceItem.setDescription(jsonObject.getString("Item Description"));
+                saleInterfaceItem.setQuantity(jsonObject.getString("Qty"));
+                saleInterfaceItem.setSupplierPartNumber(jsonObject.getString("Part Number"));
+                saleInterfaceItem.setUnitOfMeasure(jsonObject.getString("UoM"));
+                saleInterfaceItem.setHeadId(id);
+                saleInterfaceItemMapper.insert(saleInterfaceItem);
+            }
+        }
+        saleInterfaceSyncMapper.insert(saleInterfaceSync);
+    }
+
+
     public void parseTechnava(MultipartFile file) throws Exception{
         SaleInterfaceSync saleInterfaceSync = new SaleInterfaceSync();
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();

+ 2 - 0
srm-module-code/src/main/java/org/jeecg/modules/saleCode/util/MonthUtil.java

@@ -13,7 +13,9 @@ public class MonthUtil {
         monthAbbreviationToNumberMap.put("Apr", "04");
         monthAbbreviationToNumberMap.put("May", "05");
         monthAbbreviationToNumberMap.put("Jun", "06");
+        monthAbbreviationToNumberMap.put("June", "06");
         monthAbbreviationToNumberMap.put("Jul", "07");
+        monthAbbreviationToNumberMap.put("July", "07");
         monthAbbreviationToNumberMap.put("Aug", "08");
         monthAbbreviationToNumberMap.put("Sep", "09");
         monthAbbreviationToNumberMap.put("Oct", "10");

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

@@ -202,8 +202,7 @@ public class PDFTableReader<T> {
 
     }
 
-    public static String getLineByTitle(MultipartFile file, String standardX, String title, String afterTitle, String nextTitle) {
-        PdfTable pdfTable = handlePdf(file, standardX);
+    public static String getLineByTitle(PdfTable pdfTable, String title, String afterTitle, String nextTitle) {
         Map<Float, PdfRow> pdfRows = pdfTable.getPdfRows();
         Float titleRow = Float.NaN;
         Float nextRow = null;
@@ -270,6 +269,76 @@ public class PDFTableReader<T> {
 
 
 
+        //确定内容行和最低限制行后,如果需要获取的内容后有其他干扰title,则需要加上aftertitle辨识,只获取aftertitle之前的内容
+    }
+
+    public static List<PdfCell> getRowsByTitle(PdfTable pdfTable, String title, String afterTitle, String nextTitle) {
+        Map<Float, PdfRow> pdfRows = pdfTable.getPdfRows();
+        Float titleRow = Float.NaN;
+        Float nextRow = null;
+        Float titleStartX = null;
+        Float titleEndX = null;
+        Float afterTitleX = null;
+        for(Float key : pdfRows.keySet()) {
+            //确定title所在行
+            PdfRow pdfRow = pdfRows.get(key);
+            if(pdfRow == null) continue;
+            List<PdfCell> pdfCells = pdfRow.getCell();
+            for(PdfCell pdfCell : pdfCells) {
+                if(pdfCell.getText().contains(title)) {
+                    titleRow = key;
+                    titleStartX = pdfCell.getCellStartX();
+                }
+                //如果是多行,则获取截取行所在行高度
+                if(nextTitle != null) {
+                    if(pdfCell.getText().contains(nextTitle)) {
+                        nextRow = key;
+                    }
+                }
+                //如果需要获取的内容后有其他干扰title,则需要加上aftertitle辨识,只获取aftertitle之前的内容
+                //获取aftertitle的起始X
+                if(afterTitle != null) {
+                    if(pdfCell.getText().contains(afterTitle)) {
+                        afterTitleX = pdfCell.getCellStartX();
+                    }
+                }
+            }
+        }
+
+        //根据titleRow和nextRow获取多行数据
+        List<Float> collect = new ArrayList<>();
+        if(nextRow != null) {
+            Float finalTitleRow = titleRow;
+            Float finalNextRow = nextRow;
+            collect = pdfRows.keySet().stream().filter(item -> {
+                return item >= finalTitleRow && item < finalNextRow;
+            }).sorted().collect(Collectors.toList());
+        }else {
+            collect.add(titleRow);
+        }
+
+        List<PdfCell> result = new ArrayList<>();
+        for(Float row : collect) {
+            PdfRow pdfRow = pdfRows.get(row);
+            if(pdfRow == null) continue;
+            List<PdfCell> cells = pdfRow.getCell();
+            for(PdfCell cell : cells) {
+                //如果存在右侧隔绝列,则将每行小于此隔绝列值的数据按顺序添加,否则就添加此行所有在选定标题起始X之后的数据
+                if(afterTitleX == null) {
+                    //设置绝对大值,使每个单元格都能被包裹
+                    afterTitleX = Float.valueOf("5000");
+                }
+                if(cell.getCellEndX() <= afterTitleX) {
+                    result.add(cell);
+                }
+
+            }
+        }
+        return result;
+
+
+
+
         //确定内容行和最低限制行后,如果需要获取的内容后有其他干扰title,则需要加上aftertitle辨识,只获取aftertitle之前的内容
     }