| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | |
| | | import org.springframework.http.HttpHeaders; |
| | | import org.springframework.http.MediaType; |
| | | import org.springframework.http.ResponseEntity; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.net.URLDecoder; |
| | | import java.net.URLEncoder; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.temporal.ChronoUnit; |
| | | import java.util.*; |
| | |
| | | if (result == null || result.get("total_points") == null) { |
| | | userStatistics.setTotalScore(0L); |
| | | }else { |
| | | userStatistics.setTotalScore((Long) result.get("total_points")); |
| | | userStatistics.setTotalScore(((BigDecimal) result.get("total_points")).longValue()); |
| | | } |
| | | //条件构造 消费积分现金支付金额 |
| | | queryWrapper.clear(); |
| | |
| | | * @param file |
| | | * @return |
| | | */ |
| | | @PostMapping("/upload") |
| | | /* @PostMapping("/upload") |
| | | public R upload(MultipartFile file){ |
| | | String s = null; |
| | | try { |
| | |
| | | throw new RuntimeException(e); |
| | | } |
| | | return R.ok(s); |
| | | }*/ |
| | | |
| | | private static final String FILE_DIRECTORY = "/var/files/ldf_files"; // Linux路径 |
| | | // private static final String FILE_DIRECTORY = "E://ldf_files"; // Linux路径 |
| | | |
| | | @PostMapping("/upload") |
| | | public R handleFileUpload(@RequestParam("file") MultipartFile file) { |
| | | if (file.isEmpty()) { |
| | | return R.fail("请选择一个文件上传"); |
| | | } |
| | | try { |
| | | // 1. 构建日期目录路径(格式:/年/月/日) |
| | | LocalDate today = LocalDate.now(); |
| | | String datePath = String.format("/%d/%02d/%02d", |
| | | today.getYear(), today.getMonthValue(), today.getDayOfMonth()); |
| | | |
| | | // 2. 完整目标目录路径 |
| | | String fullDirPath = FILE_DIRECTORY + datePath; |
| | | File targetDir = new File(fullDirPath); |
| | | |
| | | // 3. 自动创建目录(如果不存在) |
| | | if (!targetDir.exists()) { |
| | | targetDir.mkdirs(); // 递归创建所有父目录 |
| | | } |
| | | String UUID= java.util.UUID.randomUUID().toString(); |
| | | // 4. 保存文件 |
| | | String filePath = fullDirPath + "/" +UUID+ file.getOriginalFilename(); |
| | | File targetFile = new File(filePath); |
| | | file.transferTo(targetFile); |
| | | // 5. 返回可访问的URL(修正路径分隔符为Web格式) |
| | | return R.ok("http://zjrqxny.com/account/app-user/download" + datePath + "/" + UUID+file.getOriginalFilename()); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | return R.fail("上传文件失败"); |
| | | } |
| | | } |
| | | |
| | | |
| | | @GetMapping("/download/{year}/{month}/{day}/{fileName:.+}") |
| | | @ResponseBody |
| | | public ResponseEntity<org.springframework.core.io.Resource> downloadFile( @PathVariable String year, |
| | | @PathVariable String month, |
| | | @PathVariable String day, |
| | | @PathVariable String fileName) { |
| | | System.out.println("下载文件名:"+fileName); |
| | | try { |
| | | // 1. 解码文件名 |
| | | String decodedFileName = URLDecoder.decode(fileName, "UTF-8"); |
| | | |
| | | |
| | | java.nio.file.Path filePath = java.nio.file.Paths.get(FILE_DIRECTORY, year, month, day, decodedFileName).normalize(); |
| | | org.springframework.core.io.Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri()); |
| | | if (resource.exists() || resource.isReadable()) { |
| | | // 5. 设置下载头(兼容所有浏览器) |
| | | String contentDisposition = "attachment; filename=\"" + decodedFileName + "\"; " + |
| | | "filename*=UTF-8''" + URLEncoder.encode(decodedFileName, "UTF-8").replace("+", "%20"); |
| | | |
| | | return ResponseEntity.ok() |
| | | .contentType(MediaType.APPLICATION_OCTET_STREAM) |
| | | .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) |
| | | .body(resource); |
| | | |
| | | } else { |
| | | return ResponseEntity.notFound().build(); |
| | | } |
| | | } catch (IOException ex) { |
| | | ex.printStackTrace(); |
| | | return ResponseEntity.status(500).build(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 清空绑定门店的用户门店数据 |