diff --git a/jianshui-admin/src/main/java/com/jianshui/web/controller/platform/InvoiceDownloadController.java b/jianshui-admin/src/main/java/com/jianshui/web/controller/platform/InvoiceDownloadController.java new file mode 100644 index 0000000..82ddd8e --- /dev/null +++ b/jianshui-admin/src/main/java/com/jianshui/web/controller/platform/InvoiceDownloadController.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); + } + } + +} diff --git a/jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceAllYhdjConstants.java b/jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceAllYhdjConstants.java deleted file mode 100644 index fb643d8..0000000 --- a/jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceAllYhdjConstants.java +++ /dev/null @@ -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"; - -} diff --git a/jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceCommonConstants.java b/jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceCommonConstants.java new file mode 100644 index 0000000..06afb5a --- /dev/null +++ b/jianshui-common/src/main/java/com/jianshui/common/constant/InvoiceCommonConstants.java @@ -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"; + +} diff --git a/jianshui-platform/src/main/java/com/jianshui/platform/service/InvoiceDownloadService.java b/jianshui-platform/src/main/java/com/jianshui/platform/service/InvoiceDownloadService.java new file mode 100644 index 0000000..9319df2 --- /dev/null +++ b/jianshui-platform/src/main/java/com/jianshui/platform/service/InvoiceDownloadService.java @@ -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); + +} diff --git a/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDeliveryServiceImpl.java b/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDeliveryServiceImpl.java index c77b2e4..b542be2 100644 --- a/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDeliveryServiceImpl.java +++ b/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDeliveryServiceImpl.java @@ -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()); diff --git a/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDownloadServiceImpl.java b/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDownloadServiceImpl.java new file mode 100644 index 0000000..754d610 --- /dev/null +++ b/jianshui-platform/src/main/java/com/jianshui/platform/service/impl/InvoiceDownloadServiceImpl.java @@ -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 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 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 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 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); + } + + +} diff --git a/jianshui-platform/src/main/java/com/jianshui/platform/utils/BatchDownloadUtils.java b/jianshui-platform/src/main/java/com/jianshui/platform/utils/BatchDownloadUtils.java new file mode 100644 index 0000000..f4b4ef4 --- /dev/null +++ b/jianshui-platform/src/main/java/com/jianshui/platform/utils/BatchDownloadUtils.java @@ -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 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; + } +}