feature 1.邮箱采集功能完善

release
zhenghaiyang@ele-cloud.com 2 years ago
parent e3a7cee548
commit 9fa8288226
  1. 2
      dxhy-core/src/main/java/com/dxhy/core/dao/mailGather/EmailMaintainDao.java
  2. 1
      dxhy-core/src/main/java/com/dxhy/core/model/mailGather/EmailMaintainVo.java
  3. 3
      dxhy-core/src/main/java/com/dxhy/core/service/mailGather/EmailMaintainService.java
  4. 4
      dxhy-core/src/main/java/com/dxhy/core/service/mailGather/impl/EmailMaintainServiceImpl.java
  5. 223
      dxhy-core/src/main/java/com/dxhy/core/task/SnEmailGatherTask.java
  6. 53
      dxhy-core/src/main/java/com/dxhy/core/util/EmailParseUtils.java
  7. 10
      dxhy-core/src/main/resources/mapper/mailGather/EmailMaintainMapper.xml
  8. 10
      dxhy-sign/src/main/java/com/dxhy/sign/dao/SignRecordInvoiceDao.java
  9. 20
      dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/SignFpqsService.java
  10. 236
      dxhy-sign/src/main/java/com/dxhy/sign/service/fpqs/impl/SignFpqsServiceImpl.java
  11. 18
      dxhy-sign/src/main/resources/mapper/SignRecordInvoiceMapper.xml

@ -19,7 +19,7 @@ public interface EmailMaintainDao extends BaseMapper<EmailMaintainVo> {
* @param id 主键
* @return 实例对象
*/
EmailMaintainVo queryById(String id);
List<EmailMaintainVo> queryAll();
/**
* 查询指定行数据

@ -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;

@ -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<EmailMaintainVo> queryAll();
/**
* 分页查询

@ -33,8 +33,8 @@ public class EmailMaintainServiceImpl implements EmailMaintainService {
* @return 实例对象
*/
@Override
public EmailMaintainVo queryById(String id) {
return this.emailMaintainDao.queryById(id);
public List<EmailMaintainVo> queryAll() {
return this.emailMaintainDao.queryAll();
}
/**

@ -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<EmailMaintainVo> 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() + "封邮件-------------------- ");
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<String, String> map = Maps.newHashMap();
EmailParseUtils.saveAttachment(msg, map);
gatherLogVo.setFileType(map.get("contentType"));
gatherLogVo.setFileName(map.get("fileName"));
String pdfStream = map.get("pdfStream");
List<OpenServiceOcr> 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;
}
@SneakyThrows
public static void main(String[] args) {
//邮件接收协议
String mail_protocol = "mail.store.protocol";
@ -61,9 +262,11 @@ public class SnEmailGatherTask {
props.setProperty(mail_port, port); // 端口
}
Session session = Session.getInstance(props);
Store store = session.getStore("pop3");
//连接邮箱服务器
Store store = null;
try {
store = session.getStore("pop3");
store.connect(emailName, password);
//连接邮箱服务器
//获取当前时间
Date currentTime = new Date();
// 获得收件箱 pop3协议只有一个有效的文件夹就是INBOX
@ -107,5 +310,15 @@ public class SnEmailGatherTask {
// 释放资源
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);
}
}
}

@ -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<String, String> 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))) {

@ -10,17 +10,18 @@
<result property="userId" column="user_id" jdbcType="VARCHAR"/>
<result property="emailAddress" column="email_address" jdbcType="VARCHAR"/>
<result property="emailPassword" column="email_password" jdbcType="VARCHAR"/>
<result property="emailUid" column="email_uid" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="delStatus" column="del_status" jdbcType="VARCHAR"/>
<result property="modifyTime" column="modify_time" jdbcType="TIMESTAMP"/>
</resultMap>
<!--查询单个-->
<select id="queryById" resultMap="EmailMaintainMap">
<select id="queryAll" resultMap="EmailMaintainMap">
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';
</select>
<!--查询指定行数据-->
@ -133,6 +134,9 @@
<if test="delStatus != null and delStatus != ''">
del_status = #{delStatus},
</if>
<if test="emailUid != null and emailUid != ''">
email_uid = #{emailUid},
</if>
</set>
where id = #{id}
</update>

@ -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<TDxRecordInvoice> {
* @since 1.0
*/
List<TDxRecordInvoice> selectWqsfp(Map<String, Object> pramsMap);
List<TDxRecordInvoice> selectWqsfpByQsyx(Map<String, Object> pramsMap);
/**
* 未签收发票合计信息查询接口

@ -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<TDxRecordInvoice> {
*/
String requestValidate(Map<String, String> pramsMap);
/**
* 获取发票的全票面信息
*
* @param pramsMap
* 请求参数
* @return 返回结果
*
*
*/
String getInvoiceInfo(Map<String, String> pramsMap);
/**
* 取消已签收的记录
*

@ -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<SignRecordInvoiceDao,
@Resource
private SignInvoiceService signInvoiceSmService;
@Resource
private SignSaveInvoiceInfoService signSaveInvoiceInfoService;
@Resource
private InvoiceQueryUtil invoiceQueryUtil;
@ -383,6 +377,166 @@ public class SignFpqsServiceImpl extends MpBaseServiceImpl<SignRecordInvoiceDao,
return super.responseResult(json);
}
/**
* 根据查验结果进行发票签收
*
* @param tDxInvoice
* 抵账
* @param invoiceCode
* 发票代码
* @param invoiceNo
* 发票号码
* @param pramsMap
* 入参
* @return 返回
*/
private TDxInvoice qsSinglefpByInvoiceQuery(TDxInvoice tDxInvoice, String invoiceCode, String invoiceNo,
Map<String, String> pramsMap, String userName, Boolean isExits, String qsType) {
Map<String, String> 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<InvoiceLog> 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<TDxInvoice> 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<TDxInvoice> delWrapper = new UpdateWrapper<>();
delWrapper.eq("scan_id", tDxInvoice.getScanId());
signInvoiceSmService.remove(delWrapper);
}
UpdateWrapper<TDxInvoice> 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<SignRecordInvoiceDao,
return signInvoiceSmService.requestValidate(pramsMap.get("uuid"), pramsMap.get("userId"), del);
}
@Override
public String getInvoiceInfo(Map<String, String> 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<TDxRecordInvoice> 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<String, String> pramsMap) {
@ -3185,7 +3361,7 @@ public class SignFpqsServiceImpl extends MpBaseServiceImpl<SignRecordInvoiceDao,
List<String> strings = Arrays.asList(ids);
pramsMap.put("ids",strings);
}
List<TDxRecordInvoice> pageList = super.baseMapper.selectWqsfp(pramsMap);
List<TDxRecordInvoice> pageList = super.baseMapper.selectWqsfpByQsyx(pramsMap);
PageInfo<TDxRecordInvoice> pageInfo = new PageInfo<>(pageList);
List<TDxRecordInvoice> resultList = pageInfo.getList();
List<QsExcelEntity> excelList = Lists.newArrayList();

@ -52,6 +52,24 @@
and t.invoice_date between #{kprqq} and #{kprqz}
order by t.invoice_date desc
</select>
<select id="selectWqsfpByQsyx" parameterType="java.util.Map"
resultMap="BaseResultMap" databaseId="mysql">
select
t.id,t.invoice_type,t.invoice_code,t.invoice_no,t.invoice_date,t.gf_name,t.xf_name,t.invoice_amount,t.tax_amount,t.dept_id,t.qs_status
from t_dx_record_invoice t
where t.company = #{company}
<if test="ids != null and ids.size()>0">
and t.id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
and t.qs_status = '0'
and t.source_system='0'
</select>
<select id="selectWqsfp" parameterType="java.util.Map"
resultMap="BaseResultMap" databaseId="oracle">
select

Loading…
Cancel
Save