day9谷粒商城

P98

领取采购单

PurchaseController
 /**
     * 领取采购单
     * @param ids
     * @return
     */
    @PostMapping("/receive")
    public R received(@RequestBody List<Long> ids){
    purchaseService.receive(ids);
    return  R.ok();
    }
 PurchaseServiceImpl
  /**
     * ids采购单的id
     * @param ids
     */
    @Override
    public void receive(List<Long> ids) {
        //1.确认当前采购单是新建或者已分配状态
         List<PurchaseEntity> collect = ids.stream().map(id -> {
            PurchaseEntity byId = this.getById(id);
            return byId;
        }).filter(item -> {
            //选择新建或已分配的采购单
            if (item.getStatus() == WareConstant.PurchaseStatusEnum.CREATED.getCode()
                    || item.getStatus() == WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) {
                return true;
            }
            return false;
        }).map(item->{
            //已被选择的设为已领取
            item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());
            item.setUpdateTime(new Date());
            return item;
        }).collect(Collectors.toList());
        //2.改变采购单的状态
        this.updateBatchById(collect);
        //3.改变采购项的状态
        collect.forEach((item)->{
            List<PurchaseDetailEntity> entities = purchaseDetailService.listDetailByPurchaseId(item.getId());
            //收集需要更新状态的采购项
            List<PurchaseDetailEntity> detailEntities = entities.stream().map(entity -> {
                PurchaseDetailEntity entity1 = new PurchaseDetailEntity();
                entity1.setId(entity.getId());
                entity1.setStatus(WareConstant.PurchaseDetailEnum.BUYING.getCode());
                return entity1;
            }).collect(Collectors.toList());

            purchaseDetailService.updateBatchById(detailEntities);
        });


    }
PurchaseDetailServiceImpl
@Override
    public List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {
        //根据采购id获取各个采购项,然后更新其状态
        //获取采购项
        List<PurchaseDetailEntity> purchaseId =this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id",id));

        return purchaseId;
    }

1号采购单有两单采购需求

 

领取1号采购单--领取后状态----正在采购

 

 优化

如果采购需求是处在正在采购状态,如果选择合并,应不能再合并【留作业了】

领取完采购单,接着完成采购单,完成后可以点击完成。采购需求中的采购单id、采购商品和采购数量等需要加入库存中。

完成采购

 

{"id":1, //采购单id

"items":[  //采购项

    {"itemId":1,"status":3,"reason":""},

     {"itemId":2,status:4,"reason":"无货"}

]}

ware

@Data
public class PurchaseDoneVo {
    @NotNull
    private Long id;//采购单id
    private List<PurchaseItemDoneVo> items;
}
@Data
public class PurchaseItemDoneVo {
    private Long itemId;
    private Integer status;
    private String reason;
}
PurchaseController 
/**
     * 完成采购单
     * @param doneVo
     * @return
     */
    @PostMapping("/done")
    public R finish(@RequestBody PurchaseDoneVo doneVo){
        purchaseService.done(doneVo);
        return  R.ok();
    }
PurchaseServiceImpl
  @Transactional
    @Override
    public void done(PurchaseDoneVo doneVo) {

        Long id = doneVo.getId();
        //2.改变采购项的状态--完成或失败
        Boolean flag =true;
        List<PurchaseItemDoneVo> items = doneVo.getItems();
        List<PurchaseDetailEntity>updates =  new ArrayList<>();
        for(PurchaseItemDoneVo item: items){
            PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
            //分离成功采购项
            if(item.getStatus()==WareConstant.PurchaseDetailEnum.HASERROR.getCode()){
                //失败的
                flag=false;
                detailEntity.setStatus(item.getStatus());
            }else{
                //成功采购项
                detailEntity.setStatus(WareConstant.PurchaseDetailEnum.FINISH.getCode());
                //3.将完成的采购保存入库--wms_ware_sku
                final PurchaseDetailEntity entity = purchaseDetailService.getById(item.getItemId());
                wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());
            }
            //采购单的id
            detailEntity.setId(item.getItemId());
            updates.add(detailEntity);
        }
        //批量更新
        purchaseDetailService.updateBatchById(updates);
        //改变采购单状态
        PurchaseEntity purchaseEntity = new PurchaseEntity();
        purchaseEntity.setId(id);
        purchaseEntity.setStatus(flag ?WareConstant.PurchaseDetailEnum.FINISH.getCode() : WareConstant.PurchaseDetailEnum.HASERROR.getCode());
        purchaseEntity.setUpdateTime(new Date());
        this.updateById(purchaseEntity);

    }

 WareSkuServiceImpl

  @Override
    public void addStock(Long skuId, Long wareId, Integer skuNum) {
  //判断如果还没这个库存记录新增
        List<WareSkuEntity> entities = wareSkuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));
       if(entities==null ||entities.size() ==0){
           //新增
            WareSkuEntity wareSkuEntity = new WareSkuEntity();
            wareSkuEntity.setSkuId(skuId);
            wareSkuEntity.setStock(skuNum);
            wareSkuEntity.setWareId(wareId);
            wareSkuDao.insert(wareSkuEntity);
       }else{
           wareSkuDao.addStock(skuId,wareId,skuNum);
       }

    }
@Autowired
WareSkuDao wareSkuDao;
  @Override
    public void addStock(Long skuId, Long wareId, Integer skuNum) {
        wareSkuDao.addStock(skuId,wareId,skuNum);
    }

多个参数一定要指定@param

@Mapper
public interface WareSkuDao extends BaseMapper<WareSkuEntity> {

    void addStock(@Param("skuId") Long skuId, @Param("wareId") Long wareId, @Param("skuNum") Integer skuNum);
}
 <update id="addStock">
      update wms_ware_sku set stock = stock+#{stock} where sku_id=#{skuId} and ware_id=#{wareId};
    </update>

分页

将启动类的开启事务和包扫描注解剪切到WareMybatisConfig
package com.example.gulimall.ware.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement //开启事务
@MapperScan("com.example.gulimall.ware.dao")
public class WareMybatisConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        //设置请求的页面大于最大页后操作,TRUE调回到首页,false继续请求,默认false
        paginationInterceptor.setOverflow(true);
        //设置最大单页限制数量,默认500条,-1不受限制
        paginationInterceptor.setLimit(1000);
        return paginationInterceptor;
    }
}

 

 

 测试

{"id":1,

"items":[

 {"itemId":1,"status":3,"reason":""},

{"itemId":2,"status":4,"reason":"无货"}

]}

 http://localhost:88/api/ware/purchase/done 

测试2

合并整单--直接确定,不选采单人

 

在这里分配采购人--admin

 

 领取3号采购单

 已领取

 

  

 

 

添加 sku_name和锁定库存

1)、让所有请求过网关;
     *          1、@FeignClient("gulimall-gateway"):给gulimall-gateway所在的机器发请求
     *          2、/api/product/skuinfo/info/{skuId}
     *   2)、直接让后台指定服务处理
     *          1、@FeignClient("gulimall-product")
     *          2、/product/skuinfo/info/{skuId}

启动类中添加@EnableFeignClients

WareSkuServiceImpl
    @Autowired
    ProductFeignService productFeignService;
@FeignClient("gulimall-product") //指明调用的远程服务
public interface ProductFeignService {
    /**
     *    /product/skuinfo/info/{skuId}:
     *      先找gulimall-product,然后发送请求/api/product/skuinfo/info/{skuId}
     *    /api/product/skuinfo/info/{skuId}:
     *     直接经过网关到对应服务查询
     *     @FeignClient("gulimall-gateway")
     *
     * @param skuId
     * @return
     */
    @RequestMapping("/product/skuinfo/info/{skuId}")
    public R info(@PathVariable("skuId") Long skuId);
}
WareSkuServiceImpl 
  @Override
    public void addStock(Long skuId, Long wareId, Integer skuNum) {
  //判断如果还没记录这个库存新增
        List<WareSkuEntity> entities = wareSkuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));
       if(entities==null ||entities.size() ==0){
           //新增
            WareSkuEntity wareSkuEntity = new WareSkuEntity();
            wareSkuEntity.setSkuId(skuId);
            wareSkuEntity.setStock(skuNum);
            wareSkuEntity.setWareId(wareId);
            //设置锁定库存默认值为0
           wareSkuEntity.setStock(0);
           //TODO  远程查询sku的名字,如果失败,整个事务无需回滚
           /*整个事务无需回滚做法
           1。自己catch异常
           2.高级部分说
            */

           try{
               //设置存入库存的商品名称
               R info = productFeignService.info(skuId);
               Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");
               if(info.getCode()==0){
                   wareSkuEntity.setSkuName((String) data.get("skuName"));
               }
           }catch (Exception e){}


            wareSkuDao.insert(wareSkuEntity);
       }else{
           wareSkuDao.addStock(skuId,wareId,skuNum);
       }

    }

P100

商品维护----sku管理---规格

点规格报400  : /src/router/index.js 在mainRoutes->children里面加上:

{ path: '/product-attrupdate', component: _import('modules/product/attrupdate'), name: 'attr-update', meta: { title: '规格维护', isTab: true } }

获取sku规格--pms_product_attr_value

AttrController
   @Autowired
    ProductAttrValueService productAttrValueService;
    @GetMapping("/base/listforspu/{spuId}")
    public R  baseAttrListForSpu(@PathVariable("spuId") Long spuId){
    List<ProductAttrValueEntity> entities =  productAttrValueService.baseAttrListForSpu(spuId);
    return R.ok().put("data",entities);
    }

 ProductAttrValueServiceImpl

    @Override
    public List<ProductAttrValueEntity> baseAttrListForSpu(Long spuId) {
        final List<ProductAttrValueEntity> entities = this.baseMapper.selectList(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));
        return entities;
    }

修改规格

AttrController
  /**
     * 修改规格
     */
    @PostMapping("/update/{spuId}")
    public R updateSpuAttr(@PathVariable("spuId") Long spuId,
                @RequestBody List<ProductAttrValueEntity> entities){
		productAttrValueService.updateSpuAttr(spuId,entities);
        return R.ok();
    }
ProductAttrValueServiceImpl
@Transactional
    @Override
    public void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {
        //1.删除这个spuId之前对应的所有属性
        this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));
        //2.加入新的数据---更新
        //对entities中的每一个对应的项遍历设置
        final List<ProductAttrValueEntity> collect = entities.stream().map(item -> {
            item.setSpuId(spuId);
            return item;
        }).collect(Collectors.toList());
        //批量保存
        this.saveBatch(collect);
    }
docker pull elasticsearch:7.4.2       存储和检索数据
docker pull kibana:7.4.2                 可视化检索数据

 

mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
Kibana
获取IP:【docker inspect elasticsearch查看NetworkSettings:IPAddress获取ip】
docker inspect elasticsearch别整这个,访问不成功
就用自己虚拟机的IP地址,一般都是192.168.56.10
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \
-d kibana:7.4.2

 ipconfig  查看虚拟机IP

docker exec -it 容器名称或容器id /bin/bash

 进入 根目录下的config目录,修改kibana,yml文件

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值