|
@@ -1,6 +1,9 @@
|
|
|
package edu.travel.commodity.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.io.FileTypeUtil;
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
@@ -10,29 +13,31 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import edu.travel.adapter.service.order.OrderAdapter;
|
|
|
import edu.travel.adapter.service.order.OrderItemAdapter;
|
|
|
import edu.travel.adapter.service.tenant.TenantAdapter;
|
|
|
+import edu.travel.adapter.service.upload.UploadAdapter;
|
|
|
+import edu.travel.commodity.constant.BaseConstant;
|
|
|
import edu.travel.commodity.entity.ShopReview;
|
|
|
import edu.travel.commodity.enums.OrderStateEnum;
|
|
|
import edu.travel.commodity.mapper.ShopReviewMapper;
|
|
|
import edu.travel.commodity.service.ShopReviewService;
|
|
|
-import edu.travel.commodity.utils.ObjectUtils;
|
|
|
-import edu.travel.commodity.utils.PageUtil;
|
|
|
-import edu.travel.commodity.utils.StringUtil;
|
|
|
-import edu.travel.commodity.utils.TokenData;
|
|
|
+import edu.travel.commodity.utils.*;
|
|
|
import edu.travel.remote.dto.AddReviewDto;
|
|
|
import edu.travel.remote.dto.GetOrderItemDto;
|
|
|
import edu.travel.remote.dto.ProductSpecDto;
|
|
|
import edu.travel.exception.BaseException;
|
|
|
import edu.travel.remote.feign.mode.vo.tenant.EduTenantVo;
|
|
|
+import edu.travel.remote.upload.dto.EduFileDTO;
|
|
|
import edu.travel.remote.vo.*;
|
|
|
import edu.travel.rpc.RPCBaseResponse;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static edu.travel.rpc.RPCBaseResponse.error;
|
|
|
+import static edu.travel.rpc.RPCBaseResponse.success;
|
|
|
+
|
|
|
|
|
|
@Service
|
|
|
public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopReview> implements ShopReviewService {
|
|
@@ -42,6 +47,9 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
|
|
|
private OrderItemAdapter orderItemAdapter;
|
|
|
@Autowired
|
|
|
private OrderAdapter orderAdapter;
|
|
|
+ @Autowired
|
|
|
+ private UploadAdapter uploadAdapter;
|
|
|
+
|
|
|
@Override
|
|
|
public Page<ShopReviewVo> getShopReview(ProductSpecDto params) {
|
|
|
LambdaQueryWrapper<ShopReview> query = Wrappers.<ShopReview>lambdaQuery()
|
|
@@ -131,4 +139,105 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
|
|
|
save(bean);
|
|
|
return "评价成功";
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 评论文件上传
|
|
|
+ * @param file
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public RPCBaseResponse<String> uploadReviewImage(MultipartFile file) {
|
|
|
+ //判断上传的文件是否为空或未选择
|
|
|
+ if (file == null || file.isEmpty()) {
|
|
|
+ return error();
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ //获取文件类型
|
|
|
+ String fileType = FileTypeUtil.getType(file.getInputStream());
|
|
|
+ //检查文件类型是否有效且是否在允许的评论图片类型列表中
|
|
|
+ if (fileType != null && BaseConstant.getReviewImageTypes().contains(fileType.toLowerCase())) {
|
|
|
+ //获取用户上传的文件名
|
|
|
+ String filename = file.getOriginalFilename();
|
|
|
+ //检查文件名是否为空
|
|
|
+ if (ObjectUtil.isEmpty(filename)) {
|
|
|
+ return error();
|
|
|
+ }
|
|
|
+ //初始化上传,获取上传 ID
|
|
|
+ RPCBaseResponse<String> stringRPCBaseResponse = uploadAdapter.initializeUpload();
|
|
|
+ //创建文件 DTO 对象,用于存储文件相关信息
|
|
|
+ EduFileDTO eduFileDTO = new EduFileDTO();
|
|
|
+ eduFileDTO.setUploadId(stringRPCBaseResponse.getData());
|
|
|
+ eduFileDTO.setFileType(fileType);
|
|
|
+ eduFileDTO.setFileName(filename);
|
|
|
+ //生成系统文件名
|
|
|
+ eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID()+ DateUtil.format(new Date(),"yyyyMMddHHmmss") +"."+fileType);
|
|
|
+ //计算文件的 MD5 值以便后续验证
|
|
|
+ eduFileDTO.setFileMd5(FIleUtil.calculateFileMd5(file.getBytes()));
|
|
|
+ //调用上传适配器进行文件上传
|
|
|
+ RPCBaseResponse rpcBaseResponse = uploadAdapter.uploadFile(eduFileDTO, file);
|
|
|
+ //返回成功响应,包含上传后的数据
|
|
|
+ return success(rpcBaseResponse.getData().toString());
|
|
|
+ }
|
|
|
+ }catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return error("file upload fail");
|
|
|
+ }
|
|
|
+ return error();
|
|
|
+ }
|
|
|
+ public RPCBaseResponse<String> uploadReviewImages(List<MultipartFile> files) {
|
|
|
+ // 判断上传的文件列表是否为空或未选择
|
|
|
+ if (files == null || files.isEmpty()) {
|
|
|
+ return RPCBaseResponse.error("No files provided for upload.");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> uploadedFileIds = new ArrayList<>(); // 用于存放上传成功的文件ID
|
|
|
+ try {
|
|
|
+ for (MultipartFile file : files) {
|
|
|
+ // 判断单个文件是否为空
|
|
|
+ if (file.isEmpty()) {
|
|
|
+ continue; // 如果文件为空,跳过该文件
|
|
|
+ }
|
|
|
+ // 获取文件类型
|
|
|
+ String fileType = FileTypeUtil.getType(file.getInputStream());
|
|
|
+ // 检查文件类型是否有效且是否在允许的评论图片类型列表中
|
|
|
+ if (fileType != null && BaseConstant.getReviewImageTypes().contains(fileType.toLowerCase())) {
|
|
|
+ // 获取用户上传的文件名
|
|
|
+ String filename = file.getOriginalFilename();
|
|
|
+ // 检查文件名是否为空
|
|
|
+ if (ObjectUtil.isEmpty(filename)) {
|
|
|
+ continue; // 如果文件名为空,跳过该文件
|
|
|
+ }
|
|
|
+ // 初始化上传,获取上传 ID
|
|
|
+ RPCBaseResponse<String> stringRPCBaseResponse = uploadAdapter.initializeUpload();
|
|
|
+ // 创建文件 DTO 对象,用于存储文件相关信息
|
|
|
+ EduFileDTO eduFileDTO = new EduFileDTO();
|
|
|
+ eduFileDTO.setUploadId(stringRPCBaseResponse.getData());
|
|
|
+ eduFileDTO.setFileType(fileType);
|
|
|
+ eduFileDTO.setFileName(filename);
|
|
|
+ // 生成系统文件名
|
|
|
+ eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID() + DateUtil.format(new Date(), "yyyyMMddHHmmss") + "." + fileType);
|
|
|
+ // 计算文件的 MD5 值以便后续验证
|
|
|
+ eduFileDTO.setFileMd5(FIleUtil.calculateFileMd5(file.getBytes()));
|
|
|
+ // 调用上传适配器进行文件上传
|
|
|
+ RPCBaseResponse<?> rpcBaseResponse = uploadAdapter.uploadFile(eduFileDTO, file);
|
|
|
+ // 如果上传成功,收集文件ID
|
|
|
+ if (rpcBaseResponse.getCode() == 200) {
|
|
|
+ uploadedFileIds.add(rpcBaseResponse.getData().toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return RPCBaseResponse.error("File upload failed: " + e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回成功响应,包含上传后的文件ID,以逗号分隔
|
|
|
+ if (!uploadedFileIds.isEmpty()) {
|
|
|
+ String result = String.join(",", uploadedFileIds);
|
|
|
+ return RPCBaseResponse.success(result);
|
|
|
+ } else {
|
|
|
+ return RPCBaseResponse.error("No files were uploaded successfully.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|