springcloud开Product服务

1.主类

SpringBootApplication
@EnableDiscoveryClient
public class ProductServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductServerApplication.class, args);
    }

}
 /**
     * 1.查询所有在架的商品
     * 2.获取类目type列表
     * 3.查询类目
     * 4.构造数据
     */

2.前端多需格式

{
    "code": 10000,
    "msg": "成功",
    "data": [
        {
            "productInfoList": [
                {
                    "id": 1,
                    "name": "皮蛋粥",
                    "price": 34.5,
                    "Stock": 40,
                    "description": "好吃哦",
                    "icon": "http://111.jpa",
                    "status": 0,
                    "type": 11
                }
            ],
            "name": "热榜",
            "type": 11
        },
        {
            "productInfoList": [
                {
                    "id": 2,
                    "name": "豆腐",
                    "price": 4.3,
                    "Stock": 30,
                    "description": "很软",
                    "icon": "http",
                    "status": 0,
                    "type": 22
                }
            ],
            "name": "好吃的",
            "type": 22
        }
    ]
}

3.自己依据情况构建几个用于返回的对象

package com.zhu.product.utill;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

/**
 *封装外层对象
 */
@Data
public class ProductVo {


    /**
     * 返回前端加此注解 为前端需要字段
     */
    @JsonProperty("name")
    private String cacategoryName;
    @JsonProperty("type")
    private Integer categoryType;
    /**
     * List里面再封装一个对象
     */
    private List<ProductInfoVo> ProductInfoList;

}

package com.zhu.product.utill;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
public class ProductInfoVo {
    @JsonProperty("id")
    private Integer productId;
    @JsonProperty("name")
    private String productName;
    @JsonProperty("price")
    private BigDecimal productPrice;
    /**
     * 库存
     */
    @JsonProperty("Stock")
    private Integer productStock;
    @JsonProperty("description")
    private String productDescription;
    /**
     * 小图
     */
    @JsonProperty("icon")
    private String productIcon;
    /**
     * 商品状态 0正常 1 下架
     */
    @JsonProperty("status")
    private Integer productStatus;
    /**
     * 类目编号
     */
    @JsonProperty("type")
    private Integer categoryType;

}

4.实体类:商品表,类目表

package com.zhu.product.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * <p>
 * 
 * </p>
 *
 * @author pacey
 * @since 2019-01-15
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ProductInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "product_id", type = IdType.AUTO)
    private Integer productId;
    private String productName;
    private BigDecimal productPrice;
    /**
     * 库存
     */
    private Integer productStock;
    private String productDescription;
    /**
     * 小图
     */
    private String productIcon;
    /**
     * 商品状态 0正常 1 下架
     */
    private Integer productStatus;
    /**
     * 类目编号
     */
    private Integer categoryType;
    /**
     * 创建时间
     */
    private Date createTime;


}


    package com.zhu.product.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 * 
 * </p>
 *
 * @author pacey
 * @since 2019-01-15
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ProductCategory implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "category_id", type = IdType.AUTO)
    private Integer categoryId;
    /**
     * 类目名字
     */
    private String categoryName;
    /**
     * 类目编号
     */
    private Integer categoryType;
    /**
     * 创建时间
     */
    private Date createTime;


}


5.coutroller


   List<Integer> typeList= new ArrayList<>();
    @GetMapping
    public Result getProductIndoByStatus()
    {

        //1.查询所有在架的商品
        List<ProductInfo> productInfoList=iProductInfoService.selectList(new EntityWrapper<ProductInfo>().eq("product_status", StatusEnum.UP));

        Integer type;

        for (ProductInfo list :productInfoList)
        {

            type=list.getCategoryType();
            //2.获取类目type列表
            typeList.add(type);
            System.out.println("11"+type);
        }
        for (Integer i:typeList)
        {
            System.out.println("x:"+i);
        }
         // 3.查询类目
        List<ProductCategory> productCategoryList =iProductCategoryService.selectList(new EntityWrapper<ProductCategory>().in("category_type",typeList));
                   //4.构造数据
        List<ProductVo> categoryinfo= new ArrayList<>();

        //遍历类目
         for (ProductCategory list:productCategoryList){
             ProductVo productVo =new ProductVo();
             productVo.setCacategoryName(list.getCategoryName());
             productVo.setCategoryType(list.getCategoryType());
             //便利商品表 获取商品信息
             List<ProductInfoVo> productInfo =new ArrayList<>();
             for(ProductInfo list1:productInfoList){
                 if(list1.getCategoryType().equals(list.getCategoryType())) {
                     ProductInfoVo productInfoVo = new ProductInfoVo();
                     //使用BeanUtils.copyProperties(,)把原对象的内容拷贝到新对象中去
                     BeanUtils.copyProperties(list1, productInfoVo);
                     productInfo.add(productInfoVo);
                 }
             }
             productVo.setProductInfoList(productInfo);
             categoryinfo.add(productVo);
         }

                    return ResultUtil.success(categoryinfo);
    }


6.下单服务:

/**
          1.参数校验
         * 2.查询商品信息(调用商品服务)
         * 3.计算总价
         * 4.扣库存(调用商品服务)
         * 5.订单入库
         */

1)商品信息(Product服务)

/**
     * 根据proudctid 多个查询商品信息 共订单服务调用
     */
    @PostMapping("/ListForOrder")
    public List<ProductInfos> ListForOrder(@RequestBody List<Integer> productIdList){
        log.info("参数:"+productIdList);
        List<ProductInfos> list=new ArrayList<>();
      log.info("productIdList:"+productIdList);
        List<ProductInfo> productInfo =iProductInfoService.selectList(new EntityWrapper<ProductInfo>().in("product_id",productIdList));
          for (ProductInfo productInfo1 :productInfo)
          {
              log.info("PRODUCT-------------"+productInfo1.getProductName());
              ProductInfos productInfos =new ProductInfos();
              //左复制到右
              BeanUtils.copyProperties(productInfo1,productInfos);
              list.add(productInfos);
          }

          for (ProductInfos productInfos:list)
          {
              System.out.println("----"+productInfos.getProductName());
          }


        return list;

    }

2):扣库存(商品服务)

/**
     * 扣库存 给订单服务调用
     */
    @PostMapping("/koukucun")
    @Transactional(rollbackFor=Exception.class)
    public void kouKuCun(@RequestBody List<CartDto> cartDtoList)
    {
       //检查库存够不够
        for (CartDto cartDto1:cartDtoList)
        {
            ProductInfo productInfo=iProductInfoService.selectById(cartDto1.getProductId());
            //判断商品是否存在
            if(null==productInfo)
            {
                //商品不存在
                throw new ProductException(ResultEnum.PRODUCT_NOT_EXIST);
            }
             Integer result= productInfo.getProductStock()-cartDto1.getProductShuliang();
            //判断库存是否足够
            if (result<0)
            {
                //库存不足
                throw new ProductException(ResultEnum.KUCUN_NOT_EHIGHT);
            }
            //把扣完的数量 修改到数据库
            productInfo.setProductId(cartDto1.getProductId());
            productInfo.setProductStock(result);
               //修改数据库 完成扣库存
            Boolean is= iProductInfoService.updateById(productInfo);
            if(is)
            {
                log.info("扣库存成功");
            }
            else
            {
                log.info("扣库存失败");
            }

        }
    }

3):写异常类

package com.zhu.product.exception;

import com.zhu.product.enums.ResultEnum;

public class ProductException extends RuntimeException {

    private Integer code;

    public ProductException(Integer code,String message)
    {
        super(message);
        this.code=code;
    }
    public ProductException(ResultEnum resultEnum)
    {
        super(resultEnum.getMsg());
        this.code=resultEnum.getCode();
    }
}

4):定义异常里的枚举

package com.zhu.product.enums;

import lombok.Getter;

/**
 *2. 然后构建一个常用的枚举类,内容可以根据项目自定义
 */
@Getter
public enum ResultEnum {
    //这里是可以自己定义的,方便与前端交互即可
    PRODUCT_NOT_EXIST(1,"商品不存在"),
    KUCUN_NOT_EHIGHT(2,"库存不足"),
    ;
    private Integer code;
    private String msg;

    ResultEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }


}

5:)下单(计算总价+订单主表/订单详情入库)

package com.zhu.order.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.zhu.order.dao.OrderDetailMapper;
import com.zhu.order.dto.OrderDto;
import com.zhu.order.entity.*;
import com.zhu.order.dao.OrderMasterMapper;
import com.zhu.order.enums.OrderPayStatusEnum;
import com.zhu.order.enums.OrderStatusEnum;
import com.zhu.order.service.IOrderMasterService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zhu.order.utills.OrderId;
import lombok.extern.log4j.Log4j;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.xml.ws.soap.Addressing;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author zhu
 * @since 2019-01-16
 */
@Log4j
@Service
public class OrderMasterServiceImpl extends ServiceImpl<OrderMasterMapper, OrderMaster> implements IOrderMasterService {

    @Autowired
    private OrderMasterMapper orderMasterMapper;
    @Autowired
    private OrderDetailMapper orderDetailMapper;
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public OrderDto create(OrderDto orderDto) {
        //订单id
        String orderid =OrderId.getOrderId();

        /**
         * 2.查询商品信息(调用商品服务)
         * 3.计算总价
         * 4.扣库存(调用商品服务)
         * 5.订单入库
         */

        //2.查询商品信息(调用商品服务)
        //获取所有productid 使用了lomda表达式
        List<Integer> productIdList= orderDto.getOrderDetailList().stream().map(OrderDetail::getProductId).collect(Collectors.toList());
         log.info("所有productid:"+productIdList);
        List<ProductInfos> response= restTemplate.postForObject("http://PRODUCT/productInfo/ListForOrder", productIdList,List.class);
        log.info("response:"+response );
        //用到了谷歌的Gson 用于反序列化 不然List转对象报错
        Gson gson =new Gson();
        String json=gson.toJson(response);
        List<ProductInfos> response1=gson.fromJson(json,new TypeToken<List<ProductInfos>>(){}.getType());

        //3.计算总价
        //定义总价
        BigDecimal zongjia =new BigDecimal(BigInteger.ZERO);
        //遍历订单详情表
        for(OrderDetail orderDetail:orderDto.getOrderDetailList()){
            for (ProductInfos productInfo:response1)
            {
                log.info("价格0:"+productInfo.getProductPrice());
                //相等才计算
              if(productInfo.getProductId().equals(orderDetail.getProductId()))
              {
                  //单价*数量  ++
                  zongjia=  productInfo.getProductPrice().multiply(new BigDecimal(orderDetail.getProductShuliang())).add(zongjia);
                  orderDetail.setProductPrise(productInfo.getProductPrice());
                  orderDetail.setProductName(productInfo.getProductName());
                  orderDetail.setProductShuliang(orderDetail.getProductShuliang());
                  orderDetail.setOrderId(orderid);
                  orderDetail.setDetailId(OrderId.getOrderId());
                   log.info("价格:"+orderDetail.getProductPrise());
                  //订单详情入库
                  orderDetailMapper.insert(orderDetail);

              }
            }

        }

        //4.扣库存(调用商品服务)
          //要获取到productid 和数量的 集合 List
         List<CartDto> cartDto= orderDto.getOrderDetailList().stream().map(e -> new CartDto(e.getProductId(),e.getProductShuliang())).collect(Collectors.toList());

       log.info("cartDto:"+cartDto);
        restTemplate.postForObject("http://PRODUCT/productInfo/koukucun",cartDto,List.class);

        //5.订单入库
        OrderMaster orderMaster =new OrderMaster();
        //订单
        orderMaster.setOrderId(orderid);
         //用拷贝的方法 把传进来的参数拷贝到orderMaster
        BeanUtils.copyProperties(orderDto,orderMaster);
        //总价
        orderMaster.setOrderAmount(new BigDecimal(6));
        //订单状态
        orderMaster.setOrderStatus(OrderStatusEnum.NEW.getCode());
        //支付状态
        orderMaster.setPayStaus(OrderPayStatusEnum.WAIT.getCode());

        //订单主库入库
        orderMasterMapper.insert(orderMaster);
        log.info("下单完成");
        return orderDto;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值