sinake
3 天以前 e0bbd21f56757c35dc067eaa8bc67057b65fead4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
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;
        }
    }
}