diff --git a/dxhy-core/src/main/java/com/dxhy/core/dao/mailGather/EmailMaintainDao.java b/dxhy-core/src/main/java/com/dxhy/core/dao/mailGather/EmailMaintainDao.java index 1277d54f..c4a18cc4 100644 --- a/dxhy-core/src/main/java/com/dxhy/core/dao/mailGather/EmailMaintainDao.java +++ b/dxhy-core/src/main/java/com/dxhy/core/dao/mailGather/EmailMaintainDao.java @@ -19,7 +19,7 @@ public interface EmailMaintainDao extends BaseMapper { * @param id 主键 * @return 实例对象 */ - EmailMaintainVo queryById(String id); + List queryAll(); /** * 查询指定行数据 diff --git a/dxhy-core/src/main/java/com/dxhy/core/model/mailGather/EmailMaintainVo.java b/dxhy-core/src/main/java/com/dxhy/core/model/mailGather/EmailMaintainVo.java index 3ede8d8e..b3c973d8 100644 --- a/dxhy-core/src/main/java/com/dxhy/core/model/mailGather/EmailMaintainVo.java +++ b/dxhy-core/src/main/java/com/dxhy/core/model/mailGather/EmailMaintainVo.java @@ -23,6 +23,7 @@ public class EmailMaintainVo extends CommonDTO { public String emailAddress; public String emailPassword; public String delStatus; + public String emailUid; public Date createTime; public Date modifyTime; diff --git a/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/EmailMaintainService.java b/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/EmailMaintainService.java index 69d31c2d..1e763576 100644 --- a/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/EmailMaintainService.java +++ b/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/EmailMaintainService.java @@ -2,6 +2,7 @@ package com.dxhy.core.service.mailGather; import com.dxhy.core.model.mailGather.EmailMaintainVo; +import java.util.List; import java.util.Map; public interface EmailMaintainService { @@ -12,7 +13,7 @@ public interface EmailMaintainService { * @param id 主键 * @return 实例对象 */ - EmailMaintainVo queryById(String id); + List queryAll(); /** * 分页查询 diff --git a/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/impl/EmailMaintainServiceImpl.java b/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/impl/EmailMaintainServiceImpl.java index 9b0b5d15..cd59c1c2 100644 --- a/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/impl/EmailMaintainServiceImpl.java +++ b/dxhy-core/src/main/java/com/dxhy/core/service/mailGather/impl/EmailMaintainServiceImpl.java @@ -33,8 +33,8 @@ public class EmailMaintainServiceImpl implements EmailMaintainService { * @return 实例对象 */ @Override - public EmailMaintainVo queryById(String id) { - return this.emailMaintainDao.queryById(id); + public List queryAll() { + return this.emailMaintainDao.queryAll(); } /** 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 1e6d648e..3d6912f1 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 @@ -1,17 +1,33 @@ package com.dxhy.core.task; +import cn.hutool.core.codec.Base64Decoder; +import cn.hutool.core.util.IdUtil; +import com.dxhy.common.constant.DbConstant; +import com.dxhy.common.datasource.config.DynamicContextHolder; +import com.dxhy.core.job.entity.ScheduleJobEntity; import com.dxhy.core.job.service.ScheduleJobService; +import com.dxhy.core.model.mailGather.EmailMaintainVo; +import com.dxhy.core.model.mailGather.MailGatherLogVo; +import com.dxhy.core.model.openservice.OpenServiceOcr; +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.util.EmailParseUtils; +import com.google.common.collect.Maps; import com.sun.mail.pop3.POP3Folder; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.mail.*; import javax.mail.internet.MimeMessage; +import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.util.Date; +import java.util.List; +import java.util.Map; import java.util.Properties; @@ -21,17 +37,202 @@ public class SnEmailGatherTask { @Resource private ScheduleJobService scheduleJobService; - + @Resource + private EmailMaintainService emailMaintainService; + @Resource + private MailGatherLogService mailGatherLogService; + @Resource + private IOpenServicePlatformService openServicePlatformService; public void mailGatherTask(){ - //进行邮件采集 + DynamicContextHolder.push(DbConstant.BASICS_READ); + ScheduleJobEntity scheduleJobEntity = scheduleJobService.queryByBeanName("snEmailGatherTask", "getInvoices"); + if (scheduleJobEntity != null && "0".equals(scheduleJobEntity.getJobStatus())) { + try { + scheduleJobEntity.setJobStatus("1"); + DynamicContextHolder.push(DbConstant.BASICS_WRITE); + scheduleJobService.updateById(scheduleJobEntity); + //进行邮件采集 + List maintainVos = emailMaintainService.queryAll(); + for (EmailMaintainVo maintainVo : maintainVos) { + //挨个邮箱进行数据采集 + parseEmail(maintainVo); + } + log.info("发票获取接口执行结束--"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + log.info("发票获取接口--重置执行状态"); + scheduleJobEntity.setJobStatus("0"); + DynamicContextHolder.push(DbConstant.BASICS_WRITE); + scheduleJobService.updateById(scheduleJobEntity); + } + } } + public void parseEmail(EmailMaintainVo maintainVo){ + long startTime = System.currentTimeMillis(); + String password = Base64Decoder.decodeStr(maintainVo.getEmailPassword()); + String emailName = maintainVo.getEmailAddress(); + + try { + Store store = mailAuth(emailName, password); + if(store == null){ + MailGatherLogVo gatherLogVo = new MailGatherLogVo(); + gatherLogVo.setId(IdUtil.nanoId()); + gatherLogVo.setErrorMsg("邮箱认证失败"); + gatherLogVo.setOcrType("1"); + gatherLogVo.setCreateTime(new Date()); + gatherLogVo.setFromAddress(emailName); + mailGatherLogService.insert(gatherLogVo); + } + Folder folder = store.getFolder("INBOX"); + //获取邮件列表 + folder.open(Folder.READ_WRITE); + // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数 + log.debug("未读邮件数: " + folder.getUnreadMessageCount()); + // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0 + log.debug("删除邮件数: " + folder.getDeletedMessageCount()); + log.debug("新邮件: " + folder.getNewMessageCount()); + // 获得收件箱中的邮件总数 + log.debug("邮件总数: " + folder.getMessageCount()); + EmailMaintainVo emailMaintainVo = new EmailMaintainVo(); + emailMaintainVo.setId(maintainVo.getId()); + Message[] messages = folder.getMessages(); + for (int i = 0, count = messages.length; i < count; i++) { + MimeMessage msg = (MimeMessage) messages[i]; + log.debug("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- "); - @SneakyThrows + MailGatherLogVo gatherLogVo = new MailGatherLogVo(); + gatherLogVo.setId(IdUtil.nanoId()); + gatherLogVo.setSubject(EmailParseUtils.getSubject(msg)); + gatherLogVo.setFromAddress(emailName); + gatherLogVo.setReceiveAddress(EmailParseUtils.getReceiveAddress(msg, null)); + gatherLogVo.setSentDate( EmailParseUtils.getSentDate(msg, null)); + gatherLogVo.setCreateTime(new Date()); + + log.debug("主题: " + EmailParseUtils.getSubject(msg)); + log.debug("发件人: " + EmailParseUtils.getFrom(msg)); + log.debug("收件人:" + EmailParseUtils.getReceiveAddress(msg, null)); + log.debug("发送时间:" + EmailParseUtils.getSentDate(msg, null)); + log.debug("是否已读:" + EmailParseUtils.isSeen(msg)); + log.debug("邮件优先级:" + EmailParseUtils.getPriority(msg)); + 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 == 0){ + emailMaintainVo.setEmailUid(uid); + } + //增量处理 等于之后就跳过本地循环 + if(StringUtils.isNotBlank(maintainVo.getEmailUid()) && maintainVo.getEmailUid().equals(uid)){ + return; + } + gatherLogVo.setMsgUid(uid); + boolean isContainerAttachment = EmailParseUtils.isContainAttachment(msg); + if(isContainerAttachment){ + Map map = Maps.newHashMap(); + EmailParseUtils.saveAttachment(msg, map); + + gatherLogVo.setFileType(map.get("contentType")); + gatherLogVo.setFileName(map.get("fileName")); + String pdfStream = map.get("pdfStream"); + List openServiceOcrs = openServicePlatformService.ocrInvoice(pdfStream); + if(openServiceOcrs != null && !openServiceOcrs.isEmpty()){ + openServiceOcrs.get(0).getData().getFPDM(); + gatherLogVo.setFpdm( openServiceOcrs.get(0).getData().getFPDM()); + gatherLogVo.setFphm( openServiceOcrs.get(0).getData().getFPHM()); + } + + + }else { //无附件的不处理 + continue; + } + +// Flags flags = msg.getFlags(); +// if (!flags.contains(Flags.Flag.SEEN)) { +// //设置为已读 +// msg.setFlag(Flags.Flag.SEEN, true); +// } + //进行数据插入 + if(StringUtils.isNotBlank(gatherLogVo.getFpdm()) && StringUtils.isNotBlank(gatherLogVo.getFphm())){ + gatherLogVo.setOcrType("0"); + gatherLogVo.setErrorMsg("采集成功"); + mailGatherLogService.insert(gatherLogVo); + }else { + log.info("未采集到有效数据"); + } + } + + + // 释放资源 + folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用 + store.close(); + log.info("邮箱采集使用时间:{}",System.currentTimeMillis() - startTime); + } catch (MessagingException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + + public Store mailAuth(String emailName, String password){ + //判断是否为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_type2); // 协议 + props.setProperty(mail_host, mail_protocol_type2+"."+mailSuffix); // pop3服务器 + props.setProperty(mail_port, port); // 端口 + } + Session session = Session.getInstance(props); + //连接邮箱服务器 + + // 创建Session实例对象 +// Session session = Session.getInstance(props,new Authenticator() { +// protected PasswordAuthentication getPasswordAuthentication() { +// return new PasswordAuthentication(emailName, password); +// } +// }); + //Session session = Session.getInstance(props); + Store store = null; + try { + store = session.getStore("pop3"); + store.connect(emailName, password); + } catch (Exception e) { + try { + store.close(); + } catch (MessagingException ex) { + throw new RuntimeException(ex); + } + store = null; + } + return store; + } + public static void main(String[] args) { //邮件接收协议 String mail_protocol = "mail.store.protocol"; @@ -61,51 +262,63 @@ public class SnEmailGatherTask { props.setProperty(mail_port, port); // 端口 } Session session = Session.getInstance(props); - Store 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); + 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(""); - } - System.out.println(""); - Date endTime = new Date(); - //计算耗时时间 + Date endTime = new Date(); + //计算耗时时间 // double elapsedTime = CalendarUtil.arithDateTime(endTime, currentTime); - // 释放资源 - folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用 - store.close(); + // 释放资源 + 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); + } + } } diff --git a/dxhy-core/src/main/java/com/dxhy/core/util/EmailParseUtils.java b/dxhy-core/src/main/java/com/dxhy/core/util/EmailParseUtils.java index 2028594c..7a907359 100644 --- a/dxhy-core/src/main/java/com/dxhy/core/util/EmailParseUtils.java +++ b/dxhy-core/src/main/java/com/dxhy/core/util/EmailParseUtils.java @@ -1,5 +1,9 @@ package com.dxhy.core.util; +import com.dxhy.common.utils.Base64Encoding; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; @@ -8,6 +12,7 @@ import javax.mail.internet.MimeUtility; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Map; public class EmailParseUtils { @@ -235,6 +240,52 @@ public class EmailParseUtils { } } + /** + * 保存附件 + * + * @param part 邮件中多个组合体中的其中一个组合体 + * @throws UnsupportedEncodingException + * @throws MessagingException + * @throws FileNotFoundException + * @throws IOException + */ + public static void saveAttachment(Part part, Map mapLog) throws UnsupportedEncodingException, MessagingException, IOException { + if (part.isMimeType("multipart/*")) { + Multipart multipart = (Multipart) part.getContent(); //复杂体邮件 + //复杂体邮件包含多个邮件体 + int partCount = multipart.getCount(); + for (int i = 0; i < partCount; i++) { + //获得复杂体邮件中其中一个邮件体 + BodyPart bodyPart = multipart.getBodyPart(i); + String fileName = decodeText(bodyPart.getFileName()); + mapLog.put("fileName",fileName); + String contentType = bodyPart.getContentType(); + //某一个邮件体也有可能是由多个邮件体组成的复杂体 + String disp = bodyPart.getDisposition(); + if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { + if ((StringUtils.isNotBlank(contentType)) && (contentType.toUpperCase().contains("PDF") || contentType.toUpperCase().contains("OFD"))){ + InputStream is = bodyPart.getInputStream(); + byte[] pdfStream = IOUtils.toByteArray(is); + mapLog.put("pdfStream", Base64Encoding.encodeToString(pdfStream)); + mapLog.put("contentType", contentType.toUpperCase().contains("PDF")?"PDF":"OFD"); + break; + }else { + continue; + } + } else if (bodyPart.isMimeType("multipart/*")) { + saveAttachment(bodyPart, mapLog); + } else { +// if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) { +// saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName())); +// } + } + } + } else if (part.isMimeType("message/rfc822")) { + saveAttachment((Part) part.getContent(), mapLog); + } + } + + /** * 保存附件 * @@ -254,6 +305,8 @@ public class EmailParseUtils { for (int i = 0; i < partCount; i++) { //获得复杂体邮件中其中一个邮件体 BodyPart bodyPart = multipart.getBodyPart(i); + String fileName = bodyPart.getFileName(); + //某一个邮件体也有可能是由多个邮件体组成的复杂体 String disp = bodyPart.getDisposition(); if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { diff --git a/dxhy-core/src/main/resources/mapper/mailGather/EmailMaintainMapper.xml b/dxhy-core/src/main/resources/mapper/mailGather/EmailMaintainMapper.xml index 9a5cf9d7..08a2d3f2 100644 --- a/dxhy-core/src/main/resources/mapper/mailGather/EmailMaintainMapper.xml +++ b/dxhy-core/src/main/resources/mapper/mailGather/EmailMaintainMapper.xml @@ -10,17 +10,18 @@ + - select - id, dept_id, dept_name, username, user_id, email_address, email_password, create_time, del_status, modify_time + id, dept_id, dept_name, username, user_id, email_address, email_password, email_uid, create_time, del_status, modify_time from email_maintain - where id = #{id} + where del_status = '0'; @@ -133,6 +134,9 @@ del_status = #{delStatus}, + + email_uid = #{emailUid}, + where id = #{id} diff --git a/dxhy-sign/src/main/java/com/dxhy/sign/dao/SignRecordInvoiceDao.java b/dxhy-sign/src/main/java/com/dxhy/sign/dao/SignRecordInvoiceDao.java index 47de695e..313a9cce 100644 --- a/dxhy-sign/src/main/java/com/dxhy/sign/dao/SignRecordInvoiceDao.java +++ b/dxhy-sign/src/main/java/com/dxhy/sign/dao/SignRecordInvoiceDao.java @@ -1,16 +1,15 @@ package com.dxhy.sign.dao; -import java.util.List; -import java.util.Map; - +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dxhy.sign.entity.SignRulesEntity; import com.dxhy.sign.entity.TDxInvoice; +import com.dxhy.sign.entity.TDxRecordInvoice; import com.dxhy.sign.model.SgqsWqsfpVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dxhy.sign.entity.TDxRecordInvoice; +import java.util.List; +import java.util.Map; /** * @@ -31,6 +30,7 @@ public interface SignRecordInvoiceDao extends BaseMapper { * @since 1.0 */ List selectWqsfp(Map pramsMap); + List selectWqsfpByQsyx(Map pramsMap); /** * 未签收发票合计信息查询接口 diff --git a/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/SignFpqsService.java b/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/SignFpqsService.java index fc90a810..6791b390 100644 --- a/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/SignFpqsService.java +++ b/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/SignFpqsService.java @@ -1,9 +1,5 @@ package com.dxhy.sign.service.fpqs; -import java.text.ParseException; -import java.util.List; -import java.util.Map; - import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.dxhy.common.service.MpBaseService; @@ -12,6 +8,10 @@ import com.dxhy.sign.entity.QsExcelEntity; import com.dxhy.sign.entity.TDxRecordInvoice; import com.dxhy.sign.entity.TDxRecordInvoiceStatistics; +import java.text.ParseException; +import java.util.List; +import java.util.Map; + /** * * 发票签收业务处理接口 @@ -151,6 +151,18 @@ public interface SignFpqsService extends MpBaseService { */ String requestValidate(Map pramsMap); + + /** + * 获取发票的全票面信息 + * + * @param pramsMap + * 请求参数 + * @return 返回结果 + * + * + */ + String getInvoiceInfo(Map pramsMap); + /** * 取消已签收的记录 * diff --git a/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/impl/SignFpqsServiceImpl.java b/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/impl/SignFpqsServiceImpl.java index e2b22c49..7c0939ff 100644 --- a/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/impl/SignFpqsServiceImpl.java +++ b/dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/impl/SignFpqsServiceImpl.java @@ -1,39 +1,16 @@ package com.dxhy.sign.service.fpqs.impl; -import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - -import javax.annotation.Resource; -import javax.servlet.ServletOutputStream; - -import cn.hutool.core.codec.Base64Decoder; -import cn.hutool.core.util.ArrayUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; -import com.dxhy.base.sms.utils.MessageSenderUtil; -import com.dxhy.base.sms.vo.AttachmentVo; -import com.dxhy.base.sms.vo.MailContentVo; -import com.dxhy.base.sms.vo.SendMailVo; -import com.dxhy.sign.config.BaseServiceConfig; -import com.google.common.collect.Lists; -import org.apache.commons.lang3.StringUtils; -import org.joda.time.DateTime; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.dxhy.base.sms.utils.MessageSenderUtil; +import com.dxhy.base.sms.vo.AttachmentVo; +import com.dxhy.base.sms.vo.MailContentVo; +import com.dxhy.base.sms.vo.SendMailVo; import com.dxhy.common.constant.DbConstant; import com.dxhy.common.constant.DictConstant; import com.dxhy.common.datasource.config.DynamicContextHolder; @@ -53,6 +30,7 @@ import com.dxhy.common.vo.Business; import com.dxhy.common.vo.InvoiceLog; import com.dxhy.common.vo.Tax; import com.dxhy.common.vo.UserInfo; +import com.dxhy.sign.config.BaseServiceConfig; import com.dxhy.sign.dao.SignInvoiceDao; import com.dxhy.sign.dao.SignInvoiceDelDao; import com.dxhy.sign.dao.SignRecordInvoiceDao; @@ -68,9 +46,22 @@ import com.dxhy.sign.util.InvoiceQueryUtil; import com.dxhy.sign.util.PushIntefaceUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; - +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; -import sun.security.krb5.internal.PAData; +import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTime; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; /** * 发票签收业务逻辑处理实现类 @@ -87,6 +78,9 @@ public class SignFpqsServiceImpl extends MpBaseServiceImpl pramsMap, String userName, Boolean isExits, String qsType) { + Map tax = getTax(); + String invoiceDate = pramsMap.get("invoiceDate"); + if (invoiceDate.length() == 8) { + invoiceDate = + invoiceDate.substring(0, 4) + "-" + invoiceDate.substring(4, 6) + "-" + invoiceDate.substring(6); + } + String invoiceAmount = pramsMap.getOrDefault("invoiceAmount", ""); + String checkCode = pramsMap.getOrDefault("checkCode", ""); + + tDxInvoice.setQsDate(DateUtils.getSqlDateLong()); + tDxInvoice.setQsType(qsType); + tDxInvoice.setCreateDate(DateUtils.getSqlDateLong()); + if (StringUtils.isNotBlank(invoiceAmount)) { + tDxInvoice.setInvoiceAmount(new BigDecimal(invoiceAmount)); + } + tDxInvoice.setCheckCode(checkCode); + tDxInvoice.setInvoiceDate(DateUtils.strToDate(invoiceDate)); + tDxInvoice.setQsDate(DateUtils.getSqlDateLong()); + tDxInvoice.setUuid(invoiceCode + invoiceNo); + String gfsh = ""; + + if (pramsMap.containsKey("gfshAll") && StringUtils.isNotBlank(pramsMap.get("gfshAll"))) { + String gfshAll = pramsMap.get("gfshAll"); + String[] split = gfshAll.split(","); + gfsh = split[1]; + } + + // 调用查验接口查询发票信息 + JSONObject queryInvoiceResult = + invoiceQueryUtil.queryInvoice(invoiceCode, invoiceNo, invoiceDate, invoiceAmount, checkCode, gfsh,""); + queryInvoiceResult.put("company", tDxInvoice.getCompany()); + if (queryInvoiceResult.containsKey("returnCode")) { + // 调用查验接口失败,进入查验失败处理流程 + tDxInvoice.setNotes(queryInvoiceResult.getString("returnMessage")); + tDxInvoice.setQsStatus(FpqsjgEnum.WQS.getQsjgDm()); + } else { + String resultCode = queryInvoiceResult.getString("resultCode"); + tDxInvoice.setNotes(queryInvoiceResult.getString("resultTip")); + // 查验成功且信息一致,直接保存到底账表并签收 + if ("0001".equals(resultCode)) { + // 查验返回的购方税号 + String checkGfsh = queryInvoiceResult.getString("buyerTaxNo"); + checkGfsh = checkGfsh == null ? "" : checkGfsh; + // 查验返回的购方名称 + String checkGfmc = queryInvoiceResult.getString("buyerName"); + checkGfmc = checkGfmc == null ? "" : checkGfmc; + + String taxName = tax.get(checkGfsh); + // 查验返回的作废标志 + String zfbz = queryInvoiceResult.getString("isCancelled"); + // 查验返回的税额 + String taxAmount = queryInvoiceResult.getString("taxAmount"); + if (StringUtils.isNotBlank(taxAmount)) { + tDxInvoice.setTaxAmount(new BigDecimal(taxAmount)); + } + + if (pramsMap.containsKey("gfshAll") && StringUtils.isNotBlank(pramsMap.get("gfshAll")) + && !pramsMap.get("gfshAll").contains(checkGfsh)) { + // 查验成功但是信息不一致,直接在扫描表添加一条记录 + tDxInvoice.setQsStatus(FpqsjgEnum.WQS.getQsjgDm()); + tDxInvoice.setNotes("登录人的公司税号与发票购方税号不一致,查验返回的购方税号为:" + checkGfsh); + } else if (StringUtils.isNotBlank(taxName) + && !CompareNameUtils.changeBrackets(taxName) + .equals(CompareNameUtils.changeBrackets(checkGfmc.trim())) + && !CompareNameUtils.changeBrackets(oldOrgName) + .contains(CompareNameUtils.changeBrackets(checkGfmc.trim()))) { + // 查验成功但是信息不一致,直接在扫描表添加一条记录 + tDxInvoice.setQsStatus(FpqsjgEnum.WQS.getQsjgDm()); + tDxInvoice.setNotes("登录人的公司名称与发票购方名称不一致,查验返回的购方名称为:" + checkGfmc); + } else if (!("N".equals(zfbz) || "0".equals(zfbz))) { + // 作废发票无法签收,发票查验接口只返回了作废状态,未返回其它异常状态 + tDxInvoice.setQsStatus(FpqsjgEnum.WQS.getQsjgDm()); + tDxInvoice.setNotes("发票状态异常,签收失败!"); + } else { + if (tDxInvoice.getDeptId() != null) { + // 部门存入底账 + queryInvoiceResult.put("deptId", tDxInvoice.getDeptId()); + queryInvoiceResult.put("deptName", tDxInvoice.getDeptName()); + + } + queryInvoiceResult.put("scanId", tDxInvoice.getScanId()); + signSaveInvoiceInfoService.saveQueryInvoiceResult(queryInvoiceResult, userName, qsType, + pramsMap.get("dbName")); + tDxInvoice.setQsStatus(FpqsjgEnum.YQS.getQsjgDm()); + + // 增加发票签收日志 + InvoiceLog log = new InvoiceLog(); + log.setInputName(userName); + log.setInputStatus("1"); + log.setInvoiceCode(tDxInvoice.getInvoiceCode()); + log.setInvoiceNo(tDxInvoice.getInvoiceNo()); + log.setQsType(qsType); + log.setType("3"); + log.setCreateDate(new Date()); + List logs = new ArrayList<>(); + logs.add(log); + invoiceLogService.toInvoiceLog(logs); + } + tDxInvoice.setGfName(checkGfmc); + tDxInvoice.setGfTaxNo(checkGfsh); + tDxInvoice.setXfName(queryInvoiceResult.getString("salerName")); + tDxInvoice.setXfTaxNo(queryInvoiceResult.getString("salerTaxNo")); + tDxInvoice.setTotalAmount(queryInvoiceResult.getBigDecimal("totalAmount")); + tDxInvoice.setInvoiceAmount(queryInvoiceResult.getBigDecimal("invoiceAmount")); + tDxInvoice.setInvoiceRemark(queryInvoiceResult.getString("remark")); + } else { + // 查验成功但是信息不一致,直接在扫描表添加一条记录 + tDxInvoice.setQsStatus(FpqsjgEnum.WQS.getQsjgDm()); + } + } + + DynamicContextHolder.push(pramsMap.get("dbName") + DbConstant.BUSINESS_WRITE); + if (!isExits) { + if (tDxInvoice.getUpdateByScanId()) { + // 已存在扫描记录 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("scan_id", tDxInvoice.getScanId()); + tDxInvoice.setUpdateDate(new Date()); + tDxInvoice.setCreateDate(null); + signInvoiceSmService.update(tDxInvoice, updateWrapper); + } else { + tDxInvoice.setInvoiceSerialNo(Long.valueOf(scanIdUtils.createSerialNum())); + + // 不存在扫描记录 + signInvoiceSmService.save(tDxInvoice); + } + } else { + // 已存在扫描记录 + // 已存在扫描记录,且存在的记录非当前扫描修改记录,先删再更新 + if (!tDxInvoice.getUpdateByScanId()) { + + UpdateWrapper delWrapper = new UpdateWrapper<>(); + delWrapper.eq("scan_id", tDxInvoice.getScanId()); + signInvoiceSmService.remove(delWrapper); + } + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("uuid", tDxInvoice.getUuid()); + tDxInvoice.setUpdateDate(new Date()); + tDxInvoice.setCreateDate(null); + signInvoiceSmService.update(tDxInvoice, updateWrapper); + } + return tDxInvoice; + } + /** * 签收单张发票 * @@ -1789,6 +1943,28 @@ public class SignFpqsServiceImpl extends MpBaseServiceImpl pramsMap) { + + JSONObject checkInfo; + String invoiceCode = pramsMap.get("invoiceCode"); + String invoiceNo = pramsMap.get("invoiceNo"); + String uuid = invoiceCode + invoiceNo; + + DynamicContextHolder.push(pramsMap.get("dbName") + DbConstant.BUSINESS_READ); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uuid", uuid); + TDxRecordInvoice invoiceRecord = super.getOne(queryWrapper); + + if (invoiceRecord != null) { + checkInfo = signSaveInvoiceInfoService.createInvoiceInfo(invoiceRecord, pramsMap.get("dbName")); + return super.responseResult(checkInfo); + } else { + return null; + } + + } + @Override public String yqsxxCancle(Map pramsMap) { @@ -3185,7 +3361,7 @@ public class SignFpqsServiceImpl extends MpBaseServiceImpl strings = Arrays.asList(ids); pramsMap.put("ids",strings); } - List pageList = super.baseMapper.selectWqsfp(pramsMap); + List pageList = super.baseMapper.selectWqsfpByQsyx(pramsMap); PageInfo pageInfo = new PageInfo<>(pageList); List resultList = pageInfo.getList(); List excelList = Lists.newArrayList(); diff --git a/dxhy-sign/src/main/resources/mapper/SignRecordInvoiceMapper.xml b/dxhy-sign/src/main/resources/mapper/SignRecordInvoiceMapper.xml index 25e6eccf..d000e5ea 100644 --- a/dxhy-sign/src/main/resources/mapper/SignRecordInvoiceMapper.xml +++ b/dxhy-sign/src/main/resources/mapper/SignRecordInvoiceMapper.xml @@ -52,6 +52,24 @@ and t.invoice_date between #{kprqq} and #{kprqz} order by t.invoice_date desc + + + +