package com.ruoyi.order.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.ruoyi.account.api.dto.UploadPdfDTO; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.WebUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.Logical; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.order.api.model.TOrderInvoice; import com.ruoyi.order.api.query.TOrderInvoiceQuery; import com.ruoyi.order.api.vo.TOrderInvoiceVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.export.OrderInvoiceExport; import com.ruoyi.order.service.TOrderInvoiceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.compress.utils.IOUtils; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.annotation.Resource; import javax.mail.*; import javax.mail.internet.*; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; import java.net.URLEncoder; import java.time.LocalDateTime; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** *

* 前端控制器 *

* * @author xiaochen * @since 2024-08-07 */ @Api(tags = "订单开票") @RestController @RequestMapping("/t-order-invoice") public class TOrderInvoiceController { @Resource private TOrderInvoiceService orderInvoiceService; @Resource private TokenService tokenService; @Resource private AppUserClient appUserClient; @ResponseBody @PostMapping("/addOrderInvoice") @ApiOperation(value = "添加开票申请", tags = {"小程序-充电发票"}) public AjaxResult addOrderInvoice(@RequestBody AddOrderInvoice addOrderInvoice){ return orderInvoiceService.addOrderInvoice(addOrderInvoice); } @RequiresPermissions(value = {"/invoiceManagement"}, logical = Logical.OR) @PostMapping("/pageList") @ApiOperation(value = "查询开票分页列表", tags = {"管理后台-发票管理"}) public AjaxResult> pageList(@RequestBody TOrderInvoiceQuery query){ return AjaxResult.success(orderInvoiceService.pageList(query)); } @RequiresPermissions(value = {"/invoiceManagement/accept_hear_case"}, logical = Logical.OR) @PostMapping("/uploadPdf") @ApiOperation(value = "上传发票", tags = {"管理后台-发票管理"}) public AjaxResult uploadPdf(@RequestBody UploadPdfDTO dto){ TOrderInvoice orderInvoice = orderInvoiceService.getById(dto.getId()); orderInvoice.setInvoiceUrl(dto.getInvoiceUrl()); orderInvoice.setStatus(3); orderInvoice.setBillingTime(LocalDateTime.now()); Long userId = SecurityUtils.getUserId(); orderInvoice.setBillingUserId(userId == null ? null : userId.intValue()); orderInvoiceService.updateById(orderInvoice); dto.setMailBox(orderInvoice.getMailbox()); appUserClient.uploadPdf(dto); return AjaxResult.success(); } @RequiresPermissions(value = {"/invoiceManagement/accept_hear_case"}, logical = Logical.OR) @PostMapping("/cancel") @ApiOperation(value = "取消开票申请", tags = {"管理后台-发票管理"}) public AjaxResult cancel(@RequestBody TOrderInvoice dto){ TOrderInvoice orderInvoice = orderInvoiceService.getById(dto.getId()); if (orderInvoice == null) { return AjaxResult.error("开票申请不存在"); } if (Integer.valueOf(3).equals(orderInvoice.getStatus())) { return AjaxResult.error("已完成开票不能取消"); } orderInvoice.setStatus(4); orderInvoice.setCancelTime(LocalDateTime.now()); orderInvoiceService.updateById(orderInvoice); return AjaxResult.success(); } @RequiresPermissions(value = {"/invoiceManagement"}, logical = Logical.OR) @PostMapping("/statusCount") @ApiOperation(value = "查询开票状态数量", tags = {"管理后台-发票管理"}) public AjaxResult> statusCount(@RequestBody TOrderInvoiceQuery query){ return AjaxResult.success(orderInvoiceService.statusCount(query)); } /** * 发票管理导出 */ @RequiresPermissions(value = {"/invoiceManagement/export"}, logical = Logical.OR) @ApiOperation(value = "发票管理导出", tags = {"管理后台-发票管理"}) @Log(title = "发票管理导出", businessType = BusinessType.EXPORT) @PutMapping("/export") public void export(@RequestBody TOrderInvoiceQuery query) { List list = orderInvoiceService.export(query); List orderInvoiceExports = new ArrayList<>(); for (TOrderInvoiceVO orderInvoiceVO : list) { OrderInvoiceExport orderInvoiceExport = new OrderInvoiceExport(); BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport); if (orderInvoiceVO.getCreateTime()!=null){ orderInvoiceExport.setApplyTime(DateUtils.localDateTimeToString(orderInvoiceVO.getCreateTime())); } if (orderInvoiceVO.getBillingTime()!=null){ orderInvoiceExport.setBillingTime(DateUtils.localDateTimeToString(orderInvoiceVO.getBillingTime())); } orderInvoiceExports.add(orderInvoiceExport); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, orderInvoiceExports); HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("发票导出.xls", "utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 下载开票申请,单个返回 Excel,多个返回 zip。 */ @RequiresPermissions(value = {"/invoiceManagement/export"}, logical = Logical.OR) @ApiOperation(value = "下载开票申请", tags = {"管理后台-发票管理"}) @Log(title = "下载开票申请", businessType = BusinessType.EXPORT) @PutMapping("/downloadApplication") public void downloadApplication(@RequestBody TOrderInvoiceQuery query) { List list = orderInvoiceService.export(query); HttpServletResponse response = WebUtils.response(); try { if (list.size() == 1) { writeInvoiceWorkbook(response, list.get(0), buildInvoiceFileName(list.get(0))); return; } response.setCharacterEncoding("utf-8"); response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("开票申请.zip", "utf-8")); try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())) { for (TOrderInvoiceVO invoice : list) { Workbook workbook = buildInvoiceWorkbook(invoice); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); workbook.write(outputStream); workbook.close(); zipOutputStream.putNextEntry(new ZipEntry(buildInvoiceFileName(invoice))); zipOutputStream.write(outputStream.toByteArray()); zipOutputStream.closeEntry(); } } } catch (IOException e) { e.printStackTrace(); } } private void writeInvoiceWorkbook(HttpServletResponse response, TOrderInvoiceVO invoice, String fileName) throws IOException { response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); Workbook workbook = buildInvoiceWorkbook(invoice); try (ServletOutputStream outputStream = response.getOutputStream()) { workbook.write(outputStream); } workbook.close(); } private Workbook buildInvoiceWorkbook(TOrderInvoiceVO invoice) { OrderInvoiceExport export = new OrderInvoiceExport(); BeanUtils.copyProperties(invoice, export); if (invoice.getCreateTime() != null) { export.setApplyTime(DateUtils.localDateTimeToString(invoice.getCreateTime())); } if (invoice.getBillingTime() != null) { export.setBillingTime(DateUtils.localDateTimeToString(invoice.getBillingTime())); } return ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, Collections.singletonList(export)); } private String buildInvoiceFileName(TOrderInvoiceVO invoice) { String title = invoice.getName() == null ? "开票申请" : invoice.getName(); String phone = invoice.getUserPhone() == null ? "" : invoice.getUserPhone(); return title + phone + ".xls"; } @ResponseBody @GetMapping("/getMyOrderInvoiceList") @ApiOperation(value = "获取开票记录列表", tags = {"小程序-充电发票"}) public AjaxResult> getMyOrderInvoiceList(GetOrderInvoiceList query){ List myOrderInvoiceList = orderInvoiceService.getMyOrderInvoiceList(query); return AjaxResult.success(myOrderInvoiceList); } @ResponseBody @PostMapping("/cancelMyOrderInvoice/{id}") @ApiOperation(value = "取消我的开票申请", tags = {"小程序-充电发票"}) public AjaxResult cancelMyOrderInvoice(@PathVariable Long id){ TOrderInvoice orderInvoice = orderInvoiceService.getById(id); if (orderInvoice == null) { return AjaxResult.error("开票申请不存在"); } Long userId = tokenService.getLoginUserApplet().getUserId(); if(!orderInvoice.getAppUserId().equals(userId)){ return AjaxResult.error("权限不足"); } if (!Integer.valueOf(1).equals(orderInvoice.getStatus())) { return AjaxResult.error("当前开票申请不能取消"); } orderInvoice.setStatus(4); orderInvoice.setCancelTime(LocalDateTime.now()); orderInvoiceService.updateById(orderInvoice); return AjaxResult.success(); } @ResponseBody @GetMapping("/getMyOrderInvoiceInfo/{id}") @ApiOperation(value = "获取开票记录详情", tags = {"小程序-充电发票"}) public AjaxResult getMyOrderInvoiceInfo(@PathVariable String id){ TOrderInvoice orderInvoice = orderInvoiceService.getById(id); if (orderInvoice == null) { return AjaxResult.error("开票申请不存在"); } Long userId = tokenService.getLoginUserApplet().getUserId(); if(!orderInvoice.getAppUserId().equals(userId)){ return AjaxResult.error("权限不足"); } MyOrderInvoiceInfo myOrderInvoiceInfo = orderInvoiceService.getMyOrderInvoiceInfo(id); return AjaxResult.success(myOrderInvoiceInfo); } }