配置服务中心
cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: guliware
在网关配置路由转发
guligateway .yml配置文件
- id: ware_routeuri: lb://guliwarepredicates:- Path=/api/guliware/**filters:- RewritePath=/api/(?<segment>.*),/$\{segment}
解决仓库维护页面模糊查询功能
WareInfoController.java
@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){PageUtils page = wareInfoService.queryPage(params);return R.ok().put("page", page);}
WareInfoController.java
@Overridepublic 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);}
查询库存&&创建采购需求
解决查询库存模糊查询问题
@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){PageUtils page = wareSkuService.queryPage(params);return R.ok().put("page", page);}
@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);}
创建采购需求-人工发出/自动化采购
解决采购需求模糊检索
/*** 列表*/@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){PageUtils page = purchaseDetailService.queryPage(params);return R.ok().put("page", page);}
@Overridepublic 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);}
合并采购单
1.查询未领取的采购单
PurchaseController.java
@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.java
@Overridepublic 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);}
2.合并采购需求 有采购单则根据采购单合并,没有则创建新的采购单进行合并
创建mergeVo 包含采购项和采购单的id
@Data
public class MergeVo {private Long purchaseId; //整单idprivate List<Long> items;//[1,2,3,4] //合并项集合
}
PurchaseController.java
@PostMapping("/merge")public R merge(@RequestBody MergeVo mergeVo){purchaseService.mergePurchase(mergeVo);return R.ok();}
PurchaseServiceImpl.java
@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);}
3.采购人员(员工端APP)领取采购单
PurchaseController.java
/*** 领取采购单*List<Long> ids 要领取的采购单的id*/@PostMapping("/received")public R received(@RequestBody List<Long> ids){purchaseService.received(ids);return R.ok();}
PurchaseServiceImpl.java
/**** @param ids 采购单id*/@Overridepublic 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、改变采购项的状态//根据每个采购单id找到具体采购项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);});}
PurchaseDetailServiceImpl.java
@Overridepublic List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {List<PurchaseDetailEntity> purchaseId = this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id", id));return purchaseId;}
3.完成采购功能
PurchaseController.java
@PostMapping("/done")public R finish(@RequestBody PurchaseDoneVo doneVo){purchaseService.done(doneVo);return R.ok();}
创建相关Vo PurchaseDoneVo PurchaseItemDoneVo
PurchaseServiceImpl.java
在这里插入代码片
WareSkuServiceImpl.java
向仓库里加入采购的商品
配置商品服务分页插件
@EnableTransactionManagement
@MapperScan("com/edu/npu/gulimall/guliware/dao")
@Configuration
public class WareMyBatisConfig {//引入分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(true);
// // 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(1000);return paginationInterceptor;}
}
调用远程服务获取新增商品的名称
@FeignClient("guliproduct")
public interface ProductFeignService {/*** /product/skuinfo/info/{skuId}*** 1)、让所有请求过网关;* 1、@FeignClient("guligateway"):给guligateway所在的机器发请求* 2、/api/guliproduct/skuinfo/info/{skuId}* 2)、直接让后台指定服务处理* 1、@FeignClient("guliproduct")* 2、/guliproduct/skuinfo/info/{skuId}** @return*/@RequestMapping("/guliproduct/skuinfo/info/{skuId}")public R info(@PathVariable("skuId") Long skuId);
}
改变采购后的商品库存
@Overridepublic 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);}}