Merge remote-tracking branch 'origin/beta-prop-all' into beta-prop-all

# Conflicts:
#	jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java
beta-prop-all
dongxiaoke 6 months ago
commit b6b2acced5
  1. 6
      jianshui-admin/pom.xml
  2. 40
      jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java
  3. 12
      jianshui-admin/src/main/resources/application-dev.yml
  4. 5
      jianshui-admin/src/main/resources/application.yml
  5. 11
      jianshui-common/src/main/java/com/jianshui/common/constant/Constants.java
  6. 5
      jianshui-invoice/src/main/java/com/jianshui/invoice/mapper/InvoiceFileMapper.java
  7. 2
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiServiceImpl.java
  8. 43
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiV6ServiceImpl.java
  9. 77
      jianshui-invoice/src/main/java/com/jianshui/invoice/task/MinioTask.java
  10. 6
      jianshui-invoice/src/main/java/com/jianshui/invoice/utils/ApiRequestUtils.java
  11. 9
      jianshui-invoice/src/main/resources/mapper/invoice/InvoiceFileMapper.xml
  12. 5
      jianshui-storage/pom.xml
  13. 31
      jianshui-storage/src/main/java/com/jianshui/storage/minio/config/MinioConfig.java
  14. 215
      jianshui-storage/src/main/java/com/jianshui/storage/minio/util/MinioUtil.java
  15. 93
      jianshui-storage/src/main/java/com/jianshui/storage/service/impl/MinioStorageService.java
  16. 4
      jianshui-ui/vue.config.js

@ -30,6 +30,12 @@
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.0</version>
</dependency>
<!-- swagger3-->
<!--<dependency>
<groupId>io.springfox</groupId>

@ -3,7 +3,6 @@ package com.jianshui.api.controller.http.invoice.v1;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.codec.Base64Encoder;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
@ -13,19 +12,20 @@ import com.dxhy.order.protocol.invoke.DxhyInterfaceResponse;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.jianshui.common.constant.Constants;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.enums.ErrorCode;
import com.jianshui.common.exception.jianshui.JianshuiParamErrorException;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.http.HttpHelper;
import com.jianshui.common.utils.spring.SpringUtils;
import com.jianshui.framework.manager.AsyncManager;
import com.jianshui.invoice.domain.*;
import com.jianshui.invoice.domain.ele.EleNewMessage;
import com.jianshui.invoice.domain.ele.FindRedInfoDTO;
import com.jianshui.invoice.mapper.InvoiceBackMapper;
import com.jianshui.invoice.mapper.InvoiceFileMapper;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.invoice.service.impl.api.ElephantInvoiceApiV6ServiceImpl;
import com.jianshui.invoice.task.AddInvoiceBatchTask;
import com.jianshui.platform.dto.InvoiceAdd.BillInfoPDTO;
@ -39,6 +39,9 @@ import com.jianshui.invoice.factory.IInvoiceServiceFactory;
import com.jianshui.invoice.service.IInvoiceResponseService;
import com.jianshui.invoice.utils.ApiRequestUtils;
import com.jianshui.platform.service.InvoiceAddPService;
import com.jianshui.storage.domain.StorageUrlDTO;
import com.jianshui.storage.factory.StorageFactory;
import com.jianshui.storage.service.StorageBaseAbstractService;
import com.jianshui.system.service.ICompanyserviceService;
import com.jianshui.system.service.IServiceManageService;
import io.swagger.annotations.*;
@ -95,7 +98,7 @@ public class InvoiceController {
private InvoiceFileMapper invoiceFileMapper;
@Autowired
private InvoiceMapper invoiceMapper;
private StorageFactory storageFactory;
/**
@ -407,27 +410,13 @@ public class InvoiceController {
return;
}
InvoiceFile invoiceFile = invoiceFileMapper.selectInvoiceFileById(id);
if (BeanUtil.isEmpty(invoiceFile) || StrUtil.isEmpty(invoiceFile.getFileContent())) {
if (BeanUtil.isEmpty(invoiceFile)) {
return;
}
if (StringUtils.isNotBlank(invoiceFile.getFileContent())){
String fileName = invoiceFile.getFileName();
String content = invoiceFile.getFileContent();
//企业名称_发票号码_开票日期.pdf
try {
String fphm = invoiceFile.getFphm();
if(StrUtil.isNotEmpty(fphm)){
Invoice invoice = invoiceMapper.selectByFphm(fphm);
if(invoice != null){
String buyerName = invoice.getBuyerName();
String kprq = DateUtil.format(invoice.getKprq(),"yyyy-MM-dd");
fileName = buyerName + "_" + fphm + "_" + kprq;
}
}
} catch (Exception e) {
log.info("下载名称组装错误,{}",e.toString());
}
try {
byte[] buffer = Base64Decoder.decode(content); // 将文件流字符串转换为字节数组
response.reset();
@ -442,6 +431,19 @@ public class InvoiceController {
} catch (IOException ex) {
ex.printStackTrace();
}
}else if (StringUtils.isBlank(invoiceFile.getFileContent()) && invoiceFile.getFileName().contains(Constants.DB_SAVE)){
String fileUrl = invoiceFile.getFileName();
StorageBaseAbstractService storageInstance = storageFactory.getStorageInstance(Constants.MINIO);
StorageUrlDTO storageUrlDTO = new StorageUrlDTO();
storageUrlDTO.setStoragePath(fileUrl);
storageUrlDTO.setServiceProvider(Constants.MINIO);
storageUrlDTO.setContentType(Constants.APPLICATION_PDF);
AjaxResult file = storageInstance.getFile(storageUrlDTO);
if (file.isSuccess()){
response.sendRedirect((String) file.getData());
}
}
}

@ -9,12 +9,12 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:mysql://81.70.100.158:3306/jianshui_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://127.0.0.1:3306/jianshui_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# url: jdbc:mysql://58.87.71.213:3306/bid_jianshui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# url: jdbc:mysql://58.87.71.213:3306/jianshui_dev_new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: jianshui_dev
username: root
# username: bid_jianshui
password: tHsWetXEjYFJsdAC
password: 1893
# password: ts3D5zYkFzcxbrPc
# password: kaMSddCzO54qtIg0I9N8iKA2iSFrm8YdBK55Zxdjxy8Zuo7+GoRcZHUOI9UmY1JtrMP6wA//Bftj8oq8zRbbPA==
# 从库数据源
@ -107,8 +107,10 @@ ele_url_qz: https://openapi.zncspt.com/api/authen/token
invoice:
file:
save:
# 文件上传方式 0:数据库 1:oss 2:本地
type: 1
# 文件上传方式 0:数据库 1:oss 2:本地 3:minio
type: 3
minio:
url: http://127.0.0.1:8081/file/query/
# 自主授权相关配置
autonomous:
authorization:

@ -125,3 +125,8 @@ billing:
kpje: 10
xmmc: 维修费
invoiceType: 82
minio:
endpoint: http://127.0.0.1:9005
bucketName: test
accessKey: admin
secretKey: admin123

@ -36,6 +36,8 @@ public class Constants {
*/
public static final String SUCCESS = "0";
public static final String STRING_SUCCESS = "success";
/**
* 通用失败标识
*/
@ -183,6 +185,8 @@ public class Constants {
public static final String LOCAL = "local";
public static final String MINIO = "minio";
public static final String DATA = "data";
public static final String FILE_URL = "file_url";
@ -190,6 +194,7 @@ public class Constants {
public static final String INVOICE_FILE_SAVE_PATH = "invoice.file.save.path";
public static final String INVOICE_FILE_SAVE_TYPE = "invoice.file.save.type";
public static final String INVOICE_FILE_MINIO_URL = "invoice.file.minio.url";
public static final String ESCAPE = "/";
public static final String QD_LOGIN = "http://zzsq.jcsk100.com/login/getLogin2";
@ -199,5 +204,11 @@ public class Constants {
public static final String OBTAINLOGIN_STATUS = "http://zzsq.jcsk100.com/login/obtainLoginStatus";
public static final String DATE_FORAMAT_ONE = "/yyyy/MM/";
public static final String APPLICATION_PDF = "application/pdf";
public static final String APPLICATION_OFD = "application/octet-stream";
public static final String APPLICATION_XML = "application/xml";
public static final String STRING_BLANK = "";
public static final String DB_SAVE = "/dbSave/";
}

@ -2,6 +2,7 @@ package com.jianshui.invoice.mapper;
import java.util.List;
import com.jianshui.invoice.domain.InvoiceFile;
import org.apache.ibatis.annotations.Param;
/**
* 发票URL存储Mapper接口
@ -58,4 +59,8 @@ public interface InvoiceFileMapper
* @return 结果
*/
public int deleteInvoiceFileByIds(String[] ids);
List<InvoiceFile> selectInvoiceFileListWithContentNotEmpty();
int updateFileContent(@Param("id") String id, @Param("fileName") String fileName);
}

@ -1401,7 +1401,7 @@ public class ElephantInvoiceApiServiceImpl implements IInvoiceApiService {
// 判断一下是否是需要的dto
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getBillNo())) {
// if (!StringUtils.equals(tempDTO.getOutTradeOrderno(), downloadRedInfoDTO.getBillNo())) {
if (!((StringUtils.equals(tempDTO.getOriginFpdm(), redInfoResult.getOriginFpdm())) && (StringUtils.equals(tempDTO.getOriginFphm(), redInfoResult.getOriginFphm())))) { // 狗比大象,他的申请单号是他们返回的,诺诺是我们上传的,我们只能用他们返回的申请单号
if (!((StringUtils.equals(tempDTO.getOriginFpdm(), redInfoResult.getOriginFpdm())) && (StringUtils.equals(tempDTO.getOriginFphm(), redInfoResult.getOriginFphm())))) { // 大象,他的申请单号是他们返回的,诺诺是我们上传的,我们只能用他们返回的申请单号
continue;
} else {
page = 1000;

@ -5,6 +5,7 @@ import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
@ -58,7 +59,9 @@ import com.jianshui.invoice.utils.elephant.ElephantUtils;
import com.jianshui.queue.utils.RedisQueueUtil;
import com.jianshui.storage.domain.StorageUrlDTO;
import com.jianshui.storage.factory.StorageFactory;
import com.jianshui.storage.minio.util.MinioUtil;
import com.jianshui.storage.service.IStorageService;
import com.jianshui.storage.service.StorageBaseAbstractService;
import com.jianshui.system.domain.CompanyserviceProp;
import com.jianshui.system.domain.InvoiceAllApiLog;
import com.jianshui.system.mapper.CompanyserviceMapper;
@ -76,6 +79,7 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
@ -701,6 +705,8 @@ public class ElephantInvoiceApiV6ServiceImpl implements IInvoiceApiService {
//配置文件存储类型2为本地存储
} else if (Constants.STRING_2.equals(type)) {
saveFileUseLocal(invoice, ddfpxx);
}else if (Constants.STRING_3.equals(type)){
saveFileUseMinio(invoice,ddfpxx,companyservice);
}
}
}
@ -798,6 +804,40 @@ public class ElephantInvoiceApiV6ServiceImpl implements IInvoiceApiService {
return response;
}
private void saveFileUseMinio(Invoice invoice, DDFPXX ddfpxx,Companyservice companyservice) {
byte[] pdfBytes = Base64.decode(ddfpxx.getPDFZJL());
Date kprq = invoice.getKprq();
if (kprq == null){
kprq = new Date();
}
String format = DateUtil.format(kprq, Constants.DATE_FORAMAT_ONE);
String fileName = format.concat(invoice.getFphm()).concat(Constants.POINT).concat(ddfpxx.getZJLLX().toLowerCase());
try {
StorageBaseAbstractService storageInstance = storageFactory.getStorageInstance(Constants.MINIO);
//上传文件
AjaxResult upload = storageInstance.upload(pdfBytes, fileName);
if (upload.isSuccess()){
String dto = JSON.toJSONString(upload.getData());
String url = SpringUtils.getBean(Environment.class).getProperty(Constants.INVOICE_FILE_MINIO_URL).concat(Base64.encode(dto));
log.info("minio上传文件成功,url:{}", url);
invoice.setInvoicePdfUrl(url);
invoice.setInvoiceFileStorage(Constants.MINIO);
if (StringUtils.equals(ddfpxx.getZJLLX(), Constants.OFD_UPCASE)) {
invoice.setcOfdUrl(url);
}
}else {
log.error("minio上传文件失败改用数据库");
saveFileUseDb(invoice,IdUtils.randomUUID(),invoice.getFphm(),companyservice, ddfpxx);
}
} catch (Exception e) {
log.error("minio上传文件失败", e);
saveFileUseDb(invoice,IdUtils.randomUUID(),invoice.getFphm(),companyservice, ddfpxx);
}
}
private void saveFileUseLocal(Invoice invoice, DDFPXX ddfpxx) {
try {
@ -1454,7 +1494,6 @@ public class ElephantInvoiceApiV6ServiceImpl implements IInvoiceApiService {
String type = environment.getProperty(Constants.INVOICE_FILE_SAVE_TYPE);
//配置文件存储类型0为数据库存储
if (Constants.STRING_0.equals(type)) {
saveFileUseDb(invoice, fileId, fileName, companyservice, ddfpxx);
//配置文件存储类型1为oss存储
@ -1463,6 +1502,8 @@ public class ElephantInvoiceApiV6ServiceImpl implements IInvoiceApiService {
//配置文件存储类型2为本地存储
} else if (Constants.STRING_2.equals(type)) {
saveFileUseLocal(invoice, ddfpxx);
}else if (Constants.STRING_3.equals(type)){
saveFileUseMinio(invoice,ddfpxx,companyservice);
}
}
}

@ -0,0 +1,77 @@
package com.jianshui.invoice.task;
import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jianshui.common.constant.Constants;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.exception.jianshui.JianshiSystemErrorException;
import com.jianshui.invoice.domain.InvoiceFile;
import com.jianshui.invoice.mapper.InvoiceFileMapper;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.storage.factory.StorageFactory;
import com.jianshui.storage.service.StorageBaseAbstractService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component("minioTask")
public class MinioTask {
@Autowired
private InvoiceFileMapper invoiceFileMapper;
@Autowired
private InvoiceMapper invoiceMapper;
@Autowired
private StorageFactory storageFactory;
public void dbInvoiceFileToMinioTask(Integer pageSize,Boolean isContinue) {
try {
StorageBaseAbstractService storageInstance = storageFactory.getStorageInstance(Constants.MINIO);
//是否继续
boolean hasNext = true;
//页码
int pageNum = Constants.INT_1;
while (hasNext) {
int count = Constants.INT_0;
PageHelper.startPage(pageNum, pageSize);
List<InvoiceFile> invoiceFileList = invoiceFileMapper.selectInvoiceFileListWithContentNotEmpty();
if (CollectionUtils.isNotEmpty(invoiceFileList)){
for (InvoiceFile invoiceFile : invoiceFileList) {
String fileContent = invoiceFile.getFileContent();
if (StrUtil.isNotEmpty(fileContent)){
try {
byte[] buffer = Base64Decoder.decode(fileContent);
String fileName = Constants.DB_SAVE.concat(invoiceFile.getFileName()).concat(Constants.POINT).concat(Constants.PDF);
AjaxResult upload = storageInstance.upload(buffer, fileName);
if (upload.isSuccess()){
count += invoiceFileMapper.updateFileContent(invoiceFile.getId(),fileName);
}
} catch (Exception e) {
log.error("定时任务文件上传失败发票号码:{}",invoiceFile.getFphm(),e);
}
}
}
}
if (!isContinue){
break;
}
PageInfo<InvoiceFile> invoiceFilePageInfo = new PageInfo<>(invoiceFileList);
hasNext = invoiceFilePageInfo.isHasNextPage();
pageNum = count >Constants.INT_0?pageNum:invoiceFilePageInfo.getNextPage();
}
} catch (JianshiSystemErrorException e) {
log.info("minio初始化失败",e);
}
}
}

@ -7,12 +7,14 @@ import com.jianshui.common.enums.ErrorCode;
import com.jianshui.common.exception.jianshui.JianshuiParamErrorException;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.spring.SpringUtils;
import com.jianshui.common.utils.uuid.UUID;
import com.jianshui.invoice.domain.BillInfo;
import com.jianshui.invoice.domain.dto.HXResponse;
import com.jianshui.invoice.service.IInvoiceApiService;
import com.jianshui.system.mapper.CompanyserviceMapper;
import com.jianshui.system.mapper.ServiceManageMapper;
import com.jianshui.system.service.IServiceManageService;
import nuonuo.open.sdk.NNOpenSDK;
import javax.servlet.http.HttpServletRequest;
@ -56,7 +58,7 @@ public class ApiRequestUtils {
}
}
// 坑比诺诺2.0
// 诺诺2.0
sellertax = request.getHeader("taxNum");
if (StringUtils.isNotEmpty(sellertax)) {
CompanyserviceMapper companyserviceMapper = SpringUtils.getBean(CompanyserviceMapper.class);
@ -66,7 +68,7 @@ public class ApiRequestUtils {
}
}
// 大坑比诺诺2.0
// 诺诺2.0
sellertax = request.getHeader("taxnum");
if (StringUtils.isNotEmpty(sellertax)) {
CompanyserviceMapper companyserviceMapper = SpringUtils.getBean(CompanyserviceMapper.class);

@ -84,4 +84,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<select id="selectInvoiceFileListWithContentNotEmpty" resultMap="InvoiceFileResult">
<include refid="selectInvoiceFileVo"/>
where file_content is not null and file_content != ''
</select>
<update id="updateFileContent">
update invoice_file set file_name = #{fileName} , file_content = '' where id = #{id}
</update>
</mapper>

@ -37,6 +37,11 @@
<groupId>com.jianshui</groupId>
<artifactId>jianshui-framework</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.0</version>
</dependency>
</dependencies>
<properties>

@ -0,0 +1,31 @@
package com.jianshui.storage.minio.config;
import com.jianshui.common.constant.Constants;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
@ConditionalOnProperty(name = Constants.INVOICE_FILE_SAVE_TYPE, havingValue = Constants.STRING_3)
public class MinioConfig {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
@Bean
@ConditionalOnProperty(name = Constants.INVOICE_FILE_SAVE_TYPE, havingValue = Constants.STRING_3)
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}

@ -0,0 +1,215 @@
package com.jianshui.storage.minio.util;
import cn.hutool.core.date.DateUtil;
import com.jianshui.storage.minio.config.MinioConfig;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Slf4j
@Component
@ConditionalOnBean({MinioClient.class})
public class MinioUtil {
@Autowired
private MinioConfig prop;
@Resource
private MinioClient minioClient;
/**
* 查看存储bucket是否存在
* @return boolean
*/
public Boolean bucketExists(String bucketName) {
Boolean found;
try {
found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
} catch (Exception e) {
log.error("查看minio存储bucket异常",e);
return false;
}
return found;
}
/**
* 创建存储bucket
* @return Boolean
*/
public Boolean makeBucket(String bucketName) {
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
log.error("minio创建bucket异常",e);
return false;
}
return true;
}
/**
* 删除存储bucket
* @return Boolean
*/
public Boolean removeBucket(String bucketName) {
try {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
log.error("minio删除bucket异常",e);
return false;
}
return true;
}
/**
* 获取全部bucket
*/
public List<Bucket> getAllBuckets() {
try {
List<Bucket> buckets = minioClient.listBuckets();
return buckets;
} catch (Exception e) {
log.error("minio获取所有bucket异常",e);
}
return null;
}
/**
* 文件上传
*
* @param inputStream 文件
* @return Boolean
*/
public boolean upload(InputStream inputStream,String fileName,long size,String contentType) {
try {
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(prop.getBucketName()).build());
if (!found){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(prop.getBucketName()).build());
}
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(prop.getBucketName()).object(fileName)
.stream(inputStream, size,-1).contentType(contentType).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
log.error("minio上传文件异常",e);
return false;
}
return true;
}
/**
* 预览图片
* @param fileName
* @return
*/
public String preview(String fileName){
// 查看文件地址
GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(prop.getBucketName()).object(fileName).method(Method.GET).build();
try {
String url = minioClient.getPresignedObjectUrl(build);
return url;
} catch (Exception e) {
log.error("minio生成预览url异常",e);
}
return null;
}
/**
* 文件下载
* @param fileName 文件名称
* @param res response
* @return Boolean
*/
public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(prop.getBucketName())
.object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)){
byte[] buf = new byte[1024];
int len;
try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
while ((len=response.read(buf))!=-1){
os.write(buf,0,len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
// 设置强制下载不打开
res.setContentType("application/pdf");
res.addHeader("Content-Disposition", "inline;fileName=" + fileName);
try (ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
log.error("minio下载文件异常",e);
}
}
/**
* 查看文件对象
* @return 存储bucket内文件对象信息
*/
public List<Item> listObjects() {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(prop.getBucketName()).build());
List<Item> items = new ArrayList<>();
try {
for (Result<Item> result : results) {
items.add(result.get());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return items;
}
/**
* 删除
* @param fileName
* @return
* @throws Exception
*/
public boolean remove(String fileName){
try {
minioClient.removeObject( RemoveObjectArgs.builder().bucket(prop.getBucketName()).object(fileName).build());
}catch (Exception e){
return false;
}
return true;
}
@SneakyThrows
public String downloadUrl(String fileName) {
GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(prop.getBucketName())
.object(fileName)
.expiry(60 * 60 * 24)
.build();
return minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);
}
}

@ -0,0 +1,93 @@
package com.jianshui.storage.service.impl;
import com.jianshui.common.constant.Constants;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.storage.domain.StorageUrlDTO;
import com.jianshui.storage.service.StorageBaseAbstractService;
import com.qcloud.cos.COSClient;
import io.minio.*;
import io.minio.http.Method;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
@Setter
@Slf4j
@Service("storage_minio")
@ConfigurationProperties(prefix = "minio")
@ConditionalOnProperty(name = Constants.INVOICE_FILE_SAVE_TYPE, havingValue = Constants.STRING_3)
public class MinioStorageService extends StorageBaseAbstractService {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
@Override
public AjaxResult init() {
this.storageInstance = MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
return AjaxResult.success();
}
@Override
public AjaxResult getFile(StorageUrlDTO storageUrlDTO) {
// 查看文件地址
String storagePath = storageUrlDTO.getStoragePath();
GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(this.bucketName).object(storagePath).method(Method.GET).build();
try {
String url = getClient().getPresignedObjectUrl(build);
return AjaxResult.success(Constants.STRING_SUCCESS, url);
} catch (Exception e) {
log.error("minio生成预览url异常",e);
}
return AjaxResult.error();
}
@Override
public AjaxResult upload(byte[] data, String storagePath) {
String contentType = Constants.STRING_BLANK;
try {
boolean found = getClient().bucketExists(BucketExistsArgs.builder().bucket(this.bucketName).build());
if (!found) {
getClient().makeBucket(MakeBucketArgs.builder().bucket(this.bucketName).build());
}
String suffix = storagePath.substring(storagePath.lastIndexOf(Constants.POINT)+Constants.INT_1);
if (StringUtils.equals(suffix.toUpperCase(), Constants.OFD_UPCASE)){
contentType = Constants.APPLICATION_OFD;
}else if (StringUtils.equals(suffix.toUpperCase(), Constants.PDF_UPCASE)){
contentType = Constants.APPLICATION_PDF;
}else {
contentType = Constants.APPLICATION_XML;
}
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(this.bucketName).object(storagePath)
.stream(new ByteArrayInputStream(data), data.length, -1).contentType(contentType).build();
//文件名称相同会覆盖
getClient().putObject(objectArgs);
} catch (Exception e) {
log.error("minio上传文件异常", e);
AjaxResult.error();
}
StorageUrlDTO storageUrlDTO = new StorageUrlDTO();
storageUrlDTO.setStoragePath(storagePath);
storageUrlDTO.setServiceProvider(Constants.MINIO);
storageUrlDTO.setContentType(contentType);
return AjaxResult.success(storageUrlDTO);
}
@Override
public AjaxResult upload(String filePath, String storagePath) {
return null;
}
private MinioClient getClient() {
return (MinioClient) this.storageInstance;
}
}

@ -11,9 +11,9 @@ const name = process.env.VUE_APP_TITLE || '简税平台管理系统' // 网页
const port = process.env.port || process.env.npm_config_port || 8088 // 端口
// 'http://dev.goldentaxcloud.com:8081'
// www.goldentaxcloud.com:8080
let development = 'http://dev.goldentaxcloud.com:8081'
// let development = 'http://dev.goldentaxcloud.com:8081'
// let development = 'www.goldentaxcloud.com:8080'
// let development = 'http://192.168.3.106:8081' //刑泽本地环境
let development = 'http://127.0.0.1:8081' //刑泽本地环境
const url = process.env.NODE_ENV === 'development' ? development : development
// vue.config.js 配置说明

Loading…
Cancel
Save