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<ServiceInvoice> list = serviceInvoiceService.queryList(serviceInvoice);
|
return getDataTable(list);
|
}
|
|
/**
|
* 导出发票管理列表
|
*/
|
@ApiOperation("导出发票管理列表")
|
@Log(title = "发票管理", businessType = BusinessType.EXPORT)
|
@GetMapping("/export")
|
public AjaxResult export(ServiceInvoice serviceInvoice) {
|
List<ServiceInvoice> list = serviceInvoiceService.queryList(serviceInvoice);
|
ExcelUtil<ServiceInvoice> util = new ExcelUtil<ServiceInvoice>(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<Map<String,Object>> lists=aliOCR(base64,userId,caseId);
|
for(Map<String,Object> 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<Map<String,Object>> aliOCR(String base64,long userId,long caseId) {
|
String host = "https://mixedmulti.market.alicloudapi.com";
|
String path = "/ocrservice/mixedMultiInvoice";
|
String method = "POST";
|
Map<String, String> headers = new HashMap<String, String>();
|
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
|
headers.put("Authorization", "APPCODE " + appcode);
|
//根据API的要求,定义相对应的Content-Type
|
headers.put("Content-Type", "application/json; charset=UTF-8");
|
Map<String, String> querys = new HashMap<String, String>();
|
String bodys = "{\"img\":\""+base64+"\"}";
|
List<Map<String,Object>> 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<String,Object> tempList=new HashMap<>();
|
JSONObject rowObject=(JSONObject)row;
|
tempList.put("发票分类",rowObject.getString("type"));
|
JSONObject result=((JSONObject)rowObject.get("result")).getJSONObject("data");
|
|
for(Map.Entry<String, Object> 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;
|
}
|
}
|
}
|