package com.izouma.awesomeadmin.web;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.izouma.awesomeadmin.constant.AppConstant;
import com.izouma.awesomeadmin.dto.Page;
import com.izouma.awesomeadmin.dto.Result;
import com.izouma.awesomeadmin.model.ImageDownLog;
import com.izouma.awesomeadmin.model.ImageUploadLog;
import com.izouma.awesomeadmin.model.OrderImage;
import com.izouma.awesomeadmin.model.UserOrder;
import com.izouma.awesomeadmin.service.*;
import com.izouma.awesomeadmin.util.ExportExcelUtil;
import com.izouma.awesomeadmin.util.ImagesUtil;
import com.izouma.awesomeadmin.util.PropertiesFileLoader;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* controller类
*/
@Controller
@RequestMapping("/orderImage")
public class OrderImageController {
/**
* 日志对象zipFilesDown
*/
private static Logger logger = Logger.getLogger(OrderImageController.class);
@Autowired
private OrderImageService orderImageService;
@Autowired
private UserOrderService userOrderService;
@Autowired
private OSSFileService OSSFileService;
@Autowired
private ImageUploadLogService imageUploadLogService;
@Autowired
private ImageDownLogService imageDownLogService;
/**
*
获取全部记录。
*/
@RequiresAuthentication
@RequestMapping(value = "/all", method = RequestMethod.GET)
@ResponseBody
public Result all(OrderImage record) {
List pp = orderImageService.getOrderImageList(record);
return new Result(true, pp);
}
/**
* 根据Id。
*/
@RequestMapping(value = "/getOrderImage", method = RequestMethod.GET)
@ResponseBody
public Result getOrderImage(@RequestParam(required = false, value = "id") String id) {
OrderImage data = orderImageService.getOrderImageById(id);
return new Result(true, data);
}
/**
* 根据条件获取。
*/
@RequestMapping(value = "/getOne", method = RequestMethod.GET)
@ResponseBody
public Result getOne(OrderImage record) {
OrderImage data = orderImageService.getOrderImage(record);
return new Result(true, data);
}
/**
* 分页查询。
*/
@RequestMapping(value = "/page", method = RequestMethod.GET)
@ResponseBody
public Result page(Page page, OrderImage record) {
Map result = new HashMap<>();
List pp = orderImageService.getOrderImageByPage(page, record);
result.put(AppConstant.PAGE, page);
result.put("pp", pp);
return new Result(true, result);
}
/**
* 保存。
*/
@RequestMapping(value = "/save", method = RequestMethod.POST)
@ResponseBody
public Result save(OrderImage record) {
boolean num = orderImageService.createOrderImage(record);
if (num) {
return new Result(true, record.getId());
}
return new Result(false, "保存异常");
}
/**
* 更新信息。
*/
@RequestMapping(value = "/update", method = RequestMethod.POST)
@ResponseBody
public Result updateOrderImage(OrderImage record) {
boolean num = orderImageService.updateOrderImage(record);
if (num) {
return new Result(true, "保存成功");
}
return new Result(false, "保存异常");
}
/**
* 删除。
*/
@RequestMapping(value = "/del", method = RequestMethod.POST)
@ResponseBody
public Result deleteOrderImage(@RequestParam(required = true, value = "id") String id) {
boolean num = orderImageService.deleteOrderImage(id);
if (num) {
return new Result(true, "删除成功");
}
return new Result(false, "删除异常");
}
/**
* 导出Excel
*
* @param request
* @param response
* @param record
* @throws Exception
*/
@RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
@ResponseBody
public void exportExcel(HttpServletRequest request, HttpServletResponse response, OrderImage record) throws Exception {
List orderImages = orderImageService.getOrderImageList(record);
String sheetName = "order_image";
String titleName = "订单图片数据表";
String fileName = "订单图片表";
int columnNumber = 16;
int[] columnWidth = {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20};
String[] columnName = {"", "删除标识", "更新时间", "更新人", "创建时间", "创建人", "订单", "用户", "店铺", "原片地址", "原片大小", "成片地址", "成片大小", "修图人", "状态", "备注"};
String[][] dataList = new String[orderImages.size()][16];
for (int i = 0; i < orderImages.size(); i++) {
dataList[i][0] = String.valueOf(orderImages.get(i).getId());
dataList[i][1] = String.valueOf(orderImages.get(i).getDelFlag());
dataList[i][2] = String.valueOf(orderImages.get(i).getUpdateTime());
dataList[i][3] = String.valueOf(orderImages.get(i).getUpdateUser());
dataList[i][4] = String.valueOf(orderImages.get(i).getCreateTime());
dataList[i][5] = String.valueOf(orderImages.get(i).getCreateUser());
dataList[i][6] = String.valueOf(orderImages.get(i).getOrderId());
dataList[i][7] = String.valueOf(orderImages.get(i).getUserId());
dataList[i][8] = String.valueOf(orderImages.get(i).getStoreId());
dataList[i][9] = String.valueOf(orderImages.get(i).getOriginalImage());
dataList[i][10] = String.valueOf(orderImages.get(i).getOriginalSize());
dataList[i][11] = String.valueOf(orderImages.get(i).getFinishedImage());
dataList[i][12] = String.valueOf(orderImages.get(i).getFinishedSize());
dataList[i][13] = String.valueOf(orderImages.get(i).getDealUser());
dataList[i][14] = String.valueOf(orderImages.get(i).getStatusFlag());
dataList[i][15] = String.valueOf(orderImages.get(i).getRemark());
}
ExportExcelUtil.ExportWithResponse(sheetName, titleName, fileName,
columnNumber, columnWidth, columnName, dataList, response);
}
/**
* 返修。
*/
@RequestMapping(value = "/repair", method = RequestMethod.POST)
@ResponseBody
public Result repair(OrderImage record) {
boolean num = orderImageService.repair(record);
if (num) {
return new Result(true, "保存成功");
}
return new Result(false, "保存异常");
}
@RequestMapping(value = "/uploadFileForOrder")
@ResponseBody
public Result uploadFile(HttpServletRequest request, String storeId, String orderId, String userId, String typeFlag) {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
Iterator it = multiRequest.getFileNames();
List paths = new ArrayList<>();
while (it.hasNext()) {
MultipartFile file = multiRequest.getFile(it.next().toString());
if (file != null) {
try {
String originalFilename = file.getOriginalFilename();
OrderImage orderImage = new OrderImage();
orderImage.setOrderId(orderId);
orderImage.setImageName(originalFilename);
orderImage = orderImageService.getOrderImage(orderImage);
if (orderImage == null) {
if ("finished".equals(typeFlag)) {
return new Result(false, originalFilename + "不在原图中");
}
} else {
if ("finished".equals(typeFlag) && orderImage.getStatusFlag() == 1) {
return new Result(false, originalFilename + "已经审核通过");
}
}
String fileType = originalFilename.split("[.]")[originalFilename.split("[.]").length - 1];
long srcSize = file.getSize();
String uploadPath = storeId + "/" + orderId + "/" + typeFlag + "/" + originalFilename;
String path = OSSFileService.upload(file.getInputStream(), uploadPath);
ImageUploadLog imageUploadLog = new ImageUploadLog();
imageUploadLog.setStoreId(storeId);
imageUploadLog.setOrderId(orderId);
imageUploadLog.setTypeFlag(typeFlag);
imageUploadLog.setUserId(userId);
imageUploadLog.setImageName(originalFilename);
imageUploadLog.setUrl(path);
imageUploadLog.setArtworkUrl(path);
imageUploadLog.setImageSize(BigDecimal.valueOf(file.getSize()));
int bigSize = 2 * 1024 * 1024;
if (srcSize > bigSize) {
String minPath = storeId + "/" + orderId + "/" + typeFlag + "/" + "min/" + originalFilename;
String min = OSSFileService.upload(ImagesUtil.changeMinPhoto(
file.getInputStream(),
fileType,
2000, 1), minPath);
imageUploadLog.setUrl(min);
}
imageUploadLogService.createImageUploadLog(imageUploadLog);
if (orderImage != null) {
orderImage.setImageName(originalFilename);
if ("original".equals(typeFlag)) {
orderImage.setOriginalSize(imageUploadLog.getImageSize());
orderImage.setOriginalImage(imageUploadLog.getUrl());
orderImage.setOriginalArtwork(imageUploadLog.getArtworkUrl());
} else if ("finished".equals(typeFlag)) {
if (orderImage.getStatusFlag() != 1) {
orderImage.setStatusFlag(0);
}
orderImage.setFinishedSize(imageUploadLog.getImageSize());
orderImage.setFinishedImage(imageUploadLog.getUrl());
orderImage.setFinishedArtwork(imageUploadLog.getArtworkUrl());
}
orderImageService.updateOrderImage(orderImage);
} else {
if ("original".equals(typeFlag)) {
orderImage = new OrderImage();
orderImage.setOrderId(orderId);
orderImage.setUserId(userId);
orderImage.setStoreId(storeId);
orderImage.setImageName(originalFilename);
orderImage.setOriginalSize(imageUploadLog.getImageSize());
orderImage.setOriginalImage(imageUploadLog.getUrl());
orderImage.setOriginalArtwork(imageUploadLog.getArtworkUrl());
orderImageService.createOrderImage(orderImage);
}
}
paths.add(orderImage);
} catch (IOException e) {
logger.error("上传订单图片失败", e);
return new Result(false, "上传失败");
}
}
}
return new Result(true, paths);
}
return new Result(false, "上传失败");
}
/**
* 清空未使用图片
*
* @param orderId
* @return
*/
@RequestMapping(value = "/delOssImage", method = RequestMethod.POST)
@ResponseBody
public Result delOssImage(@RequestParam(required = true, value = "orderId") String orderId) {
List imageUploadLogs = imageUploadLogService.queryDelOssImage(orderId);
for (ImageUploadLog imageUploadLog : imageUploadLogs) {
try {
if (StringUtils.isNotEmpty(imageUploadLog.getUrl())) {
String artwork = imageUploadLog.getUrl().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
OSSFileService.deleteObject(artwork);
}
} catch (Exception e) {
logger.error("删除图片异常", e);
}
}
return new Result(true, "删除成功");
}
/**
* 批量更新成片
*
* @param orderId
* @param imageIds
* @return
*/
@RequestMapping(value = "/updateFinishedImages", method = RequestMethod.POST)
@ResponseBody
public Result updateFinishedImages(@RequestParam(required = true, value = "orderId") String orderId, @RequestParam(required = true, value = "imageIds") String imageIds) {
ImageUploadLog record = new ImageUploadLog();
record.setOrderId(orderId);
record.setIdStr(imageIds);
List imageUploadLogs = imageUploadLogService.getImageUploadLogList(record);
for (ImageUploadLog imageUploadLog : imageUploadLogs) {
OrderImage orderImage = new OrderImage();
orderImage.setOrderId(orderId);
orderImage.setImageName(imageUploadLog.getImageName());
orderImage = orderImageService.getOrderImage(orderImage);
if (orderImage != null) {
if (orderImage.getStatusFlag() != 1) {
orderImage.setStatusFlag(0);
orderImage.setFinishedImage(imageUploadLog.getUrl());
orderImage.setFinishedSize(imageUploadLog.getImageSize());
orderImage.setFinishedArtwork(imageUploadLog.getArtworkUrl());
orderImageService.updateOrderImage(orderImage);
}
}
}
return new Result(true, "保存成功");
}
/**
* 获取店铺存储情况
*
* @param record
* @return
*/
@RequestMapping(value = "/getMemorySize", method = RequestMethod.GET)
@ResponseBody
public Result getMemorySize(OrderImage record) {
OrderImage data = orderImageService.getMemorySize(record);
return new Result(true, data);
}
/**
* 下载压缩包
*
* @param orderId 订单ID
* @param typeFlag 类型 original / finished
* @param code 编码 下载标识
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/zipFilesDown", method = RequestMethod.GET)
@ResponseBody
public void zipFilesDown(@RequestParam(required = true, value = "orderId") String orderId,
@RequestParam(required = true, value = "typeFlag") String typeFlag,
@RequestParam(required = true, value = "code") String code,
HttpServletRequest request, HttpServletResponse response) {
try {
OrderImage record = new OrderImage();
record.setOrderId(orderId);
List orderImageList = orderImageService.getOrderImageList(record);
if (orderImageList.size() > 0) {
UserOrder userOrder = userOrderService.getUserOrderById(orderId);
if (userOrder != null) {
List keyList = new ArrayList<>();
String zipName = userOrder.getOrderCode() + "_" + typeFlag;
for (OrderImage orderImage : orderImageList) {
if ("original".equals(typeFlag)) {
if (StringUtils.isNotEmpty(orderImage.getOriginalImage())) {
if (StringUtils.isNotEmpty(orderImage.getOriginalArtwork())) {
String imageName = orderImage.getOriginalArtwork().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
keyList.add(imageName);
} else {
String imageName = orderImage.getOriginalImage().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
keyList.add(imageName);
}
}
} else if ("finished".equals(typeFlag)) {
if (StringUtils.isNotEmpty(orderImage.getFinishedImage())) {
if (StringUtils.isNotEmpty(orderImage.getFinishedArtwork())) {
String imageName = orderImage.getFinishedArtwork().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
keyList.add(imageName);
} else {
String imageName = orderImage.getFinishedImage().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
keyList.add(imageName);
}
//更新成已下载
orderImage.setDownloadFlag("Y");
orderImageService.updateOrderImage(orderImage);
}
}
}
if (keyList.size() > 0) {
//OSSFileService.zipFilesDown(keyList, zipName, request, response);
String accessKeyId = PropertiesFileLoader.getDefaultProperties("aliossid", "");
String accessKeySecret = PropertiesFileLoader.getDefaultProperties("aliosskey", "");
String endpoint = PropertiesFileLoader.getDefaultProperties("aliossendpoit", "");
String bucketName = PropertiesFileLoader.getDefaultProperties("alibucketname", "");
// endpoint以杭州为例,其它region请按实际情况填写
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
try {
// 初始化
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
String fileName = zipName + ".zip";
// 创建临时文件
File zipFile = File.createTempFile(zipName, ".zip");
FileOutputStream f = new FileOutputStream(zipFile);
/**
* 作用是为任何OutputStream产生校验和
* 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
*/
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
// 用于将数据压缩成Zip文件格式
ZipOutputStream zos = new ZipOutputStream(csum);
for (int i = 0; i < keyList.size(); i++) {
try {
String ossfile = keyList.get(i);
ImageDownLog imageDownLog = new ImageDownLog();
imageDownLog.setOrderId(orderId);
imageDownLog.setTypeFlag(typeFlag);
imageDownLog.setImageCode(code);
imageDownLog.setImageName(ossfile.split("/")[ossfile.split("/").length - 1]);
imageDownLog.setTotalNum(keyList.size());
imageDownLog.setNowNum(i + 1);
imageDownLogService.createImageDownLog(imageDownLog);
// 获取Object,返回结果为OSSObject对象
OSSObject ossObject = ossClient.getObject(bucketName, ossfile);
imageDownLog.setImageSize(BigDecimal.valueOf(ossObject.getObjectMetadata().getContentLength()));
// 读去Object内容 返回
InputStream inputStream = ossObject.getObjectContent();
// 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名
zos.putNextEntry(new ZipEntry(ossfile.split("/")[ossfile.split("/").length - 1]));
int bytesRead = 0;
// 向压缩文件中输出数据
while ((bytesRead = inputStream.read()) != -1) {
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
imageDownLog.setStatusFlag(1);
imageDownLogService.updateImageDownLog(imageDownLog);
} catch (Exception e) {
logger.error("ossfile, 压缩失败", e);
}
}
zos.close();
String header = request.getHeader("User-Agent").toUpperCase();
if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
fileName = URLEncoder.encode(fileName, "utf-8");
fileName = fileName.replace("+", "%20"); //IE下载文件名空格变+号问题
} else {
fileName = new String(fileName.getBytes(), "ISO8859-1");
}
response.reset();
response.setContentType("text/plain");
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Location", fileName);
response.setHeader("Cache-Control", "max-age=0");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
FileInputStream fis = new FileInputStream(zipFile);
BufferedInputStream buff = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
byte[] car = new byte[1024];
int l = 0;
while (l < zipFile.length()) {
int j = buff.read(car, 0, 1024);
l += j;
out.write(car, 0, j);
}
// 关闭流
fis.close();
buff.close();
out.close();
ossClient.shutdown();
// 删除临时文件
zipFile.delete();
} catch (Exception e) {
logger.error("压缩失败", e);
}
}
}
}
} catch (Exception e) {
logger.error("zipFilesDown,批量下载异常", e);
}
}
/**
* 单张下载
*
* @param id orderImage id
* @param typeFlag 类型 original / finished
* @param request
* @param response
*/
@RequestMapping(value = "/singleFileDown", method = RequestMethod.GET)
@ResponseBody
public void singleFileDown(@RequestParam(required = true, value = "id") String id,
@RequestParam(required = true, value = "typeFlag") String typeFlag,
HttpServletRequest request, HttpServletResponse response) {
try {
OrderImage orderImage = orderImageService.getOrderImageById(id);
if (orderImage != null) {
if ("original".equals(typeFlag)) {
if (StringUtils.isNotEmpty(orderImage.getOriginalImage())) {
if (StringUtils.isNotEmpty(orderImage.getOriginalArtwork())) {
String imageName = orderImage.getOriginalArtwork().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
OSSFileService.singleFileDown(imageName, request, response);
} else {
String imageName = orderImage.getOriginalImage().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
OSSFileService.singleFileDown(imageName, request, response);
}
}
} else if ("finished".equals(typeFlag)) {
if (StringUtils.isNotEmpty(orderImage.getFinishedImage())) {
if (StringUtils.isNotEmpty(orderImage.getFinishedArtwork())) {
String imageName = orderImage.getFinishedArtwork().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
OSSFileService.singleFileDown(imageName, request, response);
} else {
String imageName = orderImage.getFinishedImage().replace(PropertiesFileLoader.getProperties("aliImageSever") + "/", "");
OSSFileService.singleFileDown(imageName, request, response);
}
//更新成已下载
orderImage.setDownloadFlag("Y");
orderImageService.updateOrderImage(orderImage);
}
}
}
} catch (Exception e) {
logger.error("singleFileDown,单张下载异常", e);
}
}
@RequestMapping(value = "/autoCleanOrderImage", method = RequestMethod.GET)
@ResponseBody
public Result autoCleanOrderImage() {
return orderImageService.autoCleanOrderImage(null);
}
/**
* 导出注释
*
* @param request
* @param response
* @param record
* @throws Exception
*/
@RequestMapping(value = "/exportRemark", method = RequestMethod.GET)
@ResponseBody
public void exportRemark(HttpServletRequest request, HttpServletResponse response, OrderImage record) throws Exception {
List orderImages = orderImageService.getOrderImageList(record);
String sheetName = "图片备注";
String titleName = "订单图片数据表";
String fileName = "订单图片表";
int columnNumber = 2;
int[] columnWidth = {30, 30};
String[] columnName = {"图片", "备注"};
String[][] dataList = new String[orderImages.size()][2];
for (int i = 0; i < orderImages.size(); i++) {
dataList[i][0] = String.valueOf(orderImages.get(i).getImageName());
dataList[i][1] = StringUtils.isNotEmpty(orderImages.get(i).getRemark()) ? orderImages.get(i).getRemark() : "";
}
ExportExcelUtil.ExportWithResponse(sheetName, titleName, fileName,
columnNumber, columnWidth, columnName, dataList, response);
}
}