فهرست منبع

feat:评价订单

zhangwei 4 روز پیش
والد
کامیت
49938c61d2
24فایلهای تغییر یافته به همراه548 افزوده شده و 38 حذف شده
  1. 15 0
      edu-travel-adapter/edu-travel-adapter-order/src/main/java/edu/travel/adapter/service/order/OrderAdapter.java
  2. 19 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/PayShopOrderDto.java
  3. 4 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ShopFavoriteVo.java
  4. 1 2
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/dto/GetOrderItemDto.java
  5. 106 0
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/dto/ShopOrderDto.java
  6. 3 3
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/order/ShopOrderItemRemoteController.java
  7. 14 1
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/order/ShopOrderRemoteController.java
  8. 106 0
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/vo/ShopOrderVo.java
  9. 1 1
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/vo/ShopSnapshotVo.java
  10. 26 0
      edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/vo/SpecValueVo.java
  11. 4 6
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/enums/OrderStateEnum.java
  12. 4 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSkuService.java
  13. 3 3
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopAddressServiceImpl.java
  14. 61 10
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java
  15. 2 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSpecServiceImpl.java
  16. 17 2
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopReviewServiceImpl.java
  17. 26 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopFavoriteController.java
  18. 13 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductSkuController.java
  19. 60 0
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderController.java
  20. 3 2
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderItemController.java
  21. 4 6
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/enums/OrderStateEnum.java
  22. 4 0
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/service/ShopOrderService.java
  23. 52 0
      edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/service/impl/ShopOrderServiceImpl.java
  24. 0 1
      pom.xml

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

@@ -3,6 +3,8 @@ package edu.travel.adapter.service.order;
 import edu.travel.adapter.annotation.AdapterAnnotation;
 import edu.travel.remote.dto.AddOrderDto;
 import edu.travel.remote.order.ShopOrderRemoteController;
+import edu.travel.remote.vo.ShopOrderVo;
+import edu.travel.remote.vo.ShowOrderInfoVo;
 import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -15,4 +17,17 @@ public class OrderAdapter {
     public RPCBaseResponse<Void> addShopOrder(AddOrderDto params) {
        return shopOrderRemoteController.addShopOrder(params);
     }
+
+    @AdapterAnnotation
+    public RPCBaseResponse<ShowOrderInfoVo> orderInfoByOrderNum(String orderNum) {
+        return shopOrderRemoteController.orderInfoByOrderNum(orderNum);
+    }
+    @AdapterAnnotation
+    public RPCBaseResponse<Void> changeOrderState(String orderNum,String state) {
+        return shopOrderRemoteController.changeOrderState(orderNum,state);
+    }
+    @AdapterAnnotation
+    public RPCBaseResponse<ShopOrderVo> getFormId(String orderId) {
+        return shopOrderRemoteController.getFormId(orderId);
+    }
 }

+ 19 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/PayShopOrderDto.java

@@ -0,0 +1,19 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class PayShopOrderDto {
+    /**
+     * 订单号
+     */
+    private String orderNum;
+
+    /**
+     * 支付时间
+     */
+    private Date payTime;
+
+}

+ 4 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/vo/ShopFavoriteVo.java

@@ -6,6 +6,10 @@ import java.math.BigDecimal;
 @Data
 public class ShopFavoriteVo {
     /**
+     * 收藏表ID
+     */
+    private String id;
+    /**
      * 商品ID
      */
     private String productId;

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

@@ -2,10 +2,9 @@ package edu.travel.remote.dto;
 
 import lombok.Data;
 
-import java.io.Serializable;
 
 @Data
-public class GetOrderItemDto implements Serializable {
+public class GetOrderItemDto{
 
     private String orderId;
 

+ 106 - 0
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/dto/ShopOrderDto.java

@@ -0,0 +1,106 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class ShopOrderDto {
+    /**
+     * 订单表ID
+     */
+    private String id;
+
+    /**
+     * 仓库ID
+     */
+    private Long warehouseId;
+
+    /**
+     * 订单备注
+     */
+    private String orderRemark;
+
+    /**
+     * 国家id
+     */
+    private String countryId;
+
+    /**
+     * 服务费id
+     */
+    private String serviceChargeId;
+
+    /**
+     * 服务费比率
+     */
+    private BigDecimal serviceChargeValue;
+
+    /**
+     * 支付方式id
+     */
+    private String payId;
+
+    /**
+     * 支付方法值
+     */
+    private String payWayValue;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 收货地址
+     */
+    private String addressId;
+
+    /**
+     * 收货地址
+     */
+    private String address;
+    /**
+     * 订单号
+     */
+    private String orderNumber;
+
+    /**
+     * 累计金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 货币
+     */
+    private String currencyId;
+    /**
+     * 货币
+     */
+    private String currency;
+    /**
+     * 汇率
+     */
+    private BigDecimal exchangeRate;
+
+    /**
+     * 0待付款, 1已下单, 2待发货,3待收货,4待评价,5已完成,6已取消
+     */
+    private Integer status;
+
+    /**
+     * 支付时间
+     */
+    private Date paymentTime;
+
+    /**
+     * 优惠券抵扣金额
+     */
+    private BigDecimal couponDiscount;
+
+    /**
+     * 平台优惠券ID
+     */
+    private String globalCouponId;
+}

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

@@ -7,7 +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 org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -19,8 +19,8 @@ public interface ShopOrderItemRemoteController {
      * @param params
      * @return {@link RPCBaseResponse }<{@link OrderItemVo }>
      */
-    @GetMapping("/getOrderItemVo")
-    public RPCBaseResponse<OrderItemVo> getOrderItemVo(@RequestParam("params") GetOrderItemDto params);
+    @PostMapping("/getOrderItemVo")
+    public RPCBaseResponse<OrderItemVo> getOrderItemVo(@RequestBody GetOrderItemDto params);
 
     /**
      *  新增订单商品信息

+ 14 - 1
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/order/ShopOrderRemoteController.java

@@ -1,12 +1,25 @@
 package edu.travel.remote.order;
 
+import edu.travel.remote.base.RemoteBaseController;
 import edu.travel.remote.dto.AddOrderDto;
+import edu.travel.remote.dto.ShopOrderDto;
+import edu.travel.remote.vo.ShopOrderVo;
+import edu.travel.remote.vo.ShowOrderInfoVo;
 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;
 
 @FeignClient(name = "order-dev",path = "/shopOrder")
-public interface ShopOrderRemoteController {
+public interface ShopOrderRemoteController extends RemoteBaseController<ShopOrderVo,ShopOrderDto> {
     @PostMapping("/addShopOrder")
     RPCBaseResponse<Void> addShopOrder(AddOrderDto params);
+
+    @GetMapping("/orderInfoByOrderNum")
+    public RPCBaseResponse<ShowOrderInfoVo> orderInfoByOrderNum(@RequestParam("orderNum") String orderNum);
+
+    @GetMapping("/changeOrderState")
+    public RPCBaseResponse<Void> changeOrderState(@RequestParam("orderNum") String orderNum,@RequestParam("state") String state);
+
 }

+ 106 - 0
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/vo/ShopOrderVo.java

@@ -0,0 +1,106 @@
+package edu.travel.remote.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class ShopOrderVo {
+    /**
+     * 订单表ID
+     */
+    private String id;
+
+    /**
+     * 仓库ID
+     */
+    private String warehouseId;
+
+    /**
+     * 订单备注
+     */
+    private String orderRemark;
+
+    /**
+     * 国家id
+     */
+    private String countryId;
+
+    /**
+     * 服务费id
+     */
+    private String serviceChargeId;
+
+    /**
+     * 服务费比率
+     */
+    private BigDecimal serviceChargeValue;
+
+    /**
+     * 支付方式id
+     */
+    private String payId;
+
+    /**
+     * 支付方法值
+     */
+    private String payWayValue;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 收货地址
+     */
+    private String addressId;
+
+    /**
+     * 收货地址
+     */
+    private String address;
+    /**
+     * 订单号
+     */
+    private String orderNumber;
+
+    /**
+     * 累计金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 货币
+     */
+    private String currencyId;
+    /**
+     * 货币
+     */
+    private String currency;
+    /**
+     * 汇率
+     */
+    private BigDecimal exchangeRate;
+
+    /**
+     * 0待付款, 1已下单, 2待发货,3待收货,4待评价,5已完成,6已取消
+     */
+    private Integer status;
+
+    /**
+     * 支付时间
+     */
+    private Date paymentTime;
+
+    /**
+     * 优惠券抵扣金额
+     */
+    private BigDecimal couponDiscount;
+
+    /**
+     * 平台优惠券ID
+     */
+    private String globalCouponId;
+}

+ 1 - 1
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/vo/ShopSnapshotVo.java

@@ -35,6 +35,6 @@ public class ShopSnapshotVo {
     /**
      * 商品快照规格 SpecValueVo
      */
-    private List snapshotSpec;
+    private List<SpecValueVo> snapshotSpec;
 
 }

+ 26 - 0
edu-travel-remote/edu-travel-remote-order/src/main/java/edu/travel/remote/vo/SpecValueVo.java

@@ -0,0 +1,26 @@
+package edu.travel.remote.vo;
+
+import lombok.Data;
+
+/**
+ * 类功能描述:
+ *     购物车商品规格值
+ * @author 大春
+ * @date 2025/02/28
+ */
+
+@Data
+public class SpecValueVo {
+    /**
+     * 规格值id
+     */
+    private String specValueId;
+    /**规格值*/
+    private String specValue;
+    /**
+     * 规格值id
+     */
+    private String specId;
+    /**规格名称*/
+    private String specName;
+}

+ 4 - 6
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/enums/OrderStateEnum.java

@@ -11,12 +11,10 @@ import lombok.Getter;
 @Getter
 public enum OrderStateEnum {
     WAITING_FOR_PAYMENT(0, "待付款"),
-    ORDERED(1, "已下单"),
-    AWAITING_SHIPMENT(2, "待发货"),
-    AWAITING_RECEIPT(3, "待收货"),
-    AWAITING_EVALUATION(4, "待评价"),
-    COMPLETED(5, "已完成"),
-    CANCELLED(6, "已取消");
+    ORDERED(1, "已下单,待发货"),
+    AWAITING_RECEIPT(2, "待收货"),
+    AWAITING_EVALUATION(3, "已完成"),
+    CANCELLED(4, "已取消");
 
     private final int state;
     private final String name;

+ 4 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSkuService.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.remote.dto.AddShopOrderDto;
 import edu.travel.remote.dto.InsertProductSkuDto;
 import edu.travel.remote.dto.InsertProductSpecDto;
+import edu.travel.remote.dto.PayShopOrderDto;
 import edu.travel.remote.vo.ShopSkuSpecValueVo;
 
 import java.util.List;
@@ -20,4 +21,7 @@ public interface ShopProductSkuService extends IService<ShopProductSku>{
     void shopProductSku(AddShopOrderDto params);
 
     boolean insertProductSku(List<InsertProductSpecDto> specs,List<InsertProductSkuDto> skus, ShopProduct id);
+
+    void payProductSku(PayShopOrderDto payShopOrderDto);
+
 }

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

@@ -24,10 +24,10 @@ public class ShopAddressServiceImpl extends ServiceImpl<ShopAddressMapper, ShopA
     @Override
     public Page<ShopAddressVo> getShopAddress(BaseDto dto) {
         //当前登录对象
-        Page<ShopAddress> page = lambdaQuery().eq(ShopAddress::getCountryId, dto.getCountryId())
+        LambdaQueryWrapper<ShopAddress> query = Wrappers.<ShopAddress>lambdaQuery().eq(ShopAddress::getCountryId, dto.getCountryId())
                 .eq(ShopAddress::getUserId, TokenData.getUserId())
-                .orderByAsc(ShopAddress::getIsDefault)
-                .page(new Page<ShopAddress>(dto.getCurrentPage(), dto.getPageSize()));
+                .orderByAsc(ShopAddress::getIsDefault);
+        Page<ShopAddress> page = page(new Page<ShopAddress>(dto.getCurrentPage(), dto.getPageSize()), query);
         //page对象转换.
         return PageUtil.toPageEntity(page, ShopAddressVo.class);
     }

+ 61 - 10
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java

@@ -23,18 +23,14 @@ import edu.travel.commodity.service.ShopAddressService;
 import edu.travel.commodity.service.ShopProductService;
 import edu.travel.commodity.service.ShopProductSkuService;
 import edu.travel.commodity.service.ShopSkuSpecValueService;
-import edu.travel.commodity.utils.StringUtil;
 import edu.travel.commodity.utils.TokenData;
 import edu.travel.exception.BaseException;
 import edu.travel.remote.dto.*;
-import edu.travel.remote.vo.ShopSkuSpecValueVo;
-import edu.travel.remote.vo.ShopSnapshotVo;
-import edu.travel.remote.vo.SpecValueVo;
+import edu.travel.remote.vo.*;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.vo.BaseCountryServeVo;
 import edu.travel.vo.ShopCurrencyVo;
 import io.seata.spring.annotation.GlobalTransactional;
-import org.checkerframework.checker.units.qual.C;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,6 +42,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -100,7 +97,7 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
         //商品ID
         Set<String> product = products.stream().map(AddShopProductOrderDto::getProductId).collect(Collectors.toSet());
         List<ShopProduct> list1 = shopProductService.lambdaQuery().in(ShopProduct::getId, product).eq(ShopProduct::getStatus, 0).list();
-        if(list1.size()<products.size()){
+        if(list1.size()!=product.size()){
             throw new BaseException("商品不存在");
         }
         HashMap<String, ShopProduct> productMap = new HashMap<>();
@@ -244,14 +241,12 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
                 for (SkuValueDto skuValues : insertProductSkuDto.getSkuValues()) {
                     ShopSkuSpecValue skuValue = new ShopSkuSpecValue();
                     skuValue.setSkuId(bean.getSkuId());
-                    skuValue.setSpecId(Long.valueOf(skuValues.getSpecId()));
-                    List<InsertProductSpecDto> collect = specs.stream().filter(spec -> spec.getSpecId().equals(skuValues.getSpecId()))
-                            .collect(Collectors.toList());
+                    List<InsertProductSpecDto> collect = specs.stream().filter(spec -> spec.getSpecName().equals(skuValues.getSpecName())).collect(Collectors.toList());
                     if(ObjectUtil.isEmpty(collect)){
                        throw new BaseException("规格不存在");
                     }
                     InsertProductSpecDto insertProductSpecDto = collect.get(0);
-
+                    skuValue.setSpecId(Long.valueOf(insertProductSpecDto.getSpecId()));
                     List<SpecValueDto> collect1 = insertProductSpecDto.getSpecValues().stream()
                             .filter(specValue -> specValue.getSpecValueName().equals(skuValues.getSpecValueName())).collect(Collectors.toList());
                     skuValue.setSpecValueId(Long.valueOf(collect1.get(0).getSpecValueId()));
@@ -264,6 +259,62 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
         return saveBatch(shopProductSkus);
     }
 
+    @Override
+//    @GlobalTransactional
+    public void payProductSku(PayShopOrderDto payShopOrderDto) {
+        //查询订单
+        RPCBaseResponse<ShowOrderInfoVo> showOrderInfoVoRPCBaseResponse = orderAdapter.orderInfoByOrderNum(payShopOrderDto.getOrderNum());
+        if(showOrderInfoVoRPCBaseResponse.getCode()!=200){
+            throw new BaseException(showOrderInfoVoRPCBaseResponse.getMsg());
+        }
+        ShowOrderInfoVo data = showOrderInfoVoRPCBaseResponse.getData();
+        if(!data.getStatus().equals(OrderStateEnum.WAITING_FOR_PAYMENT.getState())){
+            throw new BaseException("订单状态有误");
+        }
+
+        List<OrderItemVo> orderItemVoList = data.getOrderItemVoList();
+        List<AddShopProductOrderDto> products = new ArrayList<AddShopProductOrderDto>();
+        Map<String, OrderItemVo> itemMap = new ConcurrentHashMap<>();
+        for (OrderItemVo orderItemVo : orderItemVoList) {
+            itemMap.put(orderItemVo.getProductId()+":"+orderItemVo.getSkuId(),orderItemVo);
+            AddShopProductOrderDto addShopProductOrderDto = new AddShopProductOrderDto();
+            addShopProductOrderDto.setProductId(orderItemVo.getProductId());
+            addShopProductOrderDto.setSkuId(orderItemVo.getSkuId());
+            products.add(addShopProductOrderDto);
+        }
+        List<String> collect = orderItemVoList.stream().map(item -> item.getProductId() + ":" + item.getSkuId()).sorted()
+                .collect(Collectors.toList());
+        RLock[] locks=new RLock[collect.size()];
+        for (int i = 0; i < locks.length; i++) {
+            String s = collect.get(i);
+            locks[i] = redissonClient.getFairLock(RedisKey.PRODUCT_ORDER+s);
+        }
+        RLock multiLock = redissonClient.getMultiLock(locks);
+        //扣除冻结和库存
+        try {
+            if(multiLock.tryLock(20, TimeUnit.SECONDS)){
+                List<ShopProductSku> ls = shopProductSkuMapper.getByProductSkus(products);
+                for (ShopProductSku shopProductSku : ls) {
+                    OrderItemVo orderItemVo = itemMap.get(shopProductSku.getProductId() + ":" + shopProductSku.getSkuId());
+                    String quantity = orderItemVo.getQuantity();
+                    int i = Integer.parseInt(quantity);
+                    //扣除冻结
+                    shopProductSku.setFreeze(shopProductSku.getFreeze()-i);
+                    //扣除库存
+                    shopProductSku.setInventory(shopProductSku.getInventory()-i);
+                }
+                updateBatchById(ls);
+                // 订单状态扭转
+                orderAdapter.changeOrderState(payShopOrderDto.getOrderNum(),OrderStateEnum.AWAITING_RECEIPT.getState()+"");
+            }
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            throw new BaseException(e);
+        }finally {
+            multiLock.unlock();//解锁
+        }
+    }
+
 
     //获取商品快照信息
     public Map<String,ShopSnapshotVo> getSnapshot(List<AddShopProductOrderDto> products) {

+ 2 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSpecServiceImpl.java

@@ -126,6 +126,8 @@ public class ShopProductSpecServiceImpl extends ServiceImpl<ShopProductSpecMappe
             ShopProductSpec shopProductSpec = new ShopProductSpec();
             long id = IdUtils.getSnowflakeId();
             shopProductSpec.setId(id);
+            //覆盖id后期存sku 和 规格关联
+            spec.setSpecId(id+"");
             shopProductSpec.setProductId(bean.getId());
             shopProductSpec.setSpecName(spec.getSpecName());
             shopProductSpec.setSpecId(Long.valueOf(spec.getSpecId()));

+ 17 - 2
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopReviewServiceImpl.java

@@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.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;
@@ -38,6 +40,8 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
     private TenantAdapter tenantAdapter;
     @Autowired
     private OrderItemAdapter orderItemAdapter;
+    @Autowired
+    private OrderAdapter orderAdapter;
     @Override
     public Page<ShopReviewVo> getShopReview(ProductSpecDto params) {
         LambdaQueryWrapper<ShopReview> query = Wrappers.<ShopReview>lambdaQuery()
@@ -78,9 +82,20 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
 
     @Override
     public String addReview(AddReviewDto params) {
+        RPCBaseResponse<ShopOrderVo> resultValue = orderAdapter.getFormId(params.getOrderId());
+        if(resultValue.getCode()!=200){
+            throw new BaseException("订单不存在");
+        }
+        ShopOrderVo data1 = resultValue.getData();
+        if(!data1.getStatus().equals(OrderStateEnum.AWAITING_EVALUATION.getState())){
+            throw new BaseException("订单未完结,不能评价");
+        }
+
         String userId = TokenData.getUserId();
-        LambdaQueryWrapper<ShopReview> query = Wrappers.<ShopReview>lambdaQuery().eq(ShopReview::getUserId, userId)
+        LambdaQueryWrapper<ShopReview> query = Wrappers.<ShopReview>lambdaQuery()
+                .eq(ShopReview::getUserId, userId)
                 .eq(ShopReview::getOrderId, params.getOrderId())
+                .eq(ShopReview::getSkuId, params.getSkuId())
                 .eq(ShopReview::getProductId, params.getProductId());
         List<ShopReview> list = list(query);
         if(!ObjectUtil.isEmpty(list)){
@@ -107,7 +122,7 @@ public class ShopReviewServiceImpl extends ServiceImpl<ShopReviewMapper, ShopRev
         if(!ObjectUtil.isEmpty(snapshot)){
             //订单快照对象
             ShopSnapshotVo bean1 = JSONUtil.toBean(snapshot, ShopSnapshotVo.class);
-            List<Object> snapshotSpec = bean1.getSnapshotSpec();
+            List<SpecValueVo> snapshotSpec = bean1.getSnapshotSpec();
             List<SpecValueVo> snapshot1 = ObjectUtils.castList(snapshotSpec, SpecValueVo.class);
             String jsonStr = JSONUtil.toJsonStr(snapshot1);
             bean.setSkuDetails(jsonStr);

+ 26 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopFavoriteController.java

@@ -1,7 +1,11 @@
 package edu.travel.commodity.web;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import edu.travel.commodity.entity.ShopFavorite;
 import edu.travel.commodity.service.ShopFavoriteService;
+import edu.travel.commodity.utils.TokenData;
 import edu.travel.remote.dto.AddFavoriteDto;
 import edu.travel.remote.dto.BaseDto;
 import edu.travel.rpc.RPCBaseResponse;
@@ -10,6 +14,8 @@ import org.springframework.web.bind.annotation.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.Set;
+
 import static edu.travel.rpc.RPCBaseResponse.success;
 
 /**
@@ -42,9 +48,28 @@ public class ShopFavoriteController {
      * @return {@link RPCBaseResponse }<{@link Void }>
      */
 
-    @GetMapping("/addFavorite")
+    @PostMapping("/addFavorite")
     public RPCBaseResponse<Void> addFavorite(@RequestBody AddFavoriteDto params){
         shopFavoriteService.addFavorite(params);
         return success();
     }
+
+    /**
+     * 移除收藏
+     */
+    @PostMapping("/removeFavorite")
+    public RPCBaseResponse<Void> removeFavorite(@RequestBody Set<String> ids){
+        shopFavoriteService.removeByIds(ids);
+        return success();
+    }
+
+    /**
+     * 全部移除
+     */
+    @PostMapping("/removeAllFavorite")
+    public RPCBaseResponse<Void> removeAllFavorite(){
+        LambdaQueryWrapper<ShopFavorite> query = Wrappers.<ShopFavorite>lambdaQuery().eq(ShopFavorite::getUserId, TokenData.getUserId());
+        shopFavoriteService.remove(query);
+        return success();
+    }
 }

+ 13 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductSkuController.java

@@ -6,6 +6,7 @@ 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.dto.PayShopOrderDto;
 import edu.travel.remote.vo.OrderItemVo;
 import edu.travel.remote.vo.ShopSkuSpecValueVo;
 import edu.travel.rpc.RPCBaseResponse;
@@ -56,4 +57,16 @@ public class ShopProductSkuController extends BaseController<ShopProductSku> imp
         return RPCBaseResponse.success();
     }
 
+    /**
+     *  支付商品订单
+     * @param payShopOrderDto
+     * @return {@link RPCBaseResponse }<{@link String }>
+     */
+
+    @PostMapping("/payProductSku")
+    public RPCBaseResponse<Void> payProductSku(@RequestBody PayShopOrderDto payShopOrderDto){
+        shopProductSkuService.payProductSku(payShopOrderDto);
+        return RPCBaseResponse.success();
+    }
+
 }

+ 60 - 0
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/controller/ShopOrderController.java

@@ -1,19 +1,26 @@
 package edu.travel.order.controller;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.ShopOrderDto;
 import edu.travel.remote.dto.ShowOrderInfoDto;
 import edu.travel.remote.order.ShopOrderRemoteController;
 import edu.travel.remote.vo.OrderItemVo;
+import edu.travel.remote.vo.ShopOrderVo;
 import edu.travel.remote.vo.ShowOrderInfoVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 import static edu.travel.rpc.RPCBaseResponse.success;
 
 
@@ -53,5 +60,58 @@ public class ShopOrderController extends BaseController<ShopOrder> implements Sh
         return RPCBaseResponse.success(shopOrderService.getOrderItemInfo(params));
     }
 
+    /**
+     *  通过订单号查询订单详情
+     * @param orderNum 订单号
+     * @return {@link RPCBaseResponse }<{@link Page }<{@link ShowOrderInfoVo }>>
+     */
+    @GetMapping("/orderInfoByOrderNum")
+    public RPCBaseResponse<ShowOrderInfoVo> orderInfoByOrderNum(String orderNum){
+        return success(shopOrderService.orderInfoByOrderNum(orderNum));
+    }
+
+    /**
+     *  修改订单状态
+     * @param orderNum 订单号 state 状态 OrderStateEnum
+     * @return {@link RPCBaseResponse }<{@link Page }<{@link ShowOrderInfoVo }>>
+     */
+    @GetMapping("/changeOrderState")
+    public RPCBaseResponse<Void> changeOrderState(String orderNum, String state){
+        shopOrderService.changeOrderState(orderNum,state);
+        return success();
+    }
+
+    /**
+     *  订单号查询订单
+     * @param id
+     * @return {@link RPCBaseResponse }<{@link ShopOrderVo }>
+     */
 
+    @GetMapping("/getFormId")
+    public RPCBaseResponse<ShopOrderVo> getFormId(@RequestParam("id") String id){
+        LambdaQueryWrapper<ShopOrder> query = Wrappers.<ShopOrder>lambdaQuery().eq(ShopOrder::getOrderNumber, id);
+        ShopOrder byId = shopOrderService.getOne(query);
+        ShopOrderVo bean = BeanUtil.toBean(byId, ShopOrderVo.class);
+        return success(bean);
+    }
+
+    @Override
+    public RPCBaseResponse<ShopOrderVo> updateTargetFormId(ShopOrderDto entity) {
+        return null;
+    }
+
+    @Override
+    public RPCBaseResponse<ShopOrderVo> saveFormTarget(ShopOrderDto entity) {
+        return null;
+    }
+
+    @Override
+    public RPCBaseResponse<ShopOrderVo> deleteTargetFormId(List<String> ids) {
+        return null;
+    }
+
+    @Override
+    public RPCBaseResponse<List<ShopOrderVo>> getAllForm() {
+        return null;
+    }
 }

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

@@ -21,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.cloud.openfeign.SpringQueryMap;
 import org.springframework.security.core.parameters.P;
 import org.springframework.web.bind.annotation.*;
 
@@ -45,8 +46,8 @@ public class ShopOrderItemController extends BaseController<ShopOrderItem> imple
      */
 
     @Override
-    @GetMapping("/getOrderItemVo")
-    public RPCBaseResponse<OrderItemVo> getOrderItemVo(GetOrderItemDto params) {
+    @PostMapping("/getOrderItemVo")
+    public RPCBaseResponse<OrderItemVo> getOrderItemVo(@RequestBody 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);

+ 4 - 6
edu-travel-service/edu-travel-service-order/src/main/java/edu/travel/order/enums/OrderStateEnum.java

@@ -11,12 +11,10 @@ import lombok.Getter;
 @Getter
 public enum OrderStateEnum {
     WAITING_FOR_PAYMENT(0, "待付款"),
-    ORDERED(1, "已下单"),
-    AWAITING_SHIPMENT(2, "待发货"),
-    AWAITING_RECEIPT(3, "待收货"),
-    AWAITING_EVALUATION(4, "待评价"),
-    COMPLETED(5, "已完成"),
-    CANCELLED(6, "已取消");
+    ORDERED(1, "已下单,待发货"),
+    AWAITING_RECEIPT(2, "待收货"),
+    AWAITING_EVALUATION(3, "已完成"),
+    CANCELLED(4, "已取消");
 
     private final int state;
     private final String name;

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

@@ -17,4 +17,8 @@ public interface ShopOrderService extends IService<ShopOrder> {
     void addShopOrder(AddOrderDto params);
 
     Page<OrderItemVo> getOrderItemInfo(GetOrderItemInfoByOrderNumDto params);
+
+    ShowOrderInfoVo orderInfoByOrderNum(String orderNum);
+
+    void changeOrderState(String orderNum, String state);
 }

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

@@ -8,11 +8,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.exception.BaseException;
 import edu.travel.order.entity.ShopOrder;
 import edu.travel.order.entity.ShopOrderItem;
+import edu.travel.order.entity.ShopOrderTypeChange;
+import edu.travel.order.enums.OrderStateEnum;
 import edu.travel.order.mapper.ShopOrderMapper;
 import edu.travel.order.service.ShopOrderItemService;
 import edu.travel.order.service.ShopOrderService;
+import edu.travel.order.service.ShopOrderTypeChangeService;
 import edu.travel.order.utils.PageUtil;
 import edu.travel.order.utils.TokenData;
 import edu.travel.remote.dto.AddOrderDto;
@@ -33,6 +37,8 @@ import java.util.stream.Collectors;
 public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder> implements ShopOrderService {
     @Autowired
     private ShopOrderItemService shopOrderItemService;
+    @Autowired
+    private ShopOrderTypeChangeService shopOrderTypeChangeService;
 
 
     @Override
@@ -97,5 +103,51 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
         return pageEntity;
     }
 
+    @Override
+    public ShowOrderInfoVo orderInfoByOrderNum(String orderNum) {
+
+        LambdaQueryWrapper<ShopOrder> query = Wrappers.<ShopOrder>lambdaQuery();
+        query.eq(ShopOrder::getOrderNumber, orderNum);
+
+
+        ShopOrder one = getOne(query);
+        if(ObjectUtil.isEmpty(one)){
+            throw new BaseException("订单不存在");
+        }
+        ShowOrderInfoVo result = BeanUtil.toBean(one, ShowOrderInfoVo.class);
+
+        LambdaQueryWrapper<ShopOrderItem> itemQuery = Wrappers.<ShopOrderItem>lambdaQuery();
+        itemQuery.eq(ShopOrderItem::getOrderId,orderNum);
+        List<ShopOrderItem> list = shopOrderItemService.list();
+        List<OrderItemVo> orderItemVos = BeanUtil.copyToList(list, OrderItemVo.class);
+        for (OrderItemVo orderItemVo : orderItemVos) {
+            ShopSnapshotVo bean1 = JSONUtil.toBean(orderItemVo.getSnapshot(), ShopSnapshotVo.class);
+            orderItemVo.setShopSnapshotVo(bean1);
+        }
+        result.setOrderItemVoList(orderItemVos);
+        return result;
+    }
+
+    @Override
+    public void changeOrderState(String orderNum, String state) {
+        //修改订单状态
+        LambdaQueryWrapper<ShopOrder> query = Wrappers.<ShopOrder>lambdaQuery();
+        query.eq(ShopOrder::getOrderNumber, orderNum);
+        query.eq(ShopOrder::getStatus, OrderStateEnum.WAITING_FOR_PAYMENT.getState());
+
+        ShopOrder one = getOne(query);
+        one.setStatus(Integer.parseInt(state));
+        updateById(one);
+
+        OrderStateEnum orderStateEnum = OrderStateEnum.fromState(Integer.parseInt(state));
+        String userId = TokenData.getUserId();
+        ShopOrderTypeChange shopOrderTypeChange = new ShopOrderTypeChange();
+        shopOrderTypeChange.setStatus(Integer.parseInt(state));
+        shopOrderTypeChange.setOrderId(orderNum);
+        shopOrderTypeChange.setCreateUserId(userId);
+        shopOrderTypeChange.setDescription(orderStateEnum.getName());
+        shopOrderTypeChangeService.save(shopOrderTypeChange);
+    }
+
 
 }

+ 0 - 1
pom.xml

@@ -15,7 +15,6 @@
     <module>edu-travel-model</module>
       <module>edu-travel-api</module>
       <module>edu-travel-adapter</module>
-    <module>edu-travel-adapter/edu-travel-adapter-warehouse</module>
   </modules>
   <parent>
     <groupId>org.springframework.boot</groupId>