From de54d8a448ac0040f423eea49951a0f3774813df Mon Sep 17 00:00:00 2001 From: yishiqihuasheng <1191093413@qq.com> Date: Thu, 24 Aug 2023 15:38:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E7=AE=B1=E8=A7=A3=E6=9E=90=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=87=8D=E5=A4=8D=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dxhy/core/task/SnEmailGatherTask.java | 621 +++++++++++++++--- 1 file changed, 537 insertions(+), 84 deletions(-) diff --git a/dxhy-core/src/main/java/com/dxhy/core/task/SnEmailGatherTask.java b/dxhy-core/src/main/java/com/dxhy/core/task/SnEmailGatherTask.java index c43c6764..f8147784 100644 --- a/dxhy-core/src/main/java/com/dxhy/core/task/SnEmailGatherTask.java +++ b/dxhy-core/src/main/java/com/dxhy/core/task/SnEmailGatherTask.java @@ -7,6 +7,7 @@ import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSONObject; import com.dxhy.common.constant.DbConstant; import com.dxhy.common.datasource.config.DynamicContextHolder; +import com.dxhy.common.util.FileUtil; import com.dxhy.common.util.MD5; import com.dxhy.common.util.UUIDUtils; import com.dxhy.core.job.entity.ScheduleJobEntity; @@ -19,8 +20,9 @@ import com.dxhy.core.service.mailGather.EmailMaintainService; import com.dxhy.core.service.mailGather.MailGatherLogService; import com.dxhy.core.service.openservice.IOpenServicePlatformService; import com.dxhy.core.service.openservice.impl.OpenServicePlatformServiceImpl; -import com.dxhy.core.service.openservice.model.ocr.SnpjInvoiceTypeEnum; +import com.dxhy.core.service.openservice.model.ocr.*; import com.dxhy.core.util.EmailParseUtils; +import com.github.pagehelper.util.StringUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.sun.mail.pop3.POP3Folder; @@ -39,6 +41,7 @@ import java.util.Date; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.stream.Collectors; @Component("snEmailGatherTask") @@ -102,15 +105,19 @@ public class SnEmailGatherTask { String password = Base64Decoder.decodeStr(maintainVo.getEmailPassword()); String emailName = maintainVo.getEmailAddress(); + String uid = maintainVo.getEmailUid(); + Folder folder = null; + Store store = null; + List uids = Lists.newArrayList(); try { - Store store = mailAuth(emailName, password); + store = mailAuth(emailName, password); if(store == null){ MailGatherLogVo gatherLogVo = new MailGatherLogVo(); gatherLogVo.setFromAddress(emailName); buildMsg(gatherLogVo,"1","邮箱认证失败"); return; } - Folder folder = store.getFolder("INBOX"); + folder = store.getFolder("INBOX"); //获取邮件列表 folder.open(Folder.READ_WRITE); // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数 @@ -120,9 +127,18 @@ public class SnEmailGatherTask { log.debug("新邮件: " + folder.getNewMessageCount()); // 获得收件箱中的邮件总数 log.debug("邮件总数: " + folder.getMessageCount()); - EmailMaintainVo emailMaintainVo = new EmailMaintainVo(); - emailMaintainVo.setId(maintainVo.getId()); +// EmailMaintainVo emailMaintainVo = new EmailMaintainVo(); +// emailMaintainVo.setId(maintainVo.getId()); Message[] messages = folder.getMessages(); + POP3Folder inbox = (POP3Folder) folder; + for (int i = 0; i < messages.length; i++) { + String euid = inbox.getUID(messages[i]); + uids.add(euid); + } + boolean flag = true; + if (StringUtils.isBlank(maintainVo.getEmailUid()) || !uids.contains(maintainVo.getEmailUid())){ + flag = false; + } for (int i = 0, count = messages.length; i < count; i++) { MimeMessage msg = (MimeMessage) messages[i]; log.debug("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- "); @@ -146,17 +162,21 @@ public class SnEmailGatherTask { // log.debug("是否需要回执:" + EmailParseUtils.isReplySign(msg)); log.debug("邮件大小:" + msg.getSize() * 1024 + "kb"); - POP3Folder inbox = (POP3Folder) folder; - String uid = inbox.getUID(msg); - if(StringUtils.isBlank(maintainVo.getEmailUid()) && i+1 == messages.length){ - emailMaintainVo.setEmailUid(uid); - buildEmailMaintainVo(emailMaintainVo); - } else if(i+1 == messages.length){ - emailMaintainVo.setEmailUid(uid); - buildEmailMaintainVo(emailMaintainVo); - } + uid = inbox.getUID(msg); +// if(StringUtils.isBlank(maintainVo.getEmailUid()) && i+1 == messages.length){ +// emailMaintainVo.setEmailUid(uid); +// buildEmailMaintainVo(emailMaintainVo); +// } else if(i+1 == messages.length){ +// emailMaintainVo.setEmailUid(uid); +// buildEmailMaintainVo(emailMaintainVo); +// } //增量处理 等于之后就跳过本地循环 - if(StringUtils.isNotBlank(maintainVo.getEmailUid()) && maintainVo.getEmailUid().equals(uid)){ + if (StringUtils.isNotBlank(uid) && uid.equals(maintainVo.getEmailUid())){ + flag = false; + log.debug("跳过本次循环: "+maintainVo.getEmailUid()+"===="+uid); + continue; + } + if(flag){ log.debug("跳过本次循环: "+maintainVo.getEmailUid()+"===="+uid); continue; } @@ -221,8 +241,8 @@ public class SnEmailGatherTask { } } // 释放资源 - folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用 - store.close(); +// folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用 +// store.close(); log.info("邮箱采集使用时间:{}",System.currentTimeMillis() - startTime); } catch (MessagingException e) { log.error("邮箱采集邮件解析异常:{}", e); @@ -230,6 +250,26 @@ public class SnEmailGatherTask { } catch (IOException e) { log.error("邮箱采集IO异常:{}", e); throw new RuntimeException(e); + }finally { + //更新uid信息 + if (uids.isEmpty() ||uids.indexOf(uid)>uids.indexOf(maintainVo.getEmailUid())){ + EmailMaintainVo emailMaintainVo = new EmailMaintainVo(); + emailMaintainVo.setId(maintainVo.getId()); + emailMaintainVo.setEmailUid(uid); + buildEmailMaintainVo(emailMaintainVo); + } + // 释放资源 + // false为不更新邮件,true为更新,一般在删除邮件后使用 + try { + if (folder != null){ + folder.close(false); + } + if (store != null){ + store.close(); + } + } catch (MessagingException e) { + log.debug("关流失败"); + } } } @@ -327,90 +367,503 @@ public class SnEmailGatherTask { } public static void main(String[] args) { - //邮件接收协议 - String mail_protocol = "mail.store.protocol"; - //邮件接收协议类型 - String mail_protocol_type2 = "pop3"; - String mail_protocol_type = "pop"; - //邮件接收服务器端口 - String mail_port = "mail.pop3.port"; - //邮件接收服务器端口 - String port = "110"; - //邮件接收服务器地址 - String mail_host = "mail.pop3.host"; - String emailName = "1149953701@qq.com"; - String password = "pmdzleyabmlzgdhc"; - String mailSuffix = emailName.split("@")[1]; - //邮箱类型 - String mailType = mailSuffix.split("\\.")[0]; - Properties props = new Properties(); - if(mailType.equalsIgnoreCase("qq")){ - //qq邮箱 - props.setProperty(mail_protocol, mail_protocol_type2); // 协议 - props.setProperty(mail_host, mail_protocol_type+"."+mailSuffix); // pop3服务器 - props.setProperty(mail_port, port); // 端口 - }else { - props.setProperty(mail_protocol, mail_protocol_type2); // 协议 - props.setProperty(mail_host, mail_protocol_type2+"."+mailSuffix); // pop3服务器 - props.setProperty(mail_port, port); // 端口 - } - Session session = Session.getInstance(props); + EmailMaintainVo maintainVo = new EmailMaintainVo(); + maintainVo.setCompanyCode("9250"); + maintainVo.setEmailAddress("1191093413@qq.com"); + maintainVo.setEmailPassword("dWZobmdibGx5ZGRjZ2dlaA=="); + maintainVo.setEmailUid("ZL0006_d9LNZsKMdoguImQAO4OILd7sss"); + maintainVo.setId("RtDaFlwqZKU47MHi2Y_S4"); + + log.info("邮箱采集内部方法开始执行--"); + long startTime = System.currentTimeMillis(); + String password = Base64Decoder.decodeStr(maintainVo.getEmailPassword()); + String emailName = maintainVo.getEmailAddress(); + + String uid = maintainVo.getEmailUid(); + Folder folder = null; Store store = null; + List uids = Lists.newArrayList(); try { - store = session.getStore("pop3"); - store.connect(emailName, password); - //连接邮箱服务器 - //获取当前时间 - Date currentTime = new Date(); - // 获得收件箱 pop3协议只有一个有效的文件夹就是INBOX - Folder folder = store.getFolder("INBOX"); + //判断是否为QQ还是163 + //邮件接收协议 + String mail_protocol = "mail.store.protocol"; + //邮件接收协议类型 + String mail_protocol_type2 = "pop3"; + String mail_protocol_type = "pop"; + //邮件接收服务器端口 + String mail_port = "mail.pop3.port"; + //邮件接收服务器端口 + String port = "110"; + //邮件接收服务器地址 + String mail_host = "mail.pop3.host"; + String mailSuffix = emailName.split("@")[1]; + //邮箱类型 + String mailType = mailSuffix.split("\\.")[0]; + Properties props = new Properties(); + if(mailType.equalsIgnoreCase("qq")){ + //qq邮箱 + props.setProperty(mail_protocol, mail_protocol_type2); // 协议 + props.setProperty(mail_host, mail_protocol_type+"."+mailSuffix); // pop3服务器 + props.setProperty(mail_port, port); // 端口 + }else { + props.setProperty(mail_protocol, mail_protocol_type); // 协议 + props.setProperty(mail_host, mail_protocol_type+"."+mailSuffix); // pop3服务器 + props.setProperty(mail_port, port); // 端口 + } + Session session = Session.getInstance(props); + try { + store = session.getStore("pop3"); + store.connect(emailName, password); + } catch (Exception e) { + try { + store.close(); + } catch (MessagingException ex) { + throw new RuntimeException(ex); + } + store = null; + } + if(store == null){ + log.info("store为空"); + return; + } + folder = store.getFolder("INBOX"); //获取邮件列表 folder.open(Folder.READ_WRITE); // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数 - System.out.println("未读邮件数: " + folder.getUnreadMessageCount()); + log.debug("未读邮件数: " + folder.getUnreadMessageCount()); // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0 - System.out.println("删除邮件数: " + folder.getDeletedMessageCount()); - System.out.println("新邮件: " + folder.getNewMessageCount()); + log.debug("删除邮件数: " + folder.getDeletedMessageCount()); + log.debug("新邮件: " + folder.getNewMessageCount()); // 获得收件箱中的邮件总数 - System.out.println("邮件总数: " + folder.getMessageCount()); + log.debug("邮件总数: " + folder.getMessageCount()); + EmailMaintainVo emailMaintainVo = new EmailMaintainVo(); + emailMaintainVo.setId(maintainVo.getId()); Message[] messages = folder.getMessages(); + POP3Folder inbox = (POP3Folder) folder; + for (int i = 0; i < messages.length; i++) { + String euid = inbox.getUID(messages[i]); + uids.add(euid); + } + boolean flag = true; + if (StringUtils.isBlank(maintainVo.getEmailUid()) || !uids.contains(maintainVo.getEmailUid())){ + flag = false; + } for (int i = 0, count = messages.length; i < count; i++) { MimeMessage msg = (MimeMessage) messages[i]; - System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- "); - System.out.println("主题: " + EmailParseUtils.getSubject(msg)); - System.out.println("发件人: " + EmailParseUtils.getFrom(msg)); - System.out.println("收件人:" + EmailParseUtils.getReceiveAddress(msg, null)); - System.out.println("发送时间:" + EmailParseUtils.getSentDate(msg, null)); - System.out.println("是否已读:" + EmailParseUtils.isSeen(msg)); - System.out.println("邮件优先级:" + EmailParseUtils.getPriority(msg)); - System.out.println("是否需要回执:" + EmailParseUtils.isReplySign(msg)); - System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb"); + log.debug("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- "); + + MailGatherLogVo gatherLogVo = new MailGatherLogVo(); + gatherLogVo.setId(IdUtil.nanoId()); + gatherLogVo.setSubject(EmailParseUtils.getSubject(msg)); + gatherLogVo.setFromAddress(emailName); + gatherLogVo.setReceiveAddress(emailName); + String sentDate = EmailParseUtils.getSentDate(msg, null); + gatherLogVo.setSentDate(sentDate); + gatherLogVo.setCreateTime(new Date()); + + log.debug("主题: " + EmailParseUtils.getSubject(msg)); + log.debug("发件人: " + EmailParseUtils.getFrom(msg)); + log.debug("发送时间:" + sentDate); + log.debug("是否已读:" + EmailParseUtils.isSeen(msg)); + log.debug("邮件大小:" + msg.getSize() * 1024 + "kb"); + + uid = inbox.getUID(msg); + log.info("uid{}",uid); + //增量处理 等于之后就跳过本地循环 + if (StringUtils.isNotBlank(uid) && uid.equals(maintainVo.getEmailUid())){ + flag = false; + log.debug("跳过本次循环: "+maintainVo.getEmailUid()+"===="+uid); + continue; + } + if(flag){ + log.debug("跳过本次循环: "+maintainVo.getEmailUid()+"===="+uid); + continue; + } + gatherLogVo.setMsgUid(uid); boolean isContainerAttachment = EmailParseUtils.isContainAttachment(msg); - POP3Folder inbox = (POP3Folder) folder; - String uid = inbox.getUID(msg); - System.out.println("uid: ------------------" + uid); - Flags flags = msg.getFlags(); - if (!flags.contains(Flags.Flag.SEEN)) { - //设置为已读 - msg.setFlag(Flags.Flag.SEEN, true); + log.debug("是否有附件: "+isContainerAttachment); + if(isContainerAttachment){ + List> mapList = Lists.newArrayList(); + EmailParseUtils.saveAttachment(msg, mapList); + log.debug("获取附件的数量:"+mapList.size()); + + String username = "一十七画生"; + maintainVo.setUserId(username); + + for (Map map : mapList) { + map.put("emailName",emailName); + String pdfStream = map.get("pdfStream"); + if(StringUtils.isNotBlank(pdfStream)){ + log.debug("开始调用山能OCR识别---------"); + //判断是否为图片流文件, 兼容公司平台进行base64解密 + String requestUrl = "http://192.168.33.102:30006/cci_ai/service/v1/receipt_crop_and_recog?crop_complete_image=1"; + log.info("调用山能OCR识别请求路径:"+requestUrl); + String result = FileUtil.uploadFile(requestUrl, Base64Decoder.decode(pdfStream)); + List openServices = Lists.newArrayList(); + if(StringUtils.isBlank(result)){ + log.info("调用山能ocr识别失败"); + }else { + OcrResponseVo ocrResponseVo = JSONObject.parseObject(result, OcrResponseVo.class); + if(ocrResponseVo != null && ocrResponseVo.getCode() == 200){ + List ocrDataListEntities = ocrResponseVo.getResult().getObjectList(); + for (OcrDataListEntity ocrDataListEntity : ocrDataListEntities) { + List> productList = ocrDataListEntity.getProductList(); + + List itemList = ocrDataListEntity.getItemList(); + + String type = ocrDataListEntity.getType(); + if("other".equals(type)){ + break; + } + Map itemData = itemList.stream().collect(Collectors.toMap(OcrItemListEntity::getKey, OcrItemListEntity::getValue)); + OpenServiceOcr openServiceOcr = new OpenServiceOcr(); + openServiceOcr.setIMAGE(ocrDataListEntity.getImage()); + openServiceOcr.setFPLXDM(OcrDataTypeEnum.getVal(type)); + OpenServiceOcr.InvoiceOcrData invoiceOcrData = new OpenServiceOcr.InvoiceOcrData(); + invoiceOcrData.setSFCY("0"); //是否查验 + //判断发票类型 + if("vat_special_invoice".equals(type) || "vat_electronic_invoice".equals(type) || "vat_common_invoice".equals(type) || "vat_electronic_toll_invoice".equals(type)){ + invoiceOcrData.setJYM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_CORRECT_CODE.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_DAIMA.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_HAOMA.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ISSUE_DATE.getKey())); + invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_RATE_PAYER_ID.getKey())); + invoiceOcrData.setJDHM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_JIDA_HAOMA.getKey())); + invoiceOcrData.setXHFMC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_NAME.getKey())); + invoiceOcrData.setXHFSBH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_ID.getKey())); + invoiceOcrData.setXHFDZDH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_ADDR_TELL.getKey())); + invoiceOcrData.setXHFYHZH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_BANK_ACCOUNT.getKey())); + invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYER_NAME.getKey())); + invoiceOcrData.setGMFDZDH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYER_ADDR_TELL.getKey())); + invoiceOcrData.setGMFYHZH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYER_BANK_ACCOUNT.getKey())); + invoiceOcrData.setHJJE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PRICE.getKey())); + invoiceOcrData.setSFDK(itemData.get(OcrDataTypeEnum.VAT_INVOICE_DAI_KAI_FLAG.getKey())); + invoiceOcrData.setHJSE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TAX_TOTAL.getKey())); + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TOTAL_COVER_TAX_DIGITS.getKey())); + invoiceOcrData.setFPLC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAGE_NUMBER.getKey())); + openServiceOcr.setFPLXDM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey())); + invoiceOcrData.setBZ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TOTAL_NOTE.getKey())); + invoiceOcrData.setFWM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_CIPHER_FIELD.getKey())); + invoiceOcrData.setSKR(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYEE.getKey())); + invoiceOcrData.setFHR(itemData.get(OcrDataTypeEnum.VAT_INVOICE_REVIEW.getKey())); + invoiceOcrData.setKPR(itemData.get(OcrDataTypeEnum.VAT_INVOICE_DRAWER.getKey())); + invoiceOcrData.setSFYGSYZ("False".equals(itemData.get(OcrDataTypeEnum.EXIST_STAMPLE.getKey()))?"0":"1"); + + List invoiceOcrDetailList = Lists.newArrayList(); + for (List productListEntities: productList) { + Map productMap = productListEntities.stream().collect(Collectors.toMap(OcrProductListEntity::getKey, OcrProductListEntity::getValue)); + OpenServiceOcr.InvoiceOcrDetail invoiceOcrDetail = new OpenServiceOcr.InvoiceOcrDetail(); + invoiceOcrDetail.setHWMC(productMap.get(OcrDataTypeEnum.VAT_INVOICE_GOODS.getKey())); + invoiceOcrDetail.setGGXH(productMap.get(OcrDataTypeEnum.VAT_INVOICE_PLATE_SPECIFIC.getKey())); + invoiceOcrDetail.setDW(productMap.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT.getKey())); + invoiceOcrDetail.setSPSL(productMap.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_QUANTITY.getKey())); + invoiceOcrDetail.setDJ(productMap.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT_PRICE.getKey())); + invoiceOcrDetail.setJE(productMap.get(OcrDataTypeEnum.VAT_INVOICE_PRICE.getKey())); + invoiceOcrDetail.setSL(productMap.get(OcrDataTypeEnum.VAT_INVOICE_TAX_RATE.getKey())); + invoiceOcrDetail.setSE(productMap.get(OcrDataTypeEnum.VAT_INVOICE_TAX.getKey())); + invoiceOcrDetailList.add(invoiceOcrDetail); + } + invoiceOcrData.setFPMX(invoiceOcrDetailList); + } else if ("vat_roll_invoice".equals(type)) { + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE_OF_INVOICE.getKey())); + invoiceOcrData.setFPBT(itemData.get(OcrDataTypeEnum.INVOICE_HEAD.getKey())); + invoiceOcrData.setJYM(itemData.get(OcrDataTypeEnum.CHECK_NUMBER.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey())); + invoiceOcrData.setJQBM(itemData.get(OcrDataTypeEnum.MACHINE_CODE.getKey())); + invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.BUY_TAX_NUMBER.getKey())); + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.TOTAL_MONEY.getKey())); + invoiceOcrData.setXHFMC(itemData.get(OcrDataTypeEnum.SOLD_NAME.getKey())); + invoiceOcrData.setXHFSBH(itemData.get(OcrDataTypeEnum.SOLD_TAX_NUMBER.getKey())); + invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.BUY_NAME.getKey())); + invoiceOcrData.setSKR(itemData.get(OcrDataTypeEnum.CASHIER_NAME.getKey())); + invoiceOcrData.setSFYGSYZ("False".equals(itemData.get(OcrDataTypeEnum.EXIST_STAMPLE.getKey()))?"0":"1"); + + List invoiceOcrDetailList = Lists.newArrayList(); + for (List productListEntities : productList) { + Map productMap = productListEntities.stream().collect(Collectors.toMap(OcrProductListEntity::getKey, OcrProductListEntity::getValue)); + OpenServiceOcr.InvoiceOcrDetail invoiceOcrDetail = new OpenServiceOcr.InvoiceOcrDetail(); + invoiceOcrDetail.setHWMC(productMap.get(OcrDataTypeEnum.VAT_INVOICE_GOODS.getKey())); + invoiceOcrDetail.setGGXH(productMap.get(OcrDataTypeEnum.VAT_INVOICE_PLATE_SPECIFIC.getKey())); + invoiceOcrDetail.setDW(productMap.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT.getKey())); + invoiceOcrDetail.setSPSL(productMap.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_QUANTITY.getKey())); + invoiceOcrDetail.setDJ(productMap.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT_PRICE.getKey())); + invoiceOcrDetail.setJE(productMap.get(OcrDataTypeEnum.VAT_INVOICE_PRICE.getKey())); + invoiceOcrDetail.setSL(productMap.get(OcrDataTypeEnum.VAT_INVOICE_TAX_RATE.getKey())); + invoiceOcrDetail.setSE(productMap.get(OcrDataTypeEnum.VAT_INVOICE_TAX.getKey())); + invoiceOcrDetailList.add(invoiceOcrDetail); + } + invoiceOcrData.setFPMX(invoiceOcrDetailList); + } else if ("motor_vehicle_sale_invoice".equals(type)) { + // -------------机动车销售统一发票特殊字段-------------- + invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER.getKey())); + invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER_ID.getKey())); + invoiceOcrData.setCPXH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_MODEL.getKey())); + invoiceOcrData.setHGZH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CERT_ID.getKey())); + invoiceOcrData.setFDJHM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_ENGINE_ID.getKey())); + invoiceOcrData.setCLSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_VIN.getKey())); + invoiceOcrData.setHJJE(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_PRICE_WITHOUT_TAX.getKey())); + invoiceOcrData.setZGSWJG(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TAX_AUTHORITH.getKey())); + invoiceOcrData.setZGSWJGDM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TAX_AUTHORITH_ID.getKey())); + + + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TOTAL_PRICE_DIGITS.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_ISSUE_DATE.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_DAIMA.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_HAOMA.getKey())); + } else if ("used_car_purchase_invoice".equals(type)) { + // -------------二手车销售统一发票特殊字段-------------- + invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER.getKey())); + invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER_ID.getKey())); + invoiceOcrData.setXHFMC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_SELLER.getKey())); + invoiceOcrData.setXHFSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_SELLER_ID.getKey())); + invoiceOcrData.setESCSC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_MARKET.getKey())); + invoiceOcrData.setCPZH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_PLATE_NUM.getKey())); + invoiceOcrData.setDJZH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_MODEL.getKey())); + invoiceOcrData.setCLSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_VIN.getKey())); + invoiceOcrData.setCPXH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_MODEL.getKey())); + invoiceOcrData.setESCNSRSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_MARKET_TAX_ID.getKey())); + invoiceOcrData.setESCNSRSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_MARKET_TAX_ID.getKey())); + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TOTAL_PRICE_DIGITS.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_ISSUE_DATE.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_DAIMA.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_HAOMA.getKey())); + } else if("vehicle_toll".equals(type)){ + // -------------过路费特殊字段-------------- + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE.getKey())); + invoiceOcrData.setSJ(itemData.get(OcrDataTypeEnum.TIME.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.TOLL_CODE.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.TOLL_NUMBER.getKey())); + + }else if ("quota_invoice".equals(type)) { + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY_SMALL.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.QUOTA_INVOICE_CODE.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.QUOTA_INVOICE_NUMBER.getKey())); + + } else if ("taxi_ticket".equals(type)) { + // -------------出租车发票特殊字段-------------- + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.SUM.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.INVOICE_CODE.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NO.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE.getKey())); + invoiceOcrData.setSCSJ(itemData.get(OcrDataTypeEnum.BOARDING_TIME.getKey())); + invoiceOcrData.setXCSJ(itemData.get(OcrDataTypeEnum.LANDING_TIME.getKey())); + invoiceOcrData.setLC(itemData.get(OcrDataTypeEnum.MILEAGE.getKey())); + invoiceOcrData.setSZD(itemData.get(OcrDataTypeEnum.LOCATION.getKey())); + invoiceOcrData.setCPZH(itemData.get(OcrDataTypeEnum.TAXI_NO.getKey())); + } else if("air_transport".equals(type)){ + invoiceOcrData.setXM(itemData.get(OcrDataTypeEnum.PASSENGER_NAME.getKey())); + invoiceOcrData.setSFZH(itemData.get(OcrDataTypeEnum.ID_NO.getKey())); + invoiceOcrData.setPZHM(itemData.get(OcrDataTypeEnum.E_TICKET_NO.getKey())); + invoiceOcrData.setTKRQ(itemData.get(OcrDataTypeEnum.ISSUED_DATE.getKey())); + invoiceOcrData.setTKDW(itemData.get(OcrDataTypeEnum.ISSUED_BY.getKey())); + invoiceOcrData.setPJ(itemData.get(OcrDataTypeEnum.FARE.getKey())); + invoiceOcrData.setMHFZJJ(itemData.get(OcrDataTypeEnum.CIVIL_AVIATION_FUND.getKey())); + invoiceOcrData.setRYFJF(itemData.get(OcrDataTypeEnum.FUEL_SURCHARGE.getKey())); + invoiceOcrData.setQTSF(itemData.get(OcrDataTypeEnum.OTHER_TAXES.getKey())); + invoiceOcrData.setZE(itemData.get(OcrDataTypeEnum.TOTAL.getKey())); + invoiceOcrData.setBXF(itemData.get(OcrDataTypeEnum.INSURANCE.getKey())); + } else if("train_ticket".equals(type)){ + // -------------火车票特殊字段-------------- +// invoiceOcrData.setPZHM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DEPARTURE_DATE.getKey())); + invoiceOcrData.setSJ(itemData.get(OcrDataTypeEnum.DEPARTURE_DATE.getKey())); +// invoiceOcrData.setXM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey())); + invoiceOcrData.setCFZD(itemData.get(OcrDataTypeEnum.DEPARTURE_STATION.getKey())); + invoiceOcrData.setDDZD(itemData.get(OcrDataTypeEnum.ARRIVAL_STATION.getKey())); + invoiceOcrData.setCC(itemData.get(OcrDataTypeEnum.TRAIN_NUMBER.getKey())); + invoiceOcrData.setZWDJ(itemData.get(OcrDataTypeEnum.CLASS.getKey())); + invoiceOcrData.setXLH(itemData.get(OcrDataTypeEnum.SEAT_NUMBER.getKey())); + invoiceOcrData.setSFZH(itemData.get(OcrDataTypeEnum.PASSENGER_ID.getKey())); + } else if ("general_machine_invoice".equals(type) || "highway_passenger_invoice".equals(type) || "shipping_invoice".equals(type) || "passenger_transport_invoice".equals(type)) { + //为 general_machine_invoice(通用机打发票)、 highway_passenger_invoice(公路客运发票)、shipping_invoice(船运客票)、passenger_transport_invoice(旅客运输普票) + + // -------------航空运输电子客票行程单特殊字段-------------- + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY.getKey())); + invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.INVOICE_CODE.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey())); + invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE.getKey())); + invoiceOcrData.setSJ(itemData.get(OcrDataTypeEnum.TIME.getKey())); + } else if ("parking_invoice".equals(type)) { + invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY.getKey())); + invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey())); + } + openServiceOcr.setData(invoiceOcrData); + openServiceOcr.setRegion(ocrDataListEntity.getPosition()); + openServices.add(openServiceOcr); + } + } + } + + if(openServices != null && !openServices.isEmpty()){ + Map ocrResult = Maps.newHashMap(); + List resultToyxVoList = Lists.newArrayList(); + String batchId = String.valueOf(System.currentTimeMillis()); + ocrResult.put("batchId",batchId); + + for (int j = 0; j < openServices.size(); j++) { + OpenServiceOcr openServiceOcr = openServices.get(j); + OpenServiceOcr.InvoiceOcrData invoiceOcrData = openServiceOcr.getData(); + OcrResultToyxVo resultToyxVo = new OcrResultToyxVo(); + resultToyxVo.setCompanyId(maintainVo.getCompanyCode()); + resultToyxVo.setSource("01"); + resultToyxVo.setInvoiceCode(invoiceOcrData.getFPDM()); + resultToyxVo.setInvoiceNumber(invoiceOcrData.getFPHM()); + resultToyxVo.setTotalAmount(invoiceOcrData.getJSHJ()); + resultToyxVo.setBuyerName(invoiceOcrData.getGMFMC()); + resultToyxVo.setSellerName(invoiceOcrData.getXHFMC()); + resultToyxVo.setFileName(map.get("fileName")); + resultToyxVo.setFileType(SnpjInvoiceTypeEnum.getVal(openServiceOcr.getFPLXDM())); + resultToyxVo.setFileByte(map.get("pdfStream")); + resultToyxVo.setEmail(map.get("emailName")); + resultToyxVo.setEmployeeId(maintainVo.getUserId()); + resultToyxVoList.add(resultToyxVo); + } + ocrResult.put("list",resultToyxVoList); + try { + String md5Encode = MD5.getMd5Encode(ocrResult.get("batchId") + "e4b0190b2fadc0adbe54471ffd79a729"); + Map hashMap = Maps.newHashMap(); + hashMap.put("Authorization",md5Encode); + log.info("调用影像票夹接口,调用地址:{},请求头:{},请求参数:{}","http://192.168.33.105:2333/ticket/receive",hashMap,JSONObject.toJSONString(ocrResult)); + String body = HttpRequest.post("http://192.168.33.105:2333/ticket/receive").addHeaders(hashMap).body(JSONObject.toJSONString(ocrResult)).timeout(300000).execute().body(); + log.info("调用影像票夹接口返回参数:{}",body); + Map resultMap = JSONObject.parseObject(body, Map.class); + Object status = resultMap.get("status"); + log.info("status{}",status); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + + }else { + log.debug("山能OCR识别失败------"); + } + } + } + + }else { //无附件的不处理 + log.debug("没有附件跳过"); + continue; + } + //进行数据插入 + if(StringUtils.isNotBlank(gatherLogVo.getFpdm()) && StringUtils.isNotBlank(gatherLogVo.getFphm())){ + + }else { + log.info("未采集到有效数据"); } - System.out.println(""); } - System.out.println(""); - Date endTime = new Date(); - //计算耗时时间 -// double elapsedTime = CalendarUtil.arithDateTime(endTime, currentTime); - // 释放资源 - folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用 - store.close(); - } catch (NoSuchProviderException e) { - throw new RuntimeException(e); + log.info("邮箱采集使用时间:{}",System.currentTimeMillis() - startTime); } catch (MessagingException e) { - throw new RuntimeException(e); - } catch (UnsupportedEncodingException e) { + log.error("邮箱采集邮件解析异常:{}", e.toString()); throw new RuntimeException(e); } catch (IOException e) { + log.error("邮箱采集IO异常:{}", e); throw new RuntimeException(e); + }finally { + if (uids.isEmpty() ||uids.indexOf(uid)>uids.indexOf(maintainVo.getEmailUid())){ + System.out.println("保存uid:"+uid); + } + // 释放资源 + // false为不更新邮件,true为更新,一般在删除邮件后使用 + try { + if (folder != null){ + folder.close(false); + } + if (store != null){ + store.close(); + } + } catch (MessagingException e) { + log.debug("关流失败"); + } + } + } +// public static void main(String[] args) { +// //邮件接收协议 +// String mail_protocol = "mail.store.protocol"; +// //邮件接收协议类型 +// String mail_protocol_type2 = "pop3"; +// String mail_protocol_type = "pop"; +// //邮件接收服务器端口 +// String mail_port = "mail.pop3.port"; +// //邮件接收服务器端口 +// String port = "110"; +// //邮件接收服务器地址 +// String mail_host = "mail.pop3.host"; +// String emailName = "1149953701@qq.com"; +// String password = "pmdzleyabmlzgdhc"; +// String mailSuffix = emailName.split("@")[1]; +// //邮箱类型 +// String mailType = mailSuffix.split("\\.")[0]; +// Properties props = new Properties(); +// if(mailType.equalsIgnoreCase("qq")){ +// //qq邮箱 +// props.setProperty(mail_protocol, mail_protocol_type2); // 协议 +// props.setProperty(mail_host, mail_protocol_type+"."+mailSuffix); // pop3服务器 +// props.setProperty(mail_port, port); // 端口 +// }else { +// props.setProperty(mail_protocol, mail_protocol_type2); // 协议 +// props.setProperty(mail_host, mail_protocol_type2+"."+mailSuffix); // pop3服务器 +// props.setProperty(mail_port, port); // 端口 +// } +// Session session = Session.getInstance(props); +// Store store = null; +// try { +// store = session.getStore("pop3"); +// store.connect(emailName, password); +// //连接邮箱服务器 +// //获取当前时间 +// Date currentTime = new Date(); +// // 获得收件箱 pop3协议只有一个有效的文件夹就是INBOX +// Folder folder = store.getFolder("INBOX"); +// //获取邮件列表 +// folder.open(Folder.READ_WRITE); +// // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数 +// System.out.println("未读邮件数: " + folder.getUnreadMessageCount()); +// // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0 +// System.out.println("删除邮件数: " + folder.getDeletedMessageCount()); +// System.out.println("新邮件: " + folder.getNewMessageCount()); +// // 获得收件箱中的邮件总数 +// System.out.println("邮件总数: " + folder.getMessageCount()); +// Message[] messages = folder.getMessages(); +// for (int i = 0, count = messages.length; i < count; i++) { +// MimeMessage msg = (MimeMessage) messages[i]; +// System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- "); +// System.out.println("主题: " + EmailParseUtils.getSubject(msg)); +// System.out.println("发件人: " + EmailParseUtils.getFrom(msg)); +// System.out.println("收件人:" + EmailParseUtils.getReceiveAddress(msg, null)); +// System.out.println("发送时间:" + EmailParseUtils.getSentDate(msg, null)); +// System.out.println("是否已读:" + EmailParseUtils.isSeen(msg)); +// System.out.println("邮件优先级:" + EmailParseUtils.getPriority(msg)); +// System.out.println("是否需要回执:" + EmailParseUtils.isReplySign(msg)); +// System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb"); +// boolean isContainerAttachment = EmailParseUtils.isContainAttachment(msg); +// POP3Folder inbox = (POP3Folder) folder; +// String uid = inbox.getUID(msg); +// System.out.println("uid: ------------------" + uid); +// Flags flags = msg.getFlags(); +// if (!flags.contains(Flags.Flag.SEEN)) { +// //设置为已读 +// msg.setFlag(Flags.Flag.SEEN, true); +// } +// System.out.println(""); +// } +// System.out.println(""); +// Date endTime = new Date(); +// //计算耗时时间 +//// double elapsedTime = CalendarUtil.arithDateTime(endTime, currentTime); +// // 释放资源 +// folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用 +// store.close(); +// } catch (NoSuchProviderException e) { +// throw new RuntimeException(e); +// } catch (MessagingException e) { +// throw new RuntimeException(e); +// } catch (UnsupportedEncodingException e) { +// throw new RuntimeException(e); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } }