package com.ruoyi.web.controller.project; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.ChineseUtils; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.config.ServerConfig; import com.ruoyi.project.domain.ServiceInvoice; import com.ruoyi.project.service.IServiceInvoiceService; import com.ruoyi.web.controller.tool.HttpUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; /** * 发票管理Controller * * @author ruoyi * @date 2026-10-21 */ @Api("发票管理") @RestController @RequestMapping("/project/invoice") public class ServiceInvoiceController extends BaseController { @Autowired private IServiceInvoiceService serviceInvoiceService; @Autowired private ServerConfig serverConfig; @Value("${appcode}") private String appcode; /** * 查询发票管理列表 */ @ApiOperation("查询发票管理列表") @GetMapping("/list") public TableDataInfo list(ServiceInvoice serviceInvoice) { startPage(); List list = serviceInvoiceService.queryList(serviceInvoice); return getDataTable(list); } /** * 导出发票管理列表 */ @ApiOperation("导出发票管理列表") @Log(title = "发票管理", businessType = BusinessType.EXPORT) @GetMapping("/export") public AjaxResult export(ServiceInvoice serviceInvoice) { List list = serviceInvoiceService.queryList(serviceInvoice); ExcelUtil util = new ExcelUtil(ServiceInvoice.class); return util.exportExcel(list, "发票管理数据"); } /** * 获取发票管理详细信息 */ @ApiOperation("获取发票管理详细信息") @GetMapping(value = "/getInfo/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return AjaxResult.success(serviceInvoiceService.getById(id)); } /** * 新增发票管理 */ @ApiOperation("新增发票管理") @Log(title = "发票管理", businessType = BusinessType.INSERT) @PostMapping("/add") @RepeatSubmit public AjaxResult add(@RequestBody ServiceInvoice serviceInvoice) { return toAjax(serviceInvoiceService.save(serviceInvoice)); } /** * 修改发票管理 */ @ApiOperation("修改发票管理") @Log(title = "发票管理", businessType = BusinessType.UPDATE) @PostMapping("/edit") @RepeatSubmit public AjaxResult edit(@RequestBody ServiceInvoice serviceInvoice) { return toAjax(serviceInvoiceService.updateById(serviceInvoice)); } /** * 删除发票管理 */ @ApiOperation("删除发票管理") @Log(title = "发票管理", businessType = BusinessType.DELETE) @GetMapping("/remove/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(serviceInvoiceService.removeByIds(Arrays.asList(ids))); } /** * 通用上传请求 */ @ApiOperation("testOCR") @PostMapping("/testOCR") public AjaxResult testOCR(@RequestBody String fileName) throws Exception { Path filePath= Paths.get(fileName); String base64= Base64.getEncoder().encodeToString( Files.readAllBytes(filePath)); AjaxResult ajax = AjaxResult.success(); ajax.put("OCRList", aliOCR(base64,0,0)); return ajax; } /** * 通用上传请求 */ @PostMapping("/uploadOCR") public AjaxResult uploadOCR(@RequestParam("file") MultipartFile file, @RequestParam("userId") long userId, @RequestParam("caseId") long caseId) throws Exception { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); //判断文件是否存在 String filename = file.getOriginalFilename().trim(); String felinamePath = FileUploadUtils.extractFilename(file); String newFilename=""; // String pathFileName = FileUploadUtils.getPathFileName(filePath, s); for (int i=1;i<500;i++) { File file1 = new File(filePath + "/" + felinamePath); boolean exists = file1.exists(); if (exists) { int index = filename.lastIndexOf("."); String startStr = filename.substring(0, index); String endStr = filename.substring(index, filename.length()); newFilename = startStr + "-" + i + endStr; // your new filename felinamePath = DateUtils.datePath() + "/" + newFilename; String contentType = file.getContentType(); byte[] bytes = file.getBytes(); file = new MockMultipartFile(newFilename, newFilename, contentType, bytes); }else{ break; } } // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url1 = serverConfig.getUrl(); String url = url1 + fileName; String base64= Base64.getEncoder().encodeToString(file.getBytes()); List> lists=aliOCR(base64,userId,caseId); for(Map row : lists){ ServiceInvoice invoice=new ServiceInvoice(); invoice.setUserId(userId); invoice.setCaseId(caseId); invoice.setInvoiceType(row.get("type")+""); invoice.setInvoiceNo(row.get("发票号码")+""); invoice.setOccurDate(row.get("开票日期")+""); invoice.setInvoiceAmount(row.get("发票金额")+""); invoice.setSellerName(row.get("受票方名称")+""); invoice.setInvoiceUrl(url); invoice.setInvoiceName(newFilename); invoice.setExtContent(JSON.toJSONString(row)); serviceInvoiceService.save(invoice); } AjaxResult ajax = AjaxResult.success(); ajax.put("fileName", fileName); ajax.put("url", url); ajax.put("OCRList", lists); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } public List> aliOCR(String base64,long userId,long caseId) { String host = "https://mixedmulti.market.alicloudapi.com"; String path = "/ocrservice/mixedMultiInvoice"; String method = "POST"; Map headers = new HashMap(); //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105 headers.put("Authorization", "APPCODE " + appcode); //根据API的要求,定义相对应的Content-Type headers.put("Content-Type", "application/json; charset=UTF-8"); Map querys = new HashMap(); String bodys = "{\"img\":\""+base64+"\"}"; List> lists=new ArrayList<>(); try { HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys); //获取response的body String content= EntityUtils.toString(response.getEntity()); JSONObject jsonContent=JSONObject.parseObject(content); JSONArray subMsgs=jsonContent.getJSONArray("subMsgs"); for(Object row: subMsgs){ Map tempList=new HashMap<>(); JSONObject rowObject=(JSONObject)row; tempList.put("发票分类",rowObject.getString("type")); JSONObject result=((JSONObject)rowObject.get("result")).getJSONObject("data"); for(Map.Entry entry : result.entrySet()){ tempList.put(entry.getKey(),entry.getValue()); } if(rowObject.getString("type").equals("银行承兑汇票")){ BigDecimal totalAmount= ChineseUtils.chineseToNumber(result.getString("票据金额大写")); tempList.put("发票金额",totalAmount); } if(rowObject.getString("type").equals("火车票")){ tempList.put("发票金额",result.getString("票价")); } lists.add(tempList); } return lists; } catch (Exception e) { return lists; } } }