发票批量下载

beta-enc
kane 2 years ago
parent 27e927dae8
commit 27f5e8eddf
  1. 37
      jianshui-admin/src/main/java/com/jianshui/web/controller/platform/InvoiceDownloadController.java
  2. 20
      jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceAllYhdjConstants.java
  3. 96
      jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceCommonConstants.java
  4. 29
      jianshui-platform/src/main/java/com/jianshui/platform/service/InvoiceDownloadService.java
  5. 4
      jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDeliveryServiceImpl.java
  6. 196
      jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDownloadServiceImpl.java
  7. 125
      jianshui-platform/src/main/java/com/jianshui/platform/utils/BatchDownloadUtils.java

@ -0,0 +1,37 @@
package com.jianshui.web.controller.platform;
import com.jianshui.common.constant.InvoiceCommonConstants;
import com.jianshui.platform.service.InvoiceDownloadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: kane
* @Description: 发票批量下载接口
* @CreateTime: 2023-06-08 14:27
* @Version: 1.0
**/
@Api(tags = "发票批量下载")
@RestController
@RequestMapping("/platForm/invoiceDownLoad")
public class InvoiceDownloadController {
@Autowired
private InvoiceDownloadService invoiceDownloadService;
@ApiOperation("发票批量下载")
@GetMapping("/dowmLoadPdf/{ids}/{status}")
public Object downLoad(@PathVariable Long[] ids,@PathVariable String status,HttpServletResponse response){
if (InvoiceCommonConstants.PDFSTATUS.equals(status)){
return invoiceDownloadService.dowmLoadPdf(ids,response);
}else {
return invoiceDownloadService.dowmLoadOfd(ids,response);
}
}
}

@ -1,20 +0,0 @@
package com.jianshui.common.constant;
/**
* @Author: xinzge
* @Description: 用户登记信息常量类
* @CreateTime: 2023-06-06 13:35
* @Version: 1.0
**/
public class InvoiceAllYhdjConstants {
/**
* 异步
*/
public final static String ASYNC = "true";
/**
* 同步
*/
public final static String SYNC = "false";
}

@ -0,0 +1,96 @@
package com.jianshui.common.constant;
/**
* @Author: xinzge
* @Description: 用户登记信息常量类
* @CreateTime: 2023-06-06 13:35
* @Version: 1.0
**/
public class InvoiceCommonConstants {
/**
* 异步
*/
public final static String ASYNC = "true";
/**
* 同步
*/
public final static String SYNC = "false";
/**
* 信息为空
*/
public final static String INVOICEINFORMATIONISEMPTY = "未传入发票信息,请检查!";
/**
* 未查询到登记信息
*/
public final static String NOINFORMATIONISFOUND = "未查询到登记信息!";
/**
* 开票日期格式
*/
public final static String DATEFORMAT = "yyyyMMddHHmmss";
/**
* 发票号码
*/
public final static String FPHM = "fphm";
/**
* 开票日期
*/
public final static String KPRQ = "kprq";
/**
* 响应码
*/
public final static String CODE = "code";
/**
* 错误信息
*/
public final static String MSG = "msg";
/**
* 响应数据
*/
public final static String DATA = "data";
/**
* 成功响应状态码
*/
public final static String SUCCESSCODE = "0000";
/**
* pdf地址
*/
public final static String PDFURL = "pdfUrl";
/**
* 发票下载地址错误
*/
public final static String DOWNLOADADDRESSERROR = "获取发票下载地址错误!";
/**
* 下载成功
*/
public final static String DOWNLOADSUCCESSCODE = "下载成功!";
/**
* ofd地址
*/
public final static String OFDURL = "ofdUrl";
/**
* pdf状态
*/
public final static String PDFSTATUS = "0";
/**
* ofd状态
*/
public final static String OFDSTATUS = "1";
}

@ -0,0 +1,29 @@
package com.jianshui.platform.service;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: kane
* @Description: 发票下载业务层
* @CreateTime: 2023-06-08 14:36
* @Version: 1.0
**/
public interface InvoiceDownloadService {
/**
* 功能描述: 发票pdf版下载
* @param ids
* @param response
* @return : java.lang.Object
*/
Object dowmLoadPdf(Long[] ids, HttpServletResponse response);
/**
* 功能描述: 发票ofd版下载
* @param ids
* @param response
* @return : java.lang.Object
*/
Object dowmLoadOfd(Long[] ids, HttpServletResponse response);
}

@ -4,7 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.jianshui.common.constant.InvoiceAllYhdjConstants;
import com.jianshui.common.constant.InvoiceCommonConstants;
import com.jianshui.common.constant.WebServiceConstant;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.core.domain.entity.Companyservice;
@ -69,7 +69,7 @@ public class InvoiceDeliveryServiceImpl implements InvoiceDeliveryService {
}
//封装上游接口实体类
InvoiceDeliveryDTO invoiceDeliveryDTO = new InvoiceDeliveryDTO();
invoiceDeliveryDTO.setAsync(InvoiceAllYhdjConstants.SYNC);
invoiceDeliveryDTO.setAsync(InvoiceCommonConstants.SYNC);
invoiceDeliveryDTO.setBsrysfzjhm(userInfo.getBsrysfzjhm());
invoiceDeliveryDTO.setDqbm(userInfo.getDqbm());
invoiceDeliveryDTO.setNsrsbh(userInfo.getNsrsbh());

@ -0,0 +1,196 @@
package com.jianshui.platform.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.jianshui.common.constant.InvoiceCommonConstants;
import com.jianshui.common.constant.WebServiceConstant;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.core.domain.entity.SysUser;
import com.jianshui.common.utils.SecurityUtils;
import com.jianshui.common.utils.jcsk.ApiHttp;
import com.jianshui.invoice.domain.Invoice;
import com.jianshui.invoice.domain.dto.HXResponse;
import com.jianshui.invoice.domain.dto.api.jcsk.FileAcquisitionTwoDTO;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.platform.service.InvoiceDownloadService;
import com.jianshui.platform.utils.BatchDownloadUtils;
import com.jianshui.platform.utils.InvoiceAllYhdjUtils;
import com.jianshui.system.domain.InvoiceAllYhdj;
import com.jianshui.system.mapper.CompanyserviceMapper;
import com.jianshui.system.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Author: kane
* @Description: 发票下载业务层
* @CreateTime: 2023-06-08 14:36
* @Version: 1.0
**/
@Service
@Slf4j
public class InvoiceDownloadServiceImpl implements InvoiceDownloadService {
@Autowired
private SysUserMapper sysUserMapper;
@Autowired
private CompanyserviceMapper companyServiceMapper;
@Autowired
private InvoiceMapper invoiceMapper;
/**
* 功能描述: 发票pfd版下载
* @param ids
* @param response
* @return : java.lang.Object
*/
@Override
public Object dowmLoadPdf(Long[] ids, HttpServletResponse response) {
//判空
if (ids == null) {
return AjaxResult.error(InvoiceCommonConstants.INVOICEINFORMATIONISEMPTY);
}
//获取用户id
Long userId = SecurityUtils.getUserId();
//根据用户id获取用户信息
SysUser sysUser = sysUserMapper.selectUserById(userId);
//根据企业id获取企业信息
Companyservice companyservice = companyServiceMapper.selectCompanyserviceByCompanyid(sysUser.getCompanyId());
//获取登记用户信息
InvoiceAllYhdjUtils invoiceAllYhdjUtils = new InvoiceAllYhdjUtils();
InvoiceAllYhdj userInfo = invoiceAllYhdjUtils.getUserInfo(companyservice);
if (BeanUtil.isEmpty(userInfo)) {
return AjaxResult.error(InvoiceCommonConstants.NOINFORMATIONISFOUND);
}
//pfd文件集合
List<String> pdfList = new ArrayList<>();
for (Long id : ids) {
Invoice invoice = invoiceMapper.selectInvoiceById(id);
String invoicePdfUrl = invoice.getInvoicePdfUrl();
if (invoicePdfUrl != null) {
pdfList.add(invoicePdfUrl);
} else {
//获取pfd下载地址
//封装请求实体类
FileAcquisitionTwoDTO fileAcquisitionDTO = new FileAcquisitionTwoDTO();
//发送同步请求
fileAcquisitionDTO.setAsync(InvoiceCommonConstants.SYNC);
fileAcquisitionDTO.setNsrsbh(userInfo.getNsrsbh());
fileAcquisitionDTO.setBsrysfzjhm(userInfo.getBsrysfzjhm());
fileAcquisitionDTO.setDqbm(userInfo.getDqbm());
Map<String, Object> map = new JSONObject();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(InvoiceCommonConstants.DATEFORMAT);
map.put(InvoiceCommonConstants.FPHM, invoice.getFphm());
Date kprq = invoice.getKprq();
//修改日期格式(请求接口要求)
String kprqFormat = simpleDateFormat.format(kprq);
map.put(InvoiceCommonConstants.KPRQ, kprqFormat);
fileAcquisitionDTO.setJsonData(map);
cn.hutool.json.JSONObject result = null;
try {
result = ApiHttp.request(WebServiceConstant.FPEWMXZ, WebServiceConstant.URL, fileAcquisitionDTO, companyservice);
String code = result.get(InvoiceCommonConstants.CODE) != null ? result.get(InvoiceCommonConstants.CODE).toString() : "";
String msg = result.get(InvoiceCommonConstants.MSG) != null ? result.get(InvoiceCommonConstants.MSG).toString() : "";
String data = result.get(InvoiceCommonConstants.DATA) != null ? result.get(InvoiceCommonConstants.DATA).toString() : "";
if (InvoiceCommonConstants.SUCCESSCODE.equals(code) && StrUtil.isNotEmpty(data)) {
cn.hutool.json.JSONObject json = JSONUtil.parseObj(data);
String pdfUrl = json.get(InvoiceCommonConstants.PDFURL) != null ? json.get(InvoiceCommonConstants.PDFURL).toString() : "";
pdfList.add(pdfUrl);
} else {
return AjaxResult.error(msg);
}
} catch (Exception e) {
e.printStackTrace();
log.error("【金四服务类】【金财数科】【获取发票下载地址】API请求异常,外部报文返回code非0000。错误信息:{}", e.getMessage());
return AjaxResult.error(InvoiceCommonConstants.DOWNLOADADDRESSERROR);
}
}
}
//下载pfd文件
BatchDownloadUtils.downloadAndZipFiles(pdfList,InvoiceCommonConstants.PDFSTATUS,response);
return AjaxResult.success(InvoiceCommonConstants.DOWNLOADSUCCESSCODE);
}
/**
* 功能描述: 发票ofd版下载
* @param ids
* @param response
* @return : java.lang.Object
*/
@Override
public Object dowmLoadOfd(Long[] ids, HttpServletResponse response) {
//判空
if (ids == null) {
return AjaxResult.error(InvoiceCommonConstants.INVOICEINFORMATIONISEMPTY);
}
//获取用户id
Long userId = SecurityUtils.getUserId();
//根据用户id获取用户信息
SysUser sysUser = sysUserMapper.selectUserById(userId);
//根据企业id获取企业信息
Companyservice companyservice = companyServiceMapper.selectCompanyserviceByCompanyid(sysUser.getCompanyId());
//获取登记用户信息
InvoiceAllYhdjUtils invoiceAllYhdjUtils = new InvoiceAllYhdjUtils();
InvoiceAllYhdj userInfo = invoiceAllYhdjUtils.getUserInfo(companyservice);
if (BeanUtil.isEmpty(userInfo)) {
return new HXResponse(InvoiceCommonConstants.NOINFORMATIONISFOUND);
}
//ofd文件集合
List<String> ofdList = new ArrayList<>();
for (Long id : ids) {
Invoice invoice = invoiceMapper.selectInvoiceById(id);
String invoiceOfdUrl = invoice.getcOfdUrl();
if (invoiceOfdUrl != null) {
ofdList.add(invoiceOfdUrl);
} else {
//获取ofd下载地址
//封装请求实体类
FileAcquisitionTwoDTO fileAcquisitionDTO = new FileAcquisitionTwoDTO();
//发送同步请求
fileAcquisitionDTO.setAsync(InvoiceCommonConstants.SYNC);
fileAcquisitionDTO.setNsrsbh(userInfo.getNsrsbh());
fileAcquisitionDTO.setBsrysfzjhm(userInfo.getBsrysfzjhm());
fileAcquisitionDTO.setDqbm(userInfo.getDqbm());
Map<String, Object> map = new JSONObject();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(InvoiceCommonConstants.DATEFORMAT);
map.put(InvoiceCommonConstants.FPHM, invoice.getFphm());
Date kprq = invoice.getKprq();
//修改日期格式(请求接口要求)
String kprqFormat = simpleDateFormat.format(kprq);
map.put(InvoiceCommonConstants.KPRQ, kprqFormat);
fileAcquisitionDTO.setJsonData(map);
cn.hutool.json.JSONObject result = null;
try {
result = ApiHttp.request(WebServiceConstant.FPEWMXZ, WebServiceConstant.URL, fileAcquisitionDTO, companyservice);
String code = result.get(InvoiceCommonConstants.CODE) != null ? result.get(InvoiceCommonConstants.CODE).toString() : "";
String msg = result.get(InvoiceCommonConstants.MSG) != null ? result.get(InvoiceCommonConstants.MSG).toString() : "";
String data = result.get(InvoiceCommonConstants.DATA) != null ? result.get(InvoiceCommonConstants.DATA).toString() : "";
if (InvoiceCommonConstants.SUCCESSCODE.equals(code) && StrUtil.isNotEmpty(data)) {
cn.hutool.json.JSONObject json = JSONUtil.parseObj(data);
String ofdUrl = json.get(InvoiceCommonConstants.OFDURL) != null ? json.get(InvoiceCommonConstants.OFDURL).toString() : "";
ofdList.add(ofdUrl);
} else {
return AjaxResult.error(msg);
}
} catch (Exception e) {
e.printStackTrace();
log.error("【金四服务类】【金财数科】【获取发票下载地址】API请求异常,外部报文返回code非0000。错误信息:{}", e.getMessage());
return AjaxResult.error(InvoiceCommonConstants.DOWNLOADADDRESSERROR);
}
}
}
//下载ofd文件集合
BatchDownloadUtils.downloadAndZipFiles(ofdList,InvoiceCommonConstants.OFDSTATUS,response);
return AjaxResult.success(InvoiceCommonConstants.DOWNLOADSUCCESSCODE);
}
}

@ -0,0 +1,125 @@
package com.jianshui.platform.utils;
import com.jianshui.common.constant.InvoiceCommonConstants;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @Author: kane
* @Description: 批量下载工具类
* @CreateTime: 2023-06-09 15:46
* @Version: 1.0
**/
public class BatchDownloadUtils {
/**
* 功能描述: 批量下载
* @param status 文件类型0-pfd 1-ofd
* @param urls
* @return : void
*/
public static void downloadAndZipFiles(List<String> urls, String status, HttpServletResponse response) {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat(InvoiceCommonConstants.DATEFORMAT);
String name = format.format(now);
String zipFileName = name + ".zip";
OutputStream ops = null;
ZipOutputStream zos = null;
InputStream inputStream = null;
try {
response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);
response.setCharacterEncoding("utf-8");
ops = response.getOutputStream();
zos = new ZipOutputStream(ops);
for (String url : urls) {
if (StringUtils.hasText(url)) {
URL downloadUrl = new URL(url);
HttpURLConnection httpConn = (HttpURLConnection) downloadUrl.openConnection();
int responseCode = httpConn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
String fileName = getFileName(httpConn, status);
inputStream = httpConn.getInputStream();
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
int bytesRead = -1;
byte[] buffer = new byte[4096];
while ((bytesRead = inputStream.read(buffer)) != -1) {
zos.write(buffer, 0, bytesRead);
}
}
httpConn.disconnect();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}finally {
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (zos != null){
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ops != null){
try {
ops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 功能描述: 获取下载后的文件名
* @param httpConn
* @return : java.lang.String
*/
private static String getFileName(HttpURLConnection httpConn, String status) {
String fileName = "";
String disposition = httpConn.getHeaderField("Content-Disposition");
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(InvoiceCommonConstants.DATEFORMAT);
if (disposition != null) {
int index = disposition.indexOf("filename=");
if (index > 0) {
fileName = disposition.substring(index + 10, disposition.length() - 1);
if ("0".equals(status)) {
String name = simpleDateFormat.format(date);
fileName = name + ".pdf";
} else {
String name = simpleDateFormat.format(date);
fileName = name + ".ofd";
}
}
}
if (StringUtils.isEmpty(fileName)) {
fileName = httpConn.getURL().getFile().substring(httpConn.getURL().getFile().lastIndexOf("/") + 1);
if ("0".equals(status)) {
String name = simpleDateFormat.format(date);
fileName = name + ".pdf";
} else {
String name = simpleDateFormat.format(date);
fileName = name + ".ofd";
}
}
return fileName;
}
}
Loading…
Cancel
Save