| ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceInvoiceController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceInvoice.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceInvoiceMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceInvoiceService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceInvoiceServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -51,8 +51,6 @@ @Autowired private ServerConfig serverConfig; @Value("${appcode}") private String appcode; /** * éç¨ä¸è½½è¯·æ± @@ -131,120 +129,6 @@ } } public String aliOCR(String base64) { 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+"\"}"; try { HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys); System.out.println(response.toString()); //è·åresponseçbody String content=EntityUtils.toString(response.getEntity()); JSONObject jsonContent=JSONObject.parseObject(content); JSONArray subMsgs=jsonContent.getJSONArray("subMsgs"); List<Map<String,Object>> lists=new ArrayList<>(); 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); } System.out.println(content); return JSON.toJSONString(lists); } catch (Exception e) { e.printStackTrace(); return "{}"; } } /** * éç¨ä¸ä¼ è¯·æ± */ @ApiOperation("testOCR") @PostMapping("/common/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)); return ajax; } /** * éç¨ä¸ä¼ è¯·æ± */ @PostMapping("/common/uploadOCR") public AjaxResult uploadOCR(MultipartFile file) throws Exception { try { // ä¸ä¼ æä»¶è·¯å¾ String filePath = RuoYiConfig.getUploadPath(); //夿æä»¶æ¯å¦åå¨ String filename = file.getOriginalFilename().trim(); String felinamePath = FileUploadUtils.extractFilename(file); // 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()); String 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(); log.info("url1çå¼old :{}", url1); if (url1.contains("8032")) { //è¿éç8032䏿¯tomcatçï¼æä»¥è¦è½¬ætomcatç url1 = url1.replace("8032", "8032/prod-api"); } String base64= Base64.getEncoder().encodeToString(file.getBytes()); log.info("url1çå¼new :{}", url1); String url = url1 + fileName; AjaxResult ajax = AjaxResult.success(); ajax.put("fileName", fileName); ajax.put("url", url); ajax.put("OCRList", aliOCR(base64)); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } // private static void parseUTF(int[] bits) { // int index = 0;//è¿ä¸ªæéæåæ¯ä¸è¡å¾ªç¯æ¶å䏿 çä½ç½®ï¼ä¸ä¸è¡å¼å§æ¶éæ°ç½®ä½0 ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceInvoiceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,239 @@ 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; } } } ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceInvoice.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,127 @@ package com.ruoyi.project.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.util.Date; /** * å票管ç对象 service_invoice * * @author ruoyi * @date 2026-10-21 */ @Data @ApiModel("å票管ç") @TableName("service_invoice") public class ServiceInvoice extends BaseEntity { private static final long serialVersionUID = 1L; /** * 主é®ID */ @ApiModelProperty("主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * ç¨æ·ID */ @ApiModelProperty("ç¨æ·ID") @Excel(name = "ç¨æ·ID") private Long userId; /** * æ¡ä¾ID */ @ApiModelProperty("æ¡ä¾ID") @Excel(name = "æ¡ä¾ID") private Long caseId; /** * å票类å */ @ApiModelProperty("å票类å") @Excel(name = "å票类å") private String invoiceType; /** * å票åç§° */ @ApiModelProperty("å票åç§°") @Excel(name = "å票åç§°") private String invoiceName; /** * å票å·ç */ @ApiModelProperty("å票å·ç ") @Excel(name = "å票å·ç ") private String invoiceNo; /** * åçæ¥æ */ @ApiModelProperty("åçæ¥æ") @Excel(name = "åçæ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private String occurDate; /** * å票å¼å§æ¥æ */ @ApiModelProperty("å票å¼å§æ¥æ") @Excel(name = "å票å¼å§æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private String invoiceStartDate; /** * åç¥¨ç»ææ¥æ */ @ApiModelProperty("åç¥¨ç»ææ¥æ") @Excel(name = "åç¥¨ç»ææ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private String invoiceEndDate; /** * å票éé¢ */ @ApiModelProperty("å票éé¢") @Excel(name = "å票éé¢") private String invoiceAmount; /** * é宿¹åç§° */ @ApiModelProperty("é宿¹åç§°") @Excel(name = "é宿¹åç§°") private String sellerName; /** * å票URL */ @ApiModelProperty("å票URL") @Excel(name = "å票URL") private String invoiceUrl; /** * æ©å±å 容ï¼jsonåï¼ */ @ApiModelProperty("æ©å±å 容ï¼jsonåï¼") private String extContent; /** * 夿³¨ */ @ApiModelProperty("夿³¨") @Excel(name = "夿³¨") @TableField("remark") private String remark; } ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceInvoiceMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.ruoyi.project.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.project.domain.ServiceInvoice; import org.apache.ibatis.annotations.Mapper; /** * å票管çMapperæ¥å£ * * @author ruoyi * @date 2026-10-21 */ @Mapper public interface ServiceInvoiceMapper extends BaseMapper<ServiceInvoice> { } ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceInvoiceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.project.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.project.domain.ServiceInvoice; import java.util.List; /** * å票管çServiceæ¥å£ * * @author ruoyi * @date 2026-10-21 */ public interface IServiceInvoiceService extends IService<ServiceInvoice> { /** * æ¥è¯¢å票管çå表 * * @param serviceInvoice å票管ç * @return å票管çéå */ List<ServiceInvoice> queryList(ServiceInvoice serviceInvoice); } ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceInvoiceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,71 @@ package com.ruoyi.project.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.domain.ServiceInvoice; import com.ruoyi.project.mapper.ServiceInvoiceMapper; import com.ruoyi.project.service.IServiceInvoiceService; import org.springframework.stereotype.Service; import java.util.List; /** * å票管çServiceä¸å¡å±å¤ç * * @author ruoyi * @date 2026-10-21 */ @Service public class ServiceInvoiceServiceImpl extends ServiceImpl<ServiceInvoiceMapper, ServiceInvoice> implements IServiceInvoiceService { /** * æ¥è¯¢å票管çå表 * * @param serviceInvoice å票管ç * @return å票管ç */ @Override public List<ServiceInvoice> queryList(ServiceInvoice serviceInvoice) { LambdaQueryWrapper<ServiceInvoice> wrappers = Wrappers.lambdaQuery(); if (serviceInvoice.getId() != null) { wrappers.eq(ServiceInvoice::getId, serviceInvoice.getId()); } if (serviceInvoice.getUserId() != null) { wrappers.eq(ServiceInvoice::getUserId, serviceInvoice.getUserId()); } if (serviceInvoice.getCaseId() != null) { wrappers.eq(ServiceInvoice::getCaseId, serviceInvoice.getCaseId()); } if (StringUtils.isNotBlank(serviceInvoice.getInvoiceType())) { wrappers.eq(ServiceInvoice::getInvoiceType, serviceInvoice.getInvoiceType()); } if (StringUtils.isNotBlank(serviceInvoice.getInvoiceName())) { wrappers.like(ServiceInvoice::getInvoiceName, serviceInvoice.getInvoiceName()); } if (StringUtils.isNotBlank(serviceInvoice.getInvoiceNo())) { wrappers.eq(ServiceInvoice::getInvoiceNo, serviceInvoice.getInvoiceNo()); } if (serviceInvoice.getOccurDate() != null) { wrappers.eq(ServiceInvoice::getOccurDate, serviceInvoice.getOccurDate()); } if (serviceInvoice.getInvoiceStartDate() != null) { wrappers.ge(ServiceInvoice::getInvoiceStartDate, serviceInvoice.getInvoiceStartDate()); } if (serviceInvoice.getInvoiceEndDate() != null) { wrappers.le(ServiceInvoice::getInvoiceEndDate, serviceInvoice.getInvoiceEndDate()); } if (serviceInvoice.getInvoiceAmount() != null) { wrappers.eq(ServiceInvoice::getInvoiceAmount, serviceInvoice.getInvoiceAmount()); } if (StringUtils.isNotBlank(serviceInvoice.getSellerName())) { wrappers.like(ServiceInvoice::getSellerName, serviceInvoice.getSellerName()); } if (StringUtils.isNotBlank(serviceInvoice.getRemark())) { wrappers.like(ServiceInvoice::getRemark, serviceInvoice.getRemark()); } wrappers.orderByDesc(ServiceInvoice::getCreateTime).orderByDesc(ServiceInvoice::getId); return this.list(wrappers); } }