Explorar el Código

feat:文件上传

zhangwei hace 1 semana
padre
commit
427f40d135
Se han modificado 31 ficheros con 316 adiciones y 61 borrados
  1. 1 1
      edu-travel-adapter/edu-travel-adapter-order/src/main/java/edu/travel/adapter/service/order/OrderAdapter.java
  2. 4 0
      edu-travel-adapter/edu-travel-adapter-upload/pom.xml
  3. 4 2
      edu-travel-adapter/edu-travel-adapter-upload/src/main/java/edu/travel/adapter/service/upload/UploadAdapter.java
  4. 9 8
      edu-travel-api/edu-travel-api-admin/src/main/java/edu/travel/controller/UploadController.java
  5. 11 0
      edu-travel-common/edu-travel-common-openfeign/pom.xml
  6. 1 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCBaseResponse.java
  7. 12 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductDto.java
  8. 2 0
      edu-travel-remote/edu-travel-remote-country/src/main/java/edu/travel/remote/ShopCurrencyRemoteController.java
  9. 12 0
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/dto/GetOrderItemInfoByOrderNumDto.java
  10. 2 1
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/order/ShopOrderItemRemoteController.java
  11. 7 9
      edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/UploadRemoteController.java
  12. 8 1
      edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/dto/EduFileDTO.java
  13. 1 1
      edu-travel-service/edu-travel-service-commodity/pom.xml
  14. 15 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/constant/BaseConstant.java
  15. 2 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSkuService.java
  16. 3 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopAddressServiceImpl.java
  17. 24 15
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java
  18. 17 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/utils/FIleUtil.java
  19. 54 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductController.java
  20. 7 3
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductSkuController.java
  21. 2 2
      edu-travel-service/edu-travel-service-country/src/main/java/edu/travel/country/web/ShopCurrencyController.java
  22. 0 1
      edu-travel-service/edu-travel-service-order/pom.xml
  23. 14 2
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderController.java
  24. 16 2
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderItemController.java
  25. 2 1
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderTypeChangeController.java
  26. 46 0
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/enums/OrderStateEnum.java
  27. 4 0
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/service/ShopOrderService.java
  28. 18 0
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/service/impl/ShopOrderServiceImpl.java
  29. 1 1
      edu-travel-service/edu-travel-service-order/src/main/resources/mapper/ShopOrderTypeChangeMapper.xml
  30. 4 0
      edu-travel-service/edu-travel-service-upload/pom.xml
  31. 13 8
      edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java

+ 1 - 1
edu-travel-adapter/edu-travel-adapter-order/src/main/java/edu/travel/adapter/service/order/OrderAdapter.java

@@ -13,6 +13,6 @@ public class OrderAdapter {
     private ShopOrderRemoteController shopOrderRemoteController;
     @AdapterAnnotation
     public RPCBaseResponse<Void> addShopOrder(AddOrderDto params) {
-        return shopOrderRemoteController.addShopOrder(params);
+       return shopOrderRemoteController.addShopOrder(params);
     }
 }

+ 4 - 0
edu-travel-adapter/edu-travel-adapter-upload/pom.xml

@@ -28,6 +28,10 @@
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
             <groupId>edu.travel</groupId>
             <artifactId>edu-travel-remote-upload</artifactId>
             <version>1.0-SNAPSHOT</version>

+ 4 - 2
edu-travel-adapter/edu-travel-adapter-upload/src/main/java/edu/travel/adapter/service/upload/UploadAdapter.java

@@ -1,5 +1,6 @@
 package edu.travel.adapter.service.upload;
 
+import com.alibaba.fastjson.JSON;
 import edu.travel.adapter.annotation.AdapterAnnotation;
 import edu.travel.remote.upload.UploadRemoteController;
 import edu.travel.remote.upload.dto.EduFileBlobDTO;
@@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.List;
 
 @Component
 public class UploadAdapter  {
@@ -42,8 +44,8 @@ public class UploadAdapter  {
         return rpcBaseResponse;
     }
     @AdapterAnnotation
-    public RPCBaseResponse uploadFile(EduFileDTO eduFile,MultipartFile file) throws IOException {
-        RPCBaseResponse rpcBaseResponse = uploadRemoteController.uploadFile(eduFile,file);
+    public RPCBaseResponse uploadFile(EduFileDTO eduFileDTO,MultipartFile file) throws IOException {
+        RPCBaseResponse rpcBaseResponse = uploadRemoteController.uploadFile(JSON.toJSONString(eduFileDTO),file);
         return rpcBaseResponse;
     }
 }

+ 9 - 8
edu-travel-api/edu-travel-api-admin/src/main/java/edu/travel/controller/UploadController.java

@@ -112,13 +112,14 @@ public class UploadController  {
     @PostMapping(value = "/upload")
     @PreAuthorize("permitAll()")
     public BaseResponse uploadFile(EduFileDTO eduFile,MultipartFile file) throws IOException {
-        RPCBaseResponse rpcBaseResponse = uploadAdapter.uploadFile(eduFile,file);
-        if (rpcBaseResponse != null) {
-            if (rpcBaseResponse.getCode() == HttpStatus.OK.value()){
-                return new BaseResponse(HttpStatus.OK.value(),"success",rpcBaseResponse.getData());
-            }
-            return new BaseResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(),"request is error",null);
-        }
-        return new BaseResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(),"request is error",null);
+        return null;
+//        RPCBaseResponse rpcBaseResponse = uploadAdapter.uploadFile(eduFile,file);
+//        if (rpcBaseResponse != null) {
+//            if (rpcBaseResponse.getCode() == HttpStatus.OK.value()){
+//                return new BaseResponse(HttpStatus.OK.value(),"success",rpcBaseResponse.getData());
+//            }
+//            return new BaseResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(),"request is error",null);
+//        }
+//        return new BaseResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(),"request is error",null);
     }
 }

+ 11 - 0
edu-travel-common/edu-travel-common-openfeign/pom.xml

@@ -31,5 +31,16 @@
             <groupId>io.github.openfeign</groupId>
             <artifactId>feign-okhttp</artifactId>
         </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>io.github.openfeign.form</groupId>-->
+<!--            <artifactId>feign-form</artifactId>-->
+<!--            <version>3.8.0</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>io.github.openfeign.form</groupId>-->
+<!--            <artifactId>feign-form-spring</artifactId>-->
+<!--            <version>3.8.0</version>-->
+<!--        </dependency>-->
     </dependencies>
 </project>

+ 1 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/rpc/RPCBaseResponse.java

@@ -25,6 +25,7 @@ public class RPCBaseResponse<T> implements Serializable {
     public static <T> RPCBaseResponse<T> success(String message) {
         return new RPCBaseResponse<>(200, message, null);
     }
+
     public static <T> RPCBaseResponse<T> success(String message,T data) {
         return new RPCBaseResponse<>(200, message, data);
     }

+ 12 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductDto.java

@@ -0,0 +1,12 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+@Data
+public class InsertProductDto {
+
+
+
+    private String productName;
+//    private String productName;
+}

+ 2 - 0
edu-travel-remote/edu-travel-remote-country/src/main/java/edu/travel/remote/ShopCurrencyRemoteController.java

@@ -8,6 +8,7 @@ import edu.travel.vo.ShopCurrencyVo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -15,4 +16,5 @@ import java.util.List;
 public interface ShopCurrencyRemoteController extends RemoteBaseController<ShopCurrencyVo, ShopCurrencyDto> {
     @GetMapping("/getCurrencyPage")
     public RPCBaseResponse<IPage<ShopCurrencyVo>> getCurrencyPage(ShopCurrencyDto dto);
+
 }

+ 12 - 0
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/dto/GetOrderItemInfoByOrderNumDto.java

@@ -0,0 +1,12 @@
+package edu.travel.remote.dto;
+
+import edu.travel.po.PagePO;
+import lombok.Data;
+
+@Data
+public class GetOrderItemInfoByOrderNumDto extends PagePO {
+    /**
+     * 订单号
+     */
+    private String OrderNum;
+}

+ 2 - 1
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/order/ShopOrderItemRemoteController.java

@@ -7,6 +7,7 @@ import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -19,7 +20,7 @@ public interface ShopOrderItemRemoteController {
      * @return {@link RPCBaseResponse }<{@link OrderItemVo }>
      */
     @GetMapping("/getOrderItemVo")
-    public RPCBaseResponse<OrderItemVo> getOrderItemVo(GetOrderItemDto params);
+    public RPCBaseResponse<OrderItemVo> getOrderItemVo(@RequestParam("params") GetOrderItemDto params);
 
     /**
      *  新增订单商品信息

+ 7 - 9
edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/UploadRemoteController.java

@@ -4,17 +4,15 @@ import edu.travel.remote.upload.dto.EduFileBlobDTO;
 import edu.travel.remote.upload.dto.EduFileDTO;
 import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.cloud.openfeign.FeignClient;
-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.RequestParam;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.List;
 
-@FeignClient(name = "upload",path = "/upload")
+@FeignClient(name = "upload-dev",path = "/upload")
 public interface UploadRemoteController {
     @PostMapping("/init")
     public RPCBaseResponse<String> initializeUpload();
@@ -40,7 +38,7 @@ public interface UploadRemoteController {
      * @return
      */
     @PostMapping(value = "/uploadBlob",headers = {"content-type=multipart/form-data"})
-    RPCBaseResponse uploadBigFile(EduFileBlobDTO dto,  MultipartFile file) throws IOException;
+    RPCBaseResponse uploadBigFile(@RequestBody EduFileBlobDTO dto,  @RequestPart("file") MultipartFile file) throws IOException;
 
     /**
      * 合并大文件
@@ -52,9 +50,9 @@ public interface UploadRemoteController {
 
     /**
      * 上传小文件
-     * @param file
+     * @param
      * @return
      */
-    @PostMapping(value = "/upload",headers = {"content-type=multipart/form-data"})
-    RPCBaseResponse uploadFile(EduFileDTO eduFile,MultipartFile file) throws IOException;
+    @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    RPCBaseResponse uploadFile(@RequestParam("eduFileDTO") String dto,@RequestPart("file") MultipartFile file) throws IOException;
 }

+ 8 - 1
edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/dto/EduFileDTO.java

@@ -4,15 +4,21 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import edu.travel.entity.BaseEntity;
+import feign.form.FormProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.util.List;
 
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class EduFileDTO extends BaseEntity {
+public class EduFileDTO extends BaseEntity implements Serializable {
     private Long id;
 
     /**
@@ -43,4 +49,5 @@ public class EduFileDTO extends BaseEntity {
 
     private String uploadId;
 
+
 }

+ 1 - 1
edu-travel-service/edu-travel-service-commodity/pom.xml

@@ -180,7 +180,7 @@
         </dependency>
         <dependency>
             <groupId>edu.travel</groupId>
-            <artifactId>edu-travel-adapter-currency</artifactId>
+            <artifactId>edu-travel-adapter-upload</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
         <!--        <dependency>-->

+ 15 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/constant/BaseConstant.java

@@ -1,6 +1,10 @@
 package edu.travel.commodity.constant;
 
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
 public class BaseConstant {
     /**
      * 删除标记 正常
@@ -19,4 +23,15 @@ public class BaseConstant {
      */
     public static final Integer BASIC_IS_DEFAULT_YES = 0;
     public static final Integer BASIC_IS_DEFAULT_YES_NO = 1;
+
+    /**
+     * 商品文件上传图片类型
+     */
+    private static final Set<String> PRODUCT_IMAGE_TYPES = new HashSet<>(
+            Arrays.asList("jpg", "jpeg", "png")
+    );
+
+    public static Set<String> getProductImageTypes() {
+        return PRODUCT_IMAGE_TYPES;
+    }
 }

+ 2 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSkuService.java

@@ -14,5 +14,6 @@ public interface ShopProductSkuService extends IService<ShopProductSku>{
     Map<String, List<ShopSkuSpecValueVo>> getSkuValuesById(Set<String> skuId);
 
 
-    String shopProductSku(AddShopOrderDto params);
+    void shopProductSku(AddShopOrderDto params);
+
 }

+ 3 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopAddressServiceImpl.java

@@ -34,6 +34,7 @@ public class ShopAddressServiceImpl extends ServiceImpl<ShopAddressMapper, ShopA
 
     @Override
     public boolean updateAddressById(UpdateAddressDto param) {
+        String userId = TokenData.getUserId();
         if(!ObjectUtil.isEmpty(param.getCountryId())){
 //            BaseCountry byId = baseCountryService.getById(param.getCountryId());
 //            if(byId==null){
@@ -41,10 +42,11 @@ public class ShopAddressServiceImpl extends ServiceImpl<ShopAddressMapper, ShopA
 //            }
         }
         LambdaQueryWrapper<ShopAddress> query = Wrappers.<ShopAddress>lambdaQuery().eq(ShopAddress::getId, param.getId())
-                .eq(ShopAddress::getUserId, TokenData.getUserId());
+                .eq(ShopAddress::getUserId, userId);
         ShopAddress one = getOne(query);
         if(one==null){//新增
             ShopAddress bean = BeanUtil.toBean(param, ShopAddress.class);
+            bean.setUserId(Long.valueOf(userId));
             return save(bean);
         }
         if(!ObjectUtil.isEmpty(param.getCountryId())){

+ 24 - 15
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java

@@ -4,9 +4,10 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import edu.travel.adapter.service.country.CountryAdapter;
-import edu.travel.adapter.service.currency.CurrencyAdapter;
+import edu.travel.adapter.service.country.CurrencyAdapter;
 import edu.travel.adapter.service.order.OrderAdapter;
 import edu.travel.adapter.service.order.OrderItemAdapter;
 import edu.travel.adapter.service.order.ShopOrderLogAdapter;
@@ -20,6 +21,7 @@ import edu.travel.commodity.mapper.ShopProductSpecMapper;
 import edu.travel.commodity.service.ShopAddressService;
 import edu.travel.commodity.service.ShopProductService;
 import edu.travel.commodity.service.ShopProductSkuService;
+import edu.travel.commodity.utils.TokenData;
 import edu.travel.exception.BaseException;
 import edu.travel.remote.dto.*;
 import edu.travel.remote.vo.ShopSkuSpecValueVo;
@@ -84,8 +86,9 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
     }
 
     @Override
-    @GlobalTransactional
-    public String shopProductSku(AddShopOrderDto params) {
+//    @GlobalTransactional
+    public void shopProductSku(AddShopOrderDto params) {
+        String userId = TokenData.getUserId();
         List<AddShopProductOrderDto> products = params.getProducts();
         //商品ID
         Set<String> product = products.stream().map(AddShopProductOrderDto::getProductId).collect(Collectors.toSet());
@@ -119,7 +122,6 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
         }
         RLock multiLock = redissonClient.getMultiLock(locks);
 
-
         try {
             if(multiLock.tryLock(20, TimeUnit.SECONDS)){
                 List<ShopProductSku> ls = shopProductSkuMapper.getByProductSkus(products);
@@ -153,12 +155,12 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
                     }
                     //修改数量
                     shopProductSku.setFreeze(shopProductSku.getFreeze()+dto.getQuantity());
-                    //库存数量
-                    shopProductSku.setInventory(shopProductSku.getInventory()-dto.getQuantity());
                     //商品价格
                     BigDecimal multiply = shopProductSku.getPrice().multiply(new BigDecimal(dto.getQuantity()));
                     //总价
                     all=all.add(multiply);
+                    //快照信息
+                    Map<String, ShopSnapshotVo> snapshot = this.getSnapshot(products);
 
                     AddOrderItemDto addOrderItemDto = new AddOrderItemDto();
                     addOrderItemDto.setProductId(shopProduct.getId().toString());
@@ -166,9 +168,12 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
                     addOrderItemDto.setPrice(shopProductSku.getPrice());
                     addOrderItemDto.setQuantity(dto.getQuantity());
                     addOrderItemDto.setOrderId(orderNum+"");
-                    //快照信息 ShopSnapshotVo
 
-                    //addOrderItemDto.setSnapshot();
+                    ShopSnapshotVo shopSnapshotVo = snapshot.get(shopProductSku.getSkuId().toString());
+                    shopSnapshotVo.setProductName(shopProduct.getProductName());
+                    shopSnapshotVo.setDescription(shopProduct.getDescription());
+                    shopSnapshotVo.setImageUrl(shopProductSku.getImageUrl());
+                    addOrderItemDto.setSnapshot(JSONUtil.toJsonStr(shopSnapshotVo));
 
                     orderItems.add(addOrderItemDto);
                 }
@@ -181,10 +186,12 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
                 order.setAddressId(params.getAddressId());
                 order.setAddress(address.getDetailedAddress());
                 order.setGlobalCouponId(params.getGlobalCouponId());
-                order.setGlobalCouponId(country.getServiceChargeValue().toString());
+                order.setServiceChargeValue(country.getServiceChargeValue());
                 order.setOrderNumber(orderNum+"");
                 order.setCurrency(currency.getCurrencySymbol());
                 order.setCurrencyId(currency.getId().toString());
+                order.setOrderRemark(params.getRemark());
+                order.setUserId(userId);
 
                 orderAdapter.addShopOrder(order);
                 orderItemAdapter.addShopOrderItem(orderItems);
@@ -195,24 +202,26 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
                 shopOrderLogAdapter.addOrderLog(addOrderLogDto);
             }
         } catch (InterruptedException e) {
+            e.printStackTrace();
             throw new BaseException(e);
+        }finally {
+            multiLock.unlock();//解锁
         }
-        return "下单成功";
     }
 
+
     //获取商品快照信息
-    public Map<String,ShopSnapshotVo> getSnapshot(Set<String> skuId) {
-        Map<String, List<ShopSkuSpecValueVo>> specs = shopProductSkuService.getSkuValuesById(skuId);
+    public Map<String,ShopSnapshotVo> getSnapshot(List<AddShopProductOrderDto> products) {
+        Set<String> collect = products.stream().map(AddShopProductOrderDto::getSkuId).collect(Collectors.toSet());
+        Map<String, List<ShopSkuSpecValueVo>> specs = shopProductSkuService.getSkuValuesById(collect);
         HashMap<String, ShopSnapshotVo> map = new HashMap<>();
         specs.forEach((k,v)->{
             ShopSnapshotVo shopSnapshotVo = new ShopSnapshotVo();
+            shopSnapshotVo.setSkuId(k);
             List<SpecValueVo> specValueVos = BeanUtil.copyToList(v, SpecValueVo.class);
             shopSnapshotVo.setSnapshotSpec(specValueVos);
             map.put(k,shopSnapshotVo);
         });
-
-
-
         return map;
     }
 

+ 17 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/utils/FIleUtil.java

@@ -0,0 +1,17 @@
+package edu.travel.commodity.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class FIleUtil {
+
+    public static String calculateFileMd5(byte[] data) throws NoSuchAlgorithmException {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] digest = md.digest(data);
+        StringBuilder sb = new StringBuilder();
+        for (byte b : digest) {
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+    }
+}

+ 54 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductController.java

@@ -1,10 +1,19 @@
 package edu.travel.commodity.web;
 
+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 com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import edu.travel.adapter.service.upload.UploadAdapter;
+import edu.travel.commodity.constant.BaseConstant;
 import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.service.ShopProductService;
+import edu.travel.commodity.utils.FIleUtil;
 import edu.travel.remote.dto.GetProductByTypeDto;
+import edu.travel.remote.dto.InsertProductDto;
 import edu.travel.remote.dto.SearchProductDto;
+import edu.travel.remote.upload.dto.EduFileDTO;
 import edu.travel.resp.BaseResponse;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.remote.vo.ShopProductVo;
@@ -12,10 +21,13 @@ import edu.travel.web.BaseController;
 import org.springframework.web.bind.annotation.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.Date;
 import java.util.List;
 
+import static edu.travel.rpc.RPCBaseResponse.error;
 import static edu.travel.rpc.RPCBaseResponse.success;
 
 /**
@@ -24,13 +36,15 @@ import static edu.travel.rpc.RPCBaseResponse.success;
 * @author xxxxx
 */
 @RestController
-@RequestMapping("/shop_product")
+@RequestMapping("/shopProduct")
 public class ShopProductController extends BaseController<ShopProduct> {
 /**
 * 服务对象
 */
     @Autowired
     private ShopProductService shopProductService;
+    @Autowired
+    private UploadAdapter uploadAdapter;
 
     /**
      *  首页获取热门类别的热门商品
@@ -54,5 +68,44 @@ public class ShopProductController extends BaseController<ShopProduct> {
 
 
 
+    @PostMapping("/uploadProductImage")
+    public RPCBaseResponse<String> searchProduct(MultipartFile file) throws IOException {
+        if (file == null || file.isEmpty()) {
+            return error();
+        }
+        try {
+            // 通过文件的字节流获取真实类型(Hutool自动解析魔数)
+            String fileType = FileTypeUtil.getType(file.getInputStream());
+            // 判断类型是否在支持的图片类型集合中
+            if (fileType != null && BaseConstant.getProductImageTypes().contains(fileType.toLowerCase())) {
+                String filename = file.getOriginalFilename();
+                if(ObjectUtil.isEmpty(filename)){
+                    return error();
+                }
+                RPCBaseResponse<String> stringRPCBaseResponse = uploadAdapter.initializeUpload();
+
+                EduFileDTO eduFileDTO = new EduFileDTO();
+                eduFileDTO.setUploadId(stringRPCBaseResponse.getData());
+                eduFileDTO.setFileType(fileType);
+                eduFileDTO.setFileName(filename);
+                eduFileDTO.setFileSysName(IdUtil.fastSimpleUUID()+ DateUtil.format(new Date(),"yyyyMMddHHmmss") +"."+fileType);
+                eduFileDTO.setFileMd5(FIleUtil.calculateFileMd5(file.getBytes()));
+                RPCBaseResponse rpcBaseResponse = uploadAdapter.uploadFile(eduFileDTO, file);
+                return success(rpcBaseResponse.getData().toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 处理流读取异常或类型解析失败
+            return error("文件上传失败");
+        }
+        return error();
+    }
+
+
+
+    @PostMapping("/insertProduct")
+    public RPCBaseResponse<Void> insertProduct(@RequestBody InsertProductDto params){
+        return null;
+    }
 
 }

+ 7 - 3
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductSkuController.java

@@ -1,9 +1,12 @@
 package edu.travel.commodity.web;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.commodity.entity.ShopProductSku;
 import edu.travel.commodity.service.ShopProductSkuService;
 import edu.travel.remote.commodity.ShopProductSkuRemoteController;
 import edu.travel.remote.dto.AddShopOrderDto;
+import edu.travel.remote.dto.GetOrderItemInfoByOrderNumDto;
+import edu.travel.remote.vo.OrderItemVo;
 import edu.travel.remote.vo.ShopSkuSpecValueVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.web.BaseController;
@@ -47,9 +50,10 @@ public class ShopProductSkuController extends BaseController<ShopProductSku> imp
      * @return {@link RPCBaseResponse }<{@link String }>
      */
 
-    @GetMapping("/shopProductSku")
-    public RPCBaseResponse<String> shopProductSku(@RequestBody AddShopOrderDto params){
-        return RPCBaseResponse.success(shopProductSkuService.shopProductSku(params));
+    @PostMapping("/shopProductSku")
+    public RPCBaseResponse<Void> shopProductSku(@RequestBody AddShopOrderDto params){
+        shopProductSkuService.shopProductSku(params);
+        return RPCBaseResponse.success();
     }
 
 }

+ 2 - 2
edu-travel-service/edu-travel-service-country/src/main/java/edu/travel/country/web/ShopCurrencyController.java

@@ -22,7 +22,7 @@ import java.util.List;
 * @author xxxxx
 */
 @RestController
-@RequestMapping("/shop_currency")
+@RequestMapping("/shopCurrency")
 public class ShopCurrencyController extends BaseController<ShopCurrency> implements ShopCurrencyRemoteController {
 /**
 * 服务对象
@@ -44,7 +44,7 @@ public class ShopCurrencyController extends BaseController<ShopCurrency> impleme
      */
 
     @Override
-    @GetMapping("/getCurrencyFormId")
+    @GetMapping("/getFormId")
     public RPCBaseResponse<ShopCurrencyVo> getFormId(String id) {
         RPCBaseResponse<ShopCurrency> shopCurrencyRPCBaseResponse = super.getId(id);
         RPCBaseResponse<ShopCurrencyVo> shopCurrencyVoRPCBaseResponse = new RPCBaseResponse<>();

+ 0 - 1
edu-travel-service/edu-travel-service-order/pom.xml

@@ -99,7 +99,6 @@
             <groupId>com.alibaba.csp</groupId>
             <artifactId>sentinel-web-servlet</artifactId>
         </dependency>
-
         <dependency>
             <groupId>edu.travel</groupId>
             <artifactId>edu-travel-common-util</artifactId>

+ 14 - 2
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderController.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.order.entity.ShopOrder;
 import edu.travel.order.service.ShopOrderService;
 import edu.travel.remote.dto.AddOrderDto;
+import edu.travel.remote.dto.GetOrderItemInfoByOrderNumDto;
 import edu.travel.remote.dto.ShowOrderInfoDto;
 import edu.travel.remote.order.ShopOrderRemoteController;
+import edu.travel.remote.vo.OrderItemVo;
 import edu.travel.remote.vo.ShowOrderInfoVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.web.BaseController;
@@ -31,15 +33,25 @@ public class ShopOrderController extends BaseController<ShopOrder> implements Sh
         return success(shopOrderService.showOrderInfo(params));
     }
     /**
-     *  下单
+     *  下单生成订单
      * @return {@link RPCBaseResponse }<{@link Void }>
      */
     @Override
-    public RPCBaseResponse<Void> addShopOrder(AddOrderDto params) {
+    @PostMapping("/addShopOrder")
+    public RPCBaseResponse<Void> addShopOrder(@RequestBody AddOrderDto params) {
         shopOrderService.addShopOrder(params);
         return success();
     }
+    /**
+     *  查询订单下的商品快照
+     * @param params 订单号
+     * @return {@link RPCBaseResponse }<{@link String }>
+     */
 
+    @GetMapping("/getOrderItemInfo")
+    public RPCBaseResponse<Page<OrderItemVo>> getOrderItemInfo(GetOrderItemInfoByOrderNumDto params){
+        return RPCBaseResponse.success(shopOrderService.getOrderItemInfo(params));
+    }
 
 
 }

+ 16 - 2
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderItemController.java

@@ -3,9 +3,15 @@ package edu.travel.order.controller;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import edu.travel.exception.BaseException;
+import edu.travel.order.entity.ShopOrder;
 import edu.travel.order.entity.ShopOrderItem;
+import edu.travel.order.enums.OrderStateEnum;
 import edu.travel.order.service.ShopOrderItemService;
+import edu.travel.order.service.ShopOrderService;
 import edu.travel.remote.dto.AddOrderItemDto;
 import edu.travel.remote.dto.GetOrderItemDto;
 import edu.travel.remote.order.ShopOrderItemRemoteController;
@@ -15,6 +21,7 @@ import edu.travel.remote.vo.SpecValueVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -28,6 +35,8 @@ public class ShopOrderItemController extends BaseController<ShopOrderItem> imple
 
     @Autowired
     private ShopOrderItemService shopOrderItemService;
+    @Autowired
+    private ShopOrderService shopOrderService;
 
     /**
      *  获取订单商品详情
@@ -37,8 +46,13 @@ public class ShopOrderItemController extends BaseController<ShopOrderItem> imple
 
     @Override
     @GetMapping("/getOrderItemVo")
-    public RPCBaseResponse<OrderItemVo> getOrderItemVo(@RequestBody GetOrderItemDto params) {
-
+    public RPCBaseResponse<OrderItemVo> getOrderItemVo(GetOrderItemDto params) {
+        LambdaQueryWrapper<ShopOrder> orderQuery = Wrappers.<ShopOrder>lambdaQuery().eq(ShopOrder::getOrderNumber, params.getOrderId())
+                .eq(ShopOrder::getStatus, OrderStateEnum.AWAITING_EVALUATION.getState());
+        ShopOrder one = shopOrderService.getOne(orderQuery);
+        if(ObjectUtil.isEmpty(one)){
+            throw new BaseException("订单还未完结不能评价");
+        }
         LambdaQueryChainWrapper<ShopOrderItem> query = shopOrderItemService.lambdaQuery().eq(ShopOrderItem::getSkuId, params.getSkuId())
                 .eq(ShopOrderItem::getOrderId, params.getOrderId())
                 .eq(ShopOrderItem::getProductId, params.getProductId());

+ 2 - 1
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderTypeChangeController.java

@@ -8,6 +8,7 @@ import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
 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.RestController;
 
@@ -22,7 +23,7 @@ public class ShopOrderTypeChangeController extends BaseController<ShopOrderTypeC
 
     @Override
     @PostMapping("/addOrderLog")
-    public RPCBaseResponse<Void> addOrderLog(AddOrderLogDto params) {
+    public RPCBaseResponse<Void> addOrderLog(@RequestBody AddOrderLogDto params) {
         shopOrderTypeChangeService.addOrderLog(params);
         return success();
     }

+ 46 - 0
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/enums/OrderStateEnum.java

@@ -0,0 +1,46 @@
+package edu.travel.order.enums;
+
+import lombok.Getter;
+
+/**
+ * 类功能描述:
+ *  订单状态枚举
+ * @author 大春
+ * @date 2025/03/06
+ */
+@Getter
+public enum OrderStateEnum {
+    WAITING_FOR_PAYMENT(0, "待付款"),
+    ORDERED(1, "已下单"),
+    AWAITING_SHIPMENT(2, "待发货"),
+    AWAITING_RECEIPT(3, "待收货"),
+    AWAITING_EVALUATION(4, "待评价"),
+    COMPLETED(5, "已完成"),
+    CANCELLED(6, "已取消");
+
+    private final int state;
+    private final String name;
+
+    OrderStateEnum(int state, String name) {
+        this.state = state;
+        this.name = name;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static OrderStateEnum fromState(int state) {
+        for (OrderStateEnum orderState : values()) {
+            if (orderState.getState() == state) {
+                return orderState;
+            }
+        }
+        throw new IllegalArgumentException("No matching enum found for state: " + state);
+    }
+
+}

+ 4 - 0
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/service/ShopOrderService.java

@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.order.entity.ShopOrder;
 import edu.travel.remote.dto.AddOrderDto;
+import edu.travel.remote.dto.GetOrderItemInfoByOrderNumDto;
 import edu.travel.remote.dto.ShowOrderInfoDto;
+import edu.travel.remote.vo.OrderItemVo;
 import edu.travel.remote.vo.ShowOrderInfoVo;
 
 public interface ShopOrderService extends IService<ShopOrder> {
@@ -13,4 +15,6 @@ public interface ShopOrderService extends IService<ShopOrder> {
     Page<ShowOrderInfoVo> showOrderInfo(ShowOrderInfoDto params);
 
     void addShopOrder(AddOrderDto params);
+
+    Page<OrderItemVo> getOrderItemInfo(GetOrderItemInfoByOrderNumDto params);
 }

+ 18 - 0
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/service/impl/ShopOrderServiceImpl.java

@@ -16,6 +16,7 @@ import edu.travel.order.service.ShopOrderService;
 import edu.travel.order.utils.PageUtil;
 import edu.travel.order.utils.TokenData;
 import edu.travel.remote.dto.AddOrderDto;
+import edu.travel.remote.dto.GetOrderItemInfoByOrderNumDto;
 import edu.travel.remote.dto.ShowOrderInfoDto;
 import edu.travel.remote.vo.OrderItemVo;
 import edu.travel.remote.vo.ShopSnapshotVo;
@@ -75,8 +76,25 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
 
     @Override
     public void addShopOrder(AddOrderDto params) {
+        ShopOrder bean = BeanUtil.toBean(params, ShopOrder.class);
+        save(bean);
+    }
 
+    @Override
+    public Page<OrderItemVo> getOrderItemInfo(GetOrderItemInfoByOrderNumDto params) {
+        LambdaQueryWrapper<ShopOrderItem> query = Wrappers.<ShopOrderItem>lambdaQuery().eq(ShopOrderItem::getOrderId, params.getOrderNum());
+        Page<ShopOrderItem> page = shopOrderItemService.page(new Page<>(params.getCurrentPage(), params.getPageSize()), query);
 
+        Page<OrderItemVo> pageEntity = PageUtil.toPageEntity(page, OrderItemVo.class);
+        List<OrderItemVo> records = pageEntity.getRecords();
+        if(ObjectUtil.isEmpty(records)){
+            return pageEntity;
+        }
+        for (OrderItemVo record : records) {
+            ShopSnapshotVo bean1 = JSONUtil.toBean(record.getSnapshot(), ShopSnapshotVo.class);
+            record.setShopSnapshotVo(bean1);
+        }
+        return pageEntity;
     }
 
 

+ 1 - 1
edu-travel-service/edu-travel-service-order/src/main/resources/mapper/ShopOrderTypeChangeMapper.xml

@@ -6,6 +6,7 @@
     <!--@Table shop_order_type_change-->
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="order_id" jdbcType="VARCHAR" property="orderId" />
+    <result column="description" jdbcType="VARCHAR" property="description" />
     <result column="status" jdbcType="INTEGER" property="status" />
     <result column="project" jdbcType="VARCHAR" property="project" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@@ -13,7 +14,6 @@
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
     <result column="update_user_id" jdbcType="VARCHAR" property="updateUserId" />
     <result column="delete_flag" jdbcType="INTEGER" property="deleteFlag" />
-    <result column="description" jdbcType="VARCHAR" property="description" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->

+ 4 - 0
edu-travel-service/edu-travel-service-upload/pom.xml

@@ -144,6 +144,10 @@
             <scope>compile</scope>
         </dependency>
         <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
             <groupId>edu.travel</groupId>
             <artifactId>edu-travel-remote-upload</artifactId>
             <version>1.0-SNAPSHOT</version>

+ 13 - 8
edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java

@@ -1,5 +1,6 @@
 package edu.travel.upload.web;
 
+import com.alibaba.fastjson.JSON;
 import com.obs.services.ObsClient;
 import com.obs.services.model.*;
 import edu.travel.remote.upload.UploadRemoteController;
@@ -17,6 +18,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -28,6 +30,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.ThreadPoolExecutor;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/upload")
@@ -46,7 +49,7 @@ public class UploadController implements UploadRemoteController {
     @PostMapping("/init")
     public RPCBaseResponse<String> initializeUpload() {
         String uploadId = UUID.randomUUID().toString()+System.currentTimeMillis();
-        return RPCBaseResponse.success(uploadId);
+        return RPCBaseResponse.success(null,uploadId);
     }
 
     /**
@@ -120,21 +123,23 @@ public class UploadController implements UploadRemoteController {
     }
     /**
      * 上传小文件
-     * @param file
+     * @param
      * @return
      */
     @Override
-    @PostMapping(value = "/upload",headers = {"content-type=multipart/form-data"})
+    @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     @PreAuthorize("permitAll()")
-    public RPCBaseResponse uploadFile(EduFileDTO eduFile,MultipartFile file) throws IOException {
-        PutObjectResult putObjectResult = obsClient.putObject(obsProperties.getBucketName(), "/service/chunk/" + eduFile.getUploadId() + "/" + file.getOriginalFilename(), file.getInputStream());
+    public RPCBaseResponse uploadFile(@RequestParam("eduFileDTO") String dto,@RequestPart("file") MultipartFile file) throws IOException {
+        EduFileDTO eduFileDTO = JSON.parseObject(dto, EduFileDTO.class);
+        PutObjectResult putObjectResult = obsClient.putObject(obsProperties.getBucketName(), "/service/chunk/" + eduFileDTO.getUploadId() + "/" + file.getOriginalFilename(), file.getInputStream());
         String objectUrl = putObjectResult.getObjectUrl();
         EduFile files = new EduFile();
-        BeanUtils.copyProperties(files, eduFile);
-        eduFile.setFilePath(objectUrl);
+        BeanUtils.copyProperties(eduFileDTO, files);
+        files.setFilePath(objectUrl);
+
         boolean save = eduFileService.save(files);
         if (save){
-            return RPCBaseResponse.success(files.getId().toString());
+            return RPCBaseResponse.success(files.getId());
         }
         return RPCBaseResponse.error();
     }