From cdef82f32fc2d9854684d20cada7efc083627b76 Mon Sep 17 00:00:00 2001 From: 252535409 <252535409@qq.com> Date: Sun, 3 Dec 2023 10:49:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ReviewRecordsDetailTemplateController.java | 171 ++++++++++++++++++ .../PreReviewRecordsDetailTemplate.java | 66 +++++++ .../entity/YsDirectoryMaterialTemplate.java | 54 ++++++ .../PreReviewRecordsDetailTemplateMapper.java | 18 ++ .../YsDirectoryMaterialTemplateMapper.java | 18 ++ .../xml/PreReviewRecordsDetailMapper.xml | 3 +- .../PreReviewRecordsDetailTemplateMapper.xml | 5 + .../xml/YsDirectoryMaterialTemplateMapper.xml | 5 + .../IPreExaminationMattersFieldService.java | 7 + .../IPreReviewRecordsDetailService.java | 9 + ...PreReviewRecordsDetailTemplateService.java | 15 ++ .../service/IYsDirectoryMaterialService.java | 8 + .../IYsDirectoryMaterialTemplateService.java | 15 ++ ...PreExaminationMattersFieldServiceImpl.java | 57 ++++++ .../PreReviewRecordsDetailServiceImpl.java | 70 ++++++- ...eviewRecordsDetailTemplateServiceImpl.java | 19 ++ .../impl/PreReviewRecordsServiceImpl.java | 67 +++++-- .../impl/YsDirectoryMaterialServiceImpl.java | 22 +++ ...sDirectoryMaterialTemplateServiceImpl.java | 19 ++ .../ai/vo/PreReviewRecordsDetailVo.java | 4 + .../api/controller/AiAPIController.java | 57 +++++- .../jeecg/modules/system/util/BaiduUtil.java | 91 ++++++++++ .../util/RecognizeGeneralTextSolution.java | 98 ++++++++++ 23 files changed, 876 insertions(+), 22 deletions(-) create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/controller/PreReviewRecordsDetailTemplateController.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/entity/PreReviewRecordsDetailTemplate.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/entity/YsDirectoryMaterialTemplate.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/mapper/PreReviewRecordsDetailTemplateMapper.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/mapper/YsDirectoryMaterialTemplateMapper.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailTemplateMapper.xml create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/YsDirectoryMaterialTemplateMapper.xml create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreReviewRecordsDetailTemplateService.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialTemplateService.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailTemplateServiceImpl.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/YsDirectoryMaterialTemplateServiceImpl.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/system/util/BaiduUtil.java create mode 100644 service-management-system/src/main/java/org/jeecg/modules/system/util/RecognizeGeneralTextSolution.java diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/controller/PreReviewRecordsDetailTemplateController.java b/service-management-system/src/main/java/org/jeecg/modules/ai/controller/PreReviewRecordsDetailTemplateController.java new file mode 100644 index 0000000..e5b63bb --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/controller/PreReviewRecordsDetailTemplateController.java @@ -0,0 +1,171 @@ +package org.jeecg.modules.ai.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; +import org.jeecg.modules.ai.service.IPreReviewRecordsDetailTemplateService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + + /** + * @Description: 办事预审记录上传资料表 + * @Author: jeecg-boot + * @Date: 2023-12-03 + * @Version: V1.0 + */ +@Api(tags="办事预审记录上传资料表") +@RestController +@RequestMapping("/ai/preReviewRecordsDetailTemplate") +@Slf4j +public class PreReviewRecordsDetailTemplateController extends JeecgController { + @Autowired + private IPreReviewRecordsDetailTemplateService preReviewRecordsDetailTemplateService; + + /** + * 分页列表查询 + * + * @param preReviewRecordsDetailTemplate + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @AutoLog(value = "办事预审记录上传资料表-分页列表查询") + @ApiOperation(value="办事预审记录上传资料表-分页列表查询", notes="办事预审记录上传资料表-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(PreReviewRecordsDetailTemplate preReviewRecordsDetailTemplate, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(preReviewRecordsDetailTemplate, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = preReviewRecordsDetailTemplateService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param preReviewRecordsDetailTemplate + * @return + */ + @AutoLog(value = "办事预审记录上传资料表-添加") + @ApiOperation(value="办事预审记录上传资料表-添加", notes="办事预审记录上传资料表-添加") + @PostMapping(value = "/add") + public Result add(@RequestBody PreReviewRecordsDetailTemplate preReviewRecordsDetailTemplate) { + preReviewRecordsDetailTemplateService.save(preReviewRecordsDetailTemplate); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param preReviewRecordsDetailTemplate + * @return + */ + @AutoLog(value = "办事预审记录上传资料表-编辑") + @ApiOperation(value="办事预审记录上传资料表-编辑", notes="办事预审记录上传资料表-编辑") + @PutMapping(value = "/edit") + public Result edit(@RequestBody PreReviewRecordsDetailTemplate preReviewRecordsDetailTemplate) { + preReviewRecordsDetailTemplateService.updateById(preReviewRecordsDetailTemplate); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "办事预审记录上传资料表-通过id删除") + @ApiOperation(value="办事预审记录上传资料表-通过id删除", notes="办事预审记录上传资料表-通过id删除") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + preReviewRecordsDetailTemplateService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "办事预审记录上传资料表-批量删除") + @ApiOperation(value="办事预审记录上传资料表-批量删除", notes="办事预审记录上传资料表-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.preReviewRecordsDetailTemplateService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @AutoLog(value = "办事预审记录上传资料表-通过id查询") + @ApiOperation(value="办事预审记录上传资料表-通过id查询", notes="办事预审记录上传资料表-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + PreReviewRecordsDetailTemplate preReviewRecordsDetailTemplate = preReviewRecordsDetailTemplateService.getById(id); + if(preReviewRecordsDetailTemplate==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(preReviewRecordsDetailTemplate); + } + + /** + * 导出excel + * + * @param request + * @param preReviewRecordsDetailTemplate + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, PreReviewRecordsDetailTemplate preReviewRecordsDetailTemplate) { + return super.exportXls(request, preReviewRecordsDetailTemplate, PreReviewRecordsDetailTemplate.class, "办事预审记录上传资料表"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, PreReviewRecordsDetailTemplate.class); + } + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/entity/PreReviewRecordsDetailTemplate.java b/service-management-system/src/main/java/org/jeecg/modules/ai/entity/PreReviewRecordsDetailTemplate.java new file mode 100644 index 0000000..0d0d724 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/entity/PreReviewRecordsDetailTemplate.java @@ -0,0 +1,66 @@ +package org.jeecg.modules.ai.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 办事预审记录上传资料表 + * @Author: jeecg-boot + * @Date: 2023-12-03 + * @Version: V1.0 + */ +@Data +@TableName("pre_review_records_detail_template") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="pre_review_records_detail_template对象", description="办事预审记录上传资料表") +public class PreReviewRecordsDetailTemplate implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private java.lang.String id; + /**预审记录详情id*/ + @Excel(name = "预审记录详情id", width = 15) + @ApiModelProperty(value = "预审记录详情id") + private java.lang.String recordDetailId; + /**材料编码*/ + @Excel(name = "材料编码", width = 15) + @ApiModelProperty(value = "材料编码") + private java.lang.String materialCode; + /**预审事项编码*/ + @Excel(name = "预审事项编码", width = 15) + @ApiModelProperty(value = "预审事项编码") + private java.lang.String eventCode; + /**模板id*/ + @Excel(name = "模板id", width = 15) + @ApiModelProperty(value = "模板id") + private java.lang.String templateId; + /**上传材料地址*/ + @Excel(name = "上传材料地址", width = 15) + @ApiModelProperty(value = "上传材料地址") + private java.lang.String materiaUrl; + /**ocr识别结果*/ + @Excel(name = "ocr识别结果", width = 15) + @ApiModelProperty(value = "ocr识别结果") + private java.lang.String ocrResult; + /**预审结果*/ + @Excel(name = "预审结果", width = 15) + @ApiModelProperty(value = "预审结果") + private java.lang.String reviewResult; +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/entity/YsDirectoryMaterialTemplate.java b/service-management-system/src/main/java/org/jeecg/modules/ai/entity/YsDirectoryMaterialTemplate.java new file mode 100644 index 0000000..ad6e9f2 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/entity/YsDirectoryMaterialTemplate.java @@ -0,0 +1,54 @@ +package org.jeecg.modules.ai.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 材料上传模板表 + * @Author: jeecg-boot + * @Date: 2023-12-02 + * @Version: V1.0 + */ +@Data +@TableName("ys_directory_material_template") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ys_directory_material_template对象", description="材料上传模板表") +public class YsDirectoryMaterialTemplate implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private java.lang.String id; + /**材料编码*/ + @Excel(name = "材料编码", width = 15) + @ApiModelProperty(value = "材料编码") + private java.lang.String materialCode; + /**模板id*/ + @Excel(name = "模板id", width = 15) + @ApiModelProperty(value = "模板id") + private java.lang.String templateId; + /**模板地址*/ + @Excel(name = "模板地址", width = 15) + @ApiModelProperty(value = "模板地址") + private java.lang.String templateUrl; + /**排序*/ + @Excel(name = "排序", width = 15) + @ApiModelProperty(value = "排序") + private java.lang.Integer sort; +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/PreReviewRecordsDetailTemplateMapper.java b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/PreReviewRecordsDetailTemplateMapper.java new file mode 100644 index 0000000..3b3d936 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/PreReviewRecordsDetailTemplateMapper.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.ai.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 办事预审记录上传资料表 + * @Author: jeecg-boot + * @Date: 2023-12-03 + * @Version: V1.0 + */ +public interface PreReviewRecordsDetailTemplateMapper extends BaseMapper { + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/YsDirectoryMaterialTemplateMapper.java b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/YsDirectoryMaterialTemplateMapper.java new file mode 100644 index 0000000..88b1add --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/YsDirectoryMaterialTemplateMapper.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.ai.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.ai.entity.YsDirectoryMaterialTemplate; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 材料上传模板表 + * @Author: jeecg-boot + * @Date: 2023-12-02 + * @Version: V1.0 + */ +public interface YsDirectoryMaterialTemplateMapper extends BaseMapper { + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailMapper.xml b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailMapper.xml index 9bda384..d321cfc 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailMapper.xml +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailMapper.xml @@ -5,12 +5,13 @@ + - a.id,b.material_name,a.review_result,a.materia_url,a.create_time + a.id,b.material_name,a.review_result,a.materia_url,a.create_time,a.material_code diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailTemplateMapper.xml b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailTemplateMapper.xml new file mode 100644 index 0000000..c73e8c1 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/PreReviewRecordsDetailTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/YsDirectoryMaterialTemplateMapper.xml b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/YsDirectoryMaterialTemplateMapper.xml new file mode 100644 index 0000000..0a0146b --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/mapper/xml/YsDirectoryMaterialTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreExaminationMattersFieldService.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreExaminationMattersFieldService.java index 4e58065..916ddeb 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreExaminationMattersFieldService.java +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreExaminationMattersFieldService.java @@ -29,4 +29,11 @@ public interface IPreExaminationMattersFieldService extends IService getSubmittedMaterialList(String eventCode,String userId); + + /** + * 本地文件上传 + * @param mf 文件 + * @param bizPath 自定义路径 + * @return + */ + public String uploadLocal(MultipartFile mf,String bizPath); } diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreReviewRecordsDetailTemplateService.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreReviewRecordsDetailTemplateService.java new file mode 100644 index 0000000..8560eac --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IPreReviewRecordsDetailTemplateService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.ai.service; + +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 办事预审记录上传资料表 + * @Author: jeecg-boot + * @Date: 2023-12-03 + * @Version: V1.0 + */ +public interface IPreReviewRecordsDetailTemplateService extends IService { + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialService.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialService.java index a003c63..6432e7c 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialService.java +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialService.java @@ -12,4 +12,12 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface IYsDirectoryMaterialService extends IService { + + /** + * 根据识别结果,判断预审是否通过 + * @param materialCode + * @param ocrResult + * @return + */ + public String getReviewResult(String materialCode,String ocrResult); } diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialTemplateService.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialTemplateService.java new file mode 100644 index 0000000..11fa4ba --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/IYsDirectoryMaterialTemplateService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.ai.service; + +import org.jeecg.modules.ai.entity.YsDirectoryMaterialTemplate; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 材料上传模板表 + * @Author: jeecg-boot + * @Date: 2023-12-02 + * @Version: V1.0 + */ +public interface IYsDirectoryMaterialTemplateService extends IService { + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreExaminationMattersFieldServiceImpl.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreExaminationMattersFieldServiceImpl.java index d0be5e6..70c19fc 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreExaminationMattersFieldServiceImpl.java +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreExaminationMattersFieldServiceImpl.java @@ -1,19 +1,29 @@ package org.jeecg.modules.ai.service.impl; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import javax.annotation.Resource; import org.jeecg.modules.ai.entity.PreExaminationMattersField; import org.jeecg.modules.ai.entity.PreReviewMaterial; +import org.jeecg.modules.ai.entity.PreReviewRecords; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetail; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; import org.jeecg.modules.ai.mapper.PreExaminationMattersFieldMapper; import org.jeecg.modules.ai.mapper.PreReviewMaterialMapper; +import org.jeecg.modules.ai.mapper.PreReviewRecordsMapper; import org.jeecg.modules.ai.qo.PreExaminationMattersFieldQuery; +import org.jeecg.modules.ai.qo.PreReviewRecordsDetailQuery; import org.jeecg.modules.ai.service.IPreExaminationMattersFieldService; +import org.jeecg.modules.ai.service.IPreReviewRecordsDetailService; +import org.jeecg.modules.ai.service.IPreReviewRecordsDetailTemplateService; +import org.jeecg.modules.ai.service.IPreReviewRecordsService; import org.jeecg.modules.ai.vo.PreExaminationMattersFieldVo; import org.jeecg.modules.ai.vo.PreReviewMaterialVo; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONArray; @@ -36,6 +46,12 @@ public class PreExaminationMattersFieldServiceImpl extends ServiceImpl listFile = preExaminationMattersFieldMapper.selectByEventCode(preReviewRecords.getEventCode()); + //获取识别结果 + for(PreExaminationMattersField field:listFile) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PreReviewRecordsDetail::getEventCode, field.getEventCode()); + queryWrapper.eq(PreReviewRecordsDetail::getMaterialCode, field.getMaterialCode()); + queryWrapper.eq(PreReviewRecordsDetail::getReviewRecordsId, reviewRecordId); + PreReviewRecordsDetail detail = iPreReviewRecordsDetailService.getOne(queryWrapper); + + result.put(field.getFieldName(), ""); + + LambdaQueryWrapper queryWrapperTemplate = new LambdaQueryWrapper<>(); + queryWrapperTemplate.eq(PreReviewRecordsDetailTemplate::getRecordDetailId, detail.getId()); + queryWrapperTemplate.eq(PreReviewRecordsDetailTemplate::getMaterialCode, detail.getMaterialCode()); + List listPreReviewRecordsDetailTemplate = iPreReviewRecordsDetailTemplateService.list(queryWrapperTemplate); + for(PreReviewRecordsDetailTemplate template:listPreReviewRecordsDetailTemplate) { + JSONObject jsonObject = JSONObject.parseObject(template.getOcrResult()); + Iterator keys = jsonObject.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + if(field.getFieldCode().equals(key)) { + result.put(field.getFieldName(), jsonObject.getString(key)); + break; + } + } + } + } + return result.toString(); + } } diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailServiceImpl.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailServiceImpl.java index cf625b4..1778455 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailServiceImpl.java +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailServiceImpl.java @@ -1,17 +1,27 @@ package org.jeecg.modules.ai.service.impl; +import java.io.File; +import java.io.IOException; import java.util.List; import javax.annotation.Resource; +import org.jeecg.common.util.CommonUtils; +import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.ai.entity.PreReviewRecordsDetail; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; import org.jeecg.modules.ai.mapper.PreReviewRecordsDetailMapper; import org.jeecg.modules.ai.qo.PreReviewRecordsDetailQuery; import org.jeecg.modules.ai.service.IPreReviewRecordsDetailService; +import org.jeecg.modules.ai.service.IPreReviewRecordsDetailTemplateService; import org.jeecg.modules.ai.vo.PreReviewRecordsDetailVo; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -27,6 +37,10 @@ public class PreReviewRecordsDetailServiceImpl extends ServiceImpl list = preReviewRecordsDetailMapper.getPreReviewRecordsDetailList(query); + for(PreReviewRecordsDetailVo vo:list) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PreReviewRecordsDetailTemplate::getRecordDetailId, vo.getId()); + queryWrapper.eq(PreReviewRecordsDetailTemplate::getMaterialCode, vo.getMaterialCode()); + List listPreReviewRecordsDetailTemplate = iPreReviewRecordsDetailTemplateService.list(queryWrapper); + vo.setListPreReviewRecordsDetailTemplate(listPreReviewRecordsDetailTemplate); + } + return list; + } + + /** + * 本地文件上传 + * @param mf 文件 + * @param bizPath 自定义路径 + * @return + */ + @Override + public String uploadLocal(MultipartFile mf,String bizPath){ + try { + String ctxPath = uploadpath; + String fileName = null; + File file = new File(ctxPath + File.separator + bizPath + File.separator ); + if (!file.exists()) { + file.mkdirs();// 创建文件根目录 + } + String orgName = mf.getOriginalFilename();// 获取文件名 + orgName = CommonUtils.getFileName(orgName); + if(orgName.indexOf(".")!=-1){ + fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(".")); + }else{ + fileName = orgName+ "_" + System.currentTimeMillis(); + } + String savePath = file.getPath() + File.separator + fileName; + File savefile = new File(savePath); + FileCopyUtils.copy(mf.getBytes(), savefile); + String dbpath = null; + if(oConvertUtils.isNotEmpty(bizPath)){ + dbpath = bizPath + File.separator + fileName; + }else{ + dbpath = fileName; + } + if (dbpath.contains("\\")) { + dbpath = dbpath.replace("\\", "/"); + } + return dbpath; + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return ""; + } + + public String getOcrResutl() { + + return null; } } diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailTemplateServiceImpl.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailTemplateServiceImpl.java new file mode 100644 index 0000000..e4c54f9 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsDetailTemplateServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.ai.service.impl; + +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; +import org.jeecg.modules.ai.mapper.PreReviewRecordsDetailTemplateMapper; +import org.jeecg.modules.ai.service.IPreReviewRecordsDetailTemplateService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 办事预审记录上传资料表 + * @Author: jeecg-boot + * @Date: 2023-12-03 + * @Version: V1.0 + */ +@Service +public class PreReviewRecordsDetailTemplateServiceImpl extends ServiceImpl implements IPreReviewRecordsDetailTemplateService { + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsServiceImpl.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsServiceImpl.java index b63f652..53cb309 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsServiceImpl.java +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/PreReviewRecordsServiceImpl.java @@ -17,11 +17,13 @@ import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.ai.entity.PreExaminationMatters; import org.jeecg.modules.ai.entity.PreReviewRecords; import org.jeecg.modules.ai.entity.PreReviewRecordsDetail; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; import org.jeecg.modules.ai.entity.YsDirectory; import org.jeecg.modules.ai.entity.YsDirectoryMaterial; import org.jeecg.modules.ai.mapper.PreExaminationMattersMapper; import org.jeecg.modules.ai.mapper.PreReviewMaterialMapper; import org.jeecg.modules.ai.mapper.PreReviewRecordsDetailMapper; +import org.jeecg.modules.ai.mapper.PreReviewRecordsDetailTemplateMapper; import org.jeecg.modules.ai.mapper.PreReviewRecordsMapper; import org.jeecg.modules.ai.mapper.YsDirectoryMapper; import org.jeecg.modules.ai.qo.PreExaminationMattersQuery; @@ -68,6 +70,8 @@ public class PreReviewRecordsServiceImpl extends ServiceImpl implements IYsDirectoryMaterialService { + @Resource + private YsDirectoryMaterialMapper ysDirectoryMaterialMapper; + + + /** + * 根据识别结果,判断预审是否通过 + * @param materialCode + * @param ocrResult + * @return + */ + @Override + public String getReviewResult(String materialCode,String ocrResult) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(YsDirectoryMaterial::getMaterialCode, materialCode); + YsDirectoryMaterial ysDirectoryMaterial = ysDirectoryMaterialMapper.selectOne(queryWrapper); + + return "通过"; + } } diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/YsDirectoryMaterialTemplateServiceImpl.java b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/YsDirectoryMaterialTemplateServiceImpl.java new file mode 100644 index 0000000..42bdb9f --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/service/impl/YsDirectoryMaterialTemplateServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.ai.service.impl; + +import org.jeecg.modules.ai.entity.YsDirectoryMaterialTemplate; +import org.jeecg.modules.ai.mapper.YsDirectoryMaterialTemplateMapper; +import org.jeecg.modules.ai.service.IYsDirectoryMaterialTemplateService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 材料上传模板表 + * @Author: jeecg-boot + * @Date: 2023-12-02 + * @Version: V1.0 + */ +@Service +public class YsDirectoryMaterialTemplateServiceImpl extends ServiceImpl implements IYsDirectoryMaterialTemplateService { + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/ai/vo/PreReviewRecordsDetailVo.java b/service-management-system/src/main/java/org/jeecg/modules/ai/vo/PreReviewRecordsDetailVo.java index a196993..a4124ec 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/ai/vo/PreReviewRecordsDetailVo.java +++ b/service-management-system/src/main/java/org/jeecg/modules/ai/vo/PreReviewRecordsDetailVo.java @@ -1,7 +1,9 @@ package org.jeecg.modules.ai.vo; import java.util.Date; +import java.util.List; +import org.jeecg.modules.ai.entity.PreReviewRecordsDetailTemplate; import org.springframework.format.annotation.DateTimeFormat; import com.fasterxml.jackson.annotation.JsonFormat; @@ -13,10 +15,12 @@ public class PreReviewRecordsDetailVo { private String id; private String materialName; + private String materialCode; private String reviewResult; private String materiaUrl; @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm") private Date createTime; + private List listPreReviewRecordsDetailTemplate; } diff --git a/service-management-system/src/main/java/org/jeecg/modules/api/controller/AiAPIController.java b/service-management-system/src/main/java/org/jeecg/modules/api/controller/AiAPIController.java index e5ed394..0fd32b2 100644 --- a/service-management-system/src/main/java/org/jeecg/modules/api/controller/AiAPIController.java +++ b/service-management-system/src/main/java/org/jeecg/modules/api/controller/AiAPIController.java @@ -4,33 +4,45 @@ import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.CommonUtils; +import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.ai.entity.PreReviewRecords; import org.jeecg.modules.ai.entity.ReasonEvaluation; +import org.jeecg.modules.ai.entity.YsDirectoryMaterialTemplate; import org.jeecg.modules.ai.qo.PreExaminationMattersQuery; import org.jeecg.modules.ai.qo.PreReviewMaterialQuery; import org.jeecg.modules.ai.qo.PreReviewRecordsApiQuery; +import org.jeecg.modules.ai.service.IPreExaminationMattersFieldService; import org.jeecg.modules.ai.service.IPreExaminationMattersService; import org.jeecg.modules.ai.service.IPreReviewMaterialService; import org.jeecg.modules.ai.service.IPreReviewRecordsDetailService; import org.jeecg.modules.ai.service.IPreReviewRecordsService; import org.jeecg.modules.ai.service.IReasonEvaluationService; import org.jeecg.modules.ai.service.IRoomService; +import org.jeecg.modules.ai.service.IYsDirectoryMaterialService; +import org.jeecg.modules.ai.service.IYsDirectoryMaterialTemplateService; import org.jeecg.modules.ai.vo.PreExaminationMattersVo; import org.jeecg.modules.ai.vo.PreReviewMaterialVo; import org.jeecg.modules.ai.vo.PreReviewRecordsDetailVo; import org.jeecg.modules.system.entity.SysAnnouncement; import org.jeecg.modules.system.service.ISysAnnouncementService; +import org.jeecg.modules.system.util.RecognizeGeneralTextSolution; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -62,6 +74,12 @@ public class AiAPIController { private IRoomService iRoomService; @Autowired private ISysAnnouncementService iSysAnnouncementService; + @Autowired + private IPreExaminationMattersFieldService iPreExaminationMattersFieldService; + @Autowired + private IYsDirectoryMaterialTemplateService iYsDirectoryMaterialTemplateService; + @Autowired + private IYsDirectoryMaterialService iYsDirectoryMaterialService; /** * 获取已授权预审事项 @@ -126,14 +144,47 @@ public class AiAPIController { return Result.OK("评价成功"); } + + /** + * 获取资料上传模板信息 + * @param reviewInfo + * @return + */ + @GetMapping(value = "/getMaterialTemplate") + public Result getMaterialTemplate(@RequestParam(name = "materialCode", required = true) String materialCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(YsDirectoryMaterialTemplate::getMaterialCode, materialCode); + List listYsDirectoryMaterialTemplate = iYsDirectoryMaterialTemplateService.list(queryWrapper); + return Result.OK(listYsDirectoryMaterialTemplate); + } + + /** * 获取OCR识别结果 * @param reviewInfo * @return */ @GetMapping(value = "/getOCRResult") - public Result getOCRResult(@RequestParam(name = "materialUrl", required = true) String materialUrl) { - return Result.OK("设置成功"); + public Result getOCRResult(HttpServletRequest request, HttpServletResponse response) { + JSONObject json = new JSONObject(); + String templateId = request.getParameter("templateId"); + String materialCode = request.getParameter("materialCode"); + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象 + String savePath = preReviewRecordsDetailService.uploadLocal(file, "upload"); + if(oConvertUtils.isNotEmpty(savePath)){ + //调用接口识别 + String ocrResult = RecognizeGeneralTextSolution.recognizeGeneralTextSolution(savePath, templateId); + //根据规则判断预审结果 + String reviewResult = iYsDirectoryMaterialService.getReviewResult(materialCode, ocrResult); + json.put("imagePath", savePath); + json.put("ocrResult", ocrResult); + json.put("reviewResult", reviewResult); + return Result.OK(json.toString()); + }else { + return Result.error("上传失败"); + } } /** @@ -143,7 +194,7 @@ public class AiAPIController { */ @PostMapping(value = "/echoForm") public Result echoForm(@RequestParam(name = "reviewRecordId", required = true) String reviewRecordId) { - return Result.OK("设置成功"); + return Result.OK(iPreExaminationMattersFieldService.echoForm(reviewRecordId)); } /** diff --git a/service-management-system/src/main/java/org/jeecg/modules/system/util/BaiduUtil.java b/service-management-system/src/main/java/org/jeecg/modules/system/util/BaiduUtil.java new file mode 100644 index 0000000..332c2d8 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/system/util/BaiduUtil.java @@ -0,0 +1,91 @@ +package org.jeecg.modules.system.util; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +import javax.imageio.stream.FileImageInputStream; + +import org.json.JSONObject; + +import com.baidu.aip.ocr.AipOcr; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class BaiduUtil { + + public static final String APP_ID = "23890069"; + public static final String API_KEY = "ZOLqyLPBF4I0pejNpZzvzf35"; + public static final String SECRET_KEY = "VR8pmnk997sDVBkMXusTDsrUksCAbb4Z"; + + public static AipOcr client = null; + + static{ + client = new AipOcr(APP_ID, API_KEY, SECRET_KEY); + } + + /** + * 印章识别 + * @param imgUrl 本地图片地址 + * @return + * { + "result":[ + { + "major":{ + "probability":0.9989657998, + "words":"德阳玺合印章有限公司送检样章" + }, + "minor":[ + + ], + "probability":0.9393941164, + "location":{ + "top":30, + "left":58, + "width":578, + "height":577 + }, + "type":"circle" + } + ], + "log_id":1730486846918069925, + "result_num":1 + } + */ + public static JSONObject seal(String imgUrl) { + byte[] image = readImageFile(imgUrl); + // 调用印章识别 + JSONObject fileResult = client.seal(image); + log.info("-----------百度识别印章fileResult----------"+fileResult); + return fileResult; + } + + public static void main(String args[]) { + seal("D:\\Download\\860237437.jpg"); + } + + public static byte[] readImageFile(String path) { + byte[] data = null; + FileImageInputStream input = null; + try { + input = new FileImageInputStream(new File(path)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + data = output.toByteArray(); + output.close(); + input.close(); + } catch (FileNotFoundException ex1) { + ex1.printStackTrace(); + } catch (IOException ex1) { + ex1.printStackTrace(); + } + return data; + } + +} diff --git a/service-management-system/src/main/java/org/jeecg/modules/system/util/RecognizeGeneralTextSolution.java b/service-management-system/src/main/java/org/jeecg/modules/system/util/RecognizeGeneralTextSolution.java new file mode 100644 index 0000000..81c9188 --- /dev/null +++ b/service-management-system/src/main/java/org/jeecg/modules/system/util/RecognizeGeneralTextSolution.java @@ -0,0 +1,98 @@ +package org.jeecg.modules.system.util; + +import com.huaweicloud.sdk.core.auth.ICredential; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Base64; + +import javax.imageio.stream.FileImageInputStream; + +import com.huaweicloud.sdk.core.auth.BasicCredentials; +import com.huaweicloud.sdk.core.exception.ConnectionException; +import com.huaweicloud.sdk.core.exception.RequestTimeoutException; +import com.huaweicloud.sdk.core.exception.ServiceResponseException; +import com.huaweicloud.sdk.core.http.HttpConfig; +import com.huaweicloud.sdk.ocr.v1.region.OcrRegion; + +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +import com.huaweicloud.sdk.ocr.v1.*; +import com.huaweicloud.sdk.ocr.v1.model.*; + +/** + * 华为文字识别 + * + * @author w + * + */ +public class RecognizeGeneralTextSolution { + + public static final String CLOUD_SDK_AK = "X4MNF4GUFECVS2JKQS8L"; + public static final String CLOUD_SDK_SK = "7hMUh5lgdpPMUQQSRc6tM6MNsMPx1Cgsnrv1zE67"; + + /** + * 识别文字 + * + * @param imgUrl + * @return + */ + public static String recognizeGeneralTextSolution(String imgUrl,String classifierId) { + + ICredential auth = new BasicCredentials() + .withAk(CLOUD_SDK_AK) + .withSk(CLOUD_SDK_SK) + .withProjectId("7c9b49b201734164a4f1efef5e1e46e0"); + + OcrClient client = OcrClient.newBuilder() + .withCredential(auth) + .withRegion(OcrRegion.valueOf("cn-north-4")) + .build(); + + RecognizeCustomTemplateRequest request = new RecognizeCustomTemplateRequest(); + CustomTemplateRequestBody body = new CustomTemplateRequestBody(); + body.setClassifierId(classifierId); + body.setImage(readImageFile(imgUrl)); + request.withBody(body); + try { + RecognizeCustomTemplateResponse response = client.recognizeCustomTemplate(request); + return response.toString(); + } catch (ConnectionException e) { + e.printStackTrace(); + } catch (RequestTimeoutException e) { + e.printStackTrace(); + } catch (ServiceResponseException e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String args[]) throws Exception { + + recognizeGeneralTextSolution("D:\\Download\\178171512_1099943536_259_194.jpg","b9b1de0e-6601-11ee-88fb-0255ac100240"); + } + + public static String readImageFile(String path) { + String base64 = null; + try { + File imageFile = new File(path); + FileInputStream fileInputStream = new FileInputStream(imageFile); + byte[] imageBytes = new byte[(int) imageFile.length()]; + fileInputStream.read(imageBytes); + fileInputStream.close(); + base64 = Base64.getEncoder().encodeToString(imageBytes); + } catch (FileNotFoundException ex1) { + ex1.printStackTrace(); + } catch (IOException ex1) { + ex1.printStackTrace(); + } + return base64; + } +} \ No newline at end of file