目录

  • 一、查询仓库列表改为模糊查询
  • 二、查询商品库存
  • 三、采购需求检索
  • 四、合并采购需求

一、查询仓库列表改为模糊查询

WareInfoServiceImpl 修改 queryPage 方法

@Override
public PageUtils queryPage(Map<String, Object> params) {QueryWrapper<WareInfoEntity> wareInfoEntityQueryWrapper = new QueryWrapper<>();String key = (String) params.get("key");if(!StringUtils.isEmpty(key)){wareInfoEntityQueryWrapper.eq("id",key).or().like("name",key).or().like("address",key).or().like("areacode",key);}IPage<WareInfoEntity> page = this.page(new Query<WareInfoEntity>().getPage(params),wareInfoEntityQueryWrapper);return new PageUtils(page);
}

二、查询商品库存

WareSkuServiceImpl 中 queryPage 方法修改:

 @Overridepublic PageUtils queryPage(Map<String, Object> params) {/*** skuId: 1* wareId: 2*/QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>();String skuId = (String) params.get("skuId");if(!StringUtils.isEmpty(skuId)){queryWrapper.eq("sku_id",skuId);}String wareId = (String) params.get("wareId");if(!StringUtils.isEmpty(wareId)){queryWrapper.eq("ware_id",wareId);}IPage<WareSkuEntity> page = this.page(new Query<WareSkuEntity>().getPage(params),queryWrapper);return new PageUtils(page);}

三、采购需求检索

PurchaseDetailServiceImpl 中 queryPage 修改

@Override
public PageUtils queryPage(Map<String, Object> params) {/*** status: 0,//状态*    wareId: 1,//仓库id*/QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<PurchaseDetailEntity>();String key = (String) params.get("key");if(!StringUtils.isEmpty(key)){//purchase_id  sku_idqueryWrapper.and(w->{w.eq("purchase_id",key).or().eq("sku_id",key);});}String status = (String) params.get("status");if(!StringUtils.isEmpty(status)){//purchase_id  sku_idqueryWrapper.eq("status",status);}String wareId = (String) params.get("wareId");if(!StringUtils.isEmpty(wareId)){//purchase_id  sku_idqueryWrapper.eq("ware_id",wareId);}IPage<PurchaseDetailEntity> page = this.page(new Query<PurchaseDetailEntity>().getPage(params),queryWrapper);return new PageUtils(page);
}

四、合并采购需求

采购流程如图:

A、查询未领取的采购单

PurchaseController 中:

@RequestMapping("/unreceive/list")
//@RequiresPermissions("ware:purchase:list")
public R unreceivelist(@RequestParam Map<String, Object> params){PageUtils page = purchaseService.queryPageUnreceivePurchase(params);return R.ok().put("page", page);
}

PurchaseServiceImpl 中:

@Override
public PageUtils queryPageUnreceivePurchase(Map<String, Object> params) {IPage<PurchaseEntity> page = this.page(new Query<PurchaseEntity>().getPage(params),new QueryWrapper<PurchaseEntity>().eq("status",0).or().eq("status",1));return new PageUtils(page);
}

B、合并采购需求

MergeVo:

package com.fancy.gulimall.ware.vo;import lombok.Data;import java.util.List;@Data
public class MergeVo {private Long purchaseId; //整单idprivate List<Long> items;//[1,2,3,4] //合并项集合
}

PurchaseController 中:

///ware/purchase/unreceive/list
///ware/purchase/merge
@PostMapping("/merge")
public R merge(@RequestBody MergeVo mergeVo){purchaseService.mergePurchase(mergeVo);return R.ok();
}

PurchaseServiceImpl 中:

 @Transactional@Overridepublic void mergePurchase(MergeVo mergeVo) {Long purchaseId = mergeVo.getPurchaseId();if(purchaseId == null){//1、新建一个PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());purchaseEntity.setCreateTime(new Date());purchaseEntity.setUpdateTime(new Date());this.save(purchaseEntity);purchaseId = purchaseEntity.getId();}//TODO 确认采购单状态是0,1才可以合并List<Long> items = mergeVo.getItems();Long finalPurchaseId = purchaseId;List<PurchaseDetailEntity> collect = items.stream().map(i -> {PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();detailEntity.setId(i);detailEntity.setPurchaseId(finalPurchaseId);detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());return detailEntity;}).collect(Collectors.toList());detailService.updateBatchById(collect);PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setId(purchaseId);purchaseEntity.setUpdateTime(new Date());this.updateById(purchaseEntity);}

C、领取采购单

PurchaseController 中:

/*** 领取采购单* @return*/
@PostMapping("/received")
public R received(@RequestBody List<Long> ids){purchaseService.received(ids);return R.ok();
}

PurchaseServiceImpl 中实现 received 方法

@Override
public void received(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 = detailService.listDetailByPurchaseId(item.getId());List<PurchaseDetailEntity> detailEntities = entities.stream().map(entity -> {PurchaseDetailEntity entity1 = new PurchaseDetailEntity();entity1.setId(entity.getId());entity1.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());return entity1;}).collect(Collectors.toList());detailService.updateBatchById(detailEntities);});
}

PurchaseDetail 中实现:

@Override
public List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {List<PurchaseDetailEntity> purchaseId = this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id", id));return purchaseId;
}

ware 用常量类 WareConstant,在 common vo 中创建

package com.fancy.common.constant;public class WareConstant {public enum  PurchaseStatusEnum{CREATED(0,"新建"),ASSIGNED(1,"已分配"),RECEIVE(2,"已领取"),FINISH(3,"已完成"),HASERROR(4,"有异常");private int code;private String msg;PurchaseStatusEnum(int code,String msg){this.code = code;this.msg = msg;}public int getCode() {return code;}public String getMsg() {return msg;}}public enum  PurchaseDetailStatusEnum{CREATED(0,"新建"),ASSIGNED(1,"已分配"),BUYING(2,"正在采购"),FINISH(3,"已完成"),HASERROR(4,"采购失败");private int code;private String msg;PurchaseDetailStatusEnum(int code,String msg){this.code = code;this.msg = msg;}public int getCode() {return code;}public String getMsg() {return msg;}}
}

D、完成采购

PurchaseController 中:

///ware/purchase/done
@PostMapping("/done")
public R finish(@RequestBody PurchaseDoneVo doneVo){purchaseService.done(doneVo);return R.ok();
}

PurchaseDoneVo、PurchaseItemDoneVo 封装返回数据:

package com.fancy.gulimall.ware.vo;import lombok.Data;import javax.validation.constraints.NotNull;
import java.util.List;@Data
public class PurchaseDoneVo {@NotNullprivate Long id;//采购单idprivate List<PurchaseItemDoneVo> items;
}
package com.fancy.gulimall.ware.vo;import lombok.Data;@Data
public class PurchaseItemDoneVo {//{itemId:1,status:4,reason:""}private Long itemId;private Integer status;private String reason;
}
@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.PurchaseDetailStatusEnum.HASERROR.getCode()){flag = false;detailEntity.setStatus(item.getStatus());}else{detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());3、将成功采购的进行入库PurchaseDetailEntity entity = detailService.getById(item.getItemId());wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());}detailEntity.setId(item.getItemId());updates.add(detailEntity);}detailService.updateBatchById(updates);//1、改变采购单状态PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setId(id);purchaseEntity.setStatus(flag?WareConstant.PurchaseStatusEnum.FINISH.getCode():WareConstant.PurchaseStatusEnum.HASERROR.getCode());purchaseEntity.setUpdateTime(new Date());this.updateById(purchaseEntity);
}

WareSkuServiceImpl 中 addStock 方法

@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {//1、判断如果还没有这个库存记录新增List<WareSkuEntity> entities = wareSkuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));if(entities == null || entities.size() == 0){WareSkuEntity skuEntity = new WareSkuEntity();skuEntity.setSkuId(skuId);skuEntity.setStock(skuNum);skuEntity.setWareId(wareId);skuEntity.setStockLocked(0);//TODO 远程查询sku的名字,如果失败,整个事务无需回滚//1、自己catch异常//TODO 还可以用什么办法让异常出现以后不回滚?高级try {R info = productFeignService.info(skuId);Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");if(info.getCode() == 0){skuEntity.setSkuName((String) data.get("skuName"));}}catch (Exception e){}wareSkuDao.insert(skuEntity);}else{wareSkuDao.addStock(skuId,wareId,skuNum);}
}

WareSkuDao 中方法实现

Mapper 映射文件


远程调用接口 ProductFeignService

package com.fancy.gulimall.ware.feign;import com.fancy.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient("gulimall-product")
public interface ProductFeignService {/*** 1) 让所有请求过网关*   1、@FeignClient("gulimall-gateway"): 给gulimall-gateway 所在机器发请求*   2、/api/product/skuinfo/info/{skuId}** 2)、直接让后台指定服务处理*   1、@FeignClient("gulimall-product")*   2、/product/skuinfo/info/{skuId}* @param skuId* @return*/@RequestMapping("/product/skuinfo/info/{skuId}")public R info(@PathVariable("skuId") Long skuId);
}

谷粒商城 (二十八) --------- 仓储服务 API 仓库管理相关推荐

  1. 谷粒商城二十订单服务

    rabbitmq相关知识 // 静态页面的引入,静态资源上传nginx等192.168.56.10 gulimall.com 192.168.56.10 search.gulimall.com 192 ...

  2. 谷粒商城二十二订单服务支付宝支付

    我们支付暂时只开发支付宝,官方文档在蚂蚁金服开放平台-电脑网站支付. 按照正规的流程,我们的系统要接入支付宝,肯定是需要大量的审核过程,而且需要我们的项目上线. 那现在我们就想测试该怎么办?支付宝为我 ...

  3. 谷粒商城二十五springCloud之Sleuth+Zipkin 服务链路追踪

    为什么用 分布式系统庞大而复杂,服务众多,调用关系网也非常复杂, 服务上线以后如果出现了某些错误,错误的异常就很难定位. 一个请求可能调用了非常多的链路,我们需要知道到底哪一块儿出现了错误. 最终希望 ...

  4. FreeSql (二十八)事务

    FreeSql实现了四种数据库事务的使用方法,脏读等事务相关方法暂时未提供.主要原因系这些方法各大数据库.甚至引擎的事务级别五花八门较难统一. 事务用于处理数据的一致性,处于同一个事务中的操作是一个U ...

  5. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤...

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  6. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  7. MFC Windows 程序设计[二十八]之字体样式(附源码)

    MFC Windows 程序设计[二十八]之字体样式 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C ...

  8. 2008R2Win7管理二十八Mail之基本使用

    2008R2Win7管理二十八Mail之基本使用 上篇我们已经安装好了exchange2010,呵呵本片简单介绍和看下ex2010的基本界面和使用 安装完成打开exchange控制台如图所示 汗,有试 ...

  9. 微信小程序把玩(二十八)image组件

    原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...

最新文章

  1. IT部门在企业信息化中的转变
  2. python新手之一环境安装
  3. wpf scrollviewer 两个事件相互影响_WPF绘制3D效果显示密集立体集装箱
  4. C#软件设计——小话设计模式原则之:依赖倒置原则DIP
  5. 解决ccSvcHst.exe CPU占用超50%的问题,及其缘由
  6. 自定义控件android特效,Android自定义控件eBook实现翻书效果实例详解
  7. Centos7.x 安装 CDH 6.x
  8. Spring 框架基础(02):Bean的生命周期,作用域,装配总结
  9. Python学习入门1:Python 新手入门引导
  10. 大数据_Flink_数据处理_流式数据源测试---Flink工作笔记0010
  11. GitHub 添加 SSH keys
  12. Android APP
  13. C/C++[codeup 2044]神奇的口袋
  14. 遗传算法matlab_三分钟学会遗传算法
  15. 科研绘图软件GraphPad Prism教程(三)
  16. Fast Non-Bayesian Poisson Factorization for Implicit-Feedback Recommendations
  17. 项目中 前后台接口 请求项目移植的问题
  18. 用Python画等边三角形
  19. windows10 配置 VNC server
  20. jmap和jstat

热门文章

  1. 单摆的周期公式推导过程
  2. 怎么用PDF虚拟打印机给PDF添加背景
  3. matlabR2016a 所适用的psat工具包
  4. 关于soot静态分析的学习(一)
  5. SAP Concur是什么?
  6. ppt护理文书流程图_护理风险管理过程
  7. 易语言运行命令之注册DLL文件
  8. python水浒传名字次数_《水浒传》里重名多,是施耐庵取名不用心还是太随意?...
  9. threejs 粒子系统和材质贴图
  10. java web 图灵_java架构师学习路线-Web架构的理解