库存系统

整合ware服务

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: gulimall-ware
  • 主启动:

  • @EnableDiscoveryClient

  • @MapperScan("com.wlq.gulimall.ware.dao")

  • @EnableTransactionManagement

  • 配置网关

- id: ware_routeuri: lb://gulimall-warepredicates:- Path=/api/ware/**filters:- RewritePath=/api/(?<segment>.*),/$\{segment}
  • 配置分页插件:com.wlq.gulimall.ware.config.WareMyBatisConfig
@EnableTransactionManagement
@MapperScan("com.atguigu.gulimall.ware.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;}
}
  • 启动ware服务

1、仓库维护

  • 测试仓库维护的新增、删除、修改功能

  • 修改WareInfoServiceImpl,增加模糊检索功能

@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);}
  • 测试

2、商品库存

  • /ware/waresku/list

1、查询修改

  • 修改它的实现方法:WareSkuServiceImpl
@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);}
  • 测试

3、采购单维护

1、给库存添加商品应该是从采购单进行添加

商品库存里的新增只是为了测试方便

2、新建一个采购需求

2、完善采购需求的模糊检索

  • /ware/purchasedetail/list
  • 修改PurchaseDetailServiceImpl
@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);}
  • 测试

3、合并采购需求

1、新增采购单


分配一个采购人员

2、查询未领取的采购单

  • /ware/purchase/unreceive/list

  • 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);}
  • service
PageUtils queryPageUnreceivePurchase(Map<String, Object> params);
  • impl
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);}
  • 测试

3、合并采购需求

  • /ware/purchase/merge
  • 新建VO:com.wlq.gulimall.ware.vo.MergeVo
@Data
public class MergeVo {/*** purchaseId   //整单id* items        //[1,2,3,4] 合并项集合*/private Long purchaseId;private List<Long> items;
}
  • PurchaseController
/*** 合并采购需求* @param mergeVo* @return*////ware/purchase/merge@PostMapping("/merge")public R merge(@RequestBody MergeVo mergeVo){purchaseService.mergePurchase(mergeVo);return R.ok();}
  • service
void mergePurchase(MergeVo mergeVo);
  • common下新建:com.wlq.common.constant.WareConstant
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;}}
}
  • impl
@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);}
  • 测试合并整单
  • 对比未合单之前

4、领取采购单

postman模拟手机接单,领取采购单

  • /ware/purchase/received

  • PurchaseController

/*** 领取采购单* @return*/@PostMapping("/received")public R received(@RequestBody List<Long> ids){purchaseService.received(ids);return R.ok();}
  • service
void received(List<Long> ids);
  • impl
/**** @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、改变采购项的状态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);});}
  • listDetailByPurchaseId 方法实现
  • service
List<PurchaseDetailEntity> listDetailByPurchaseId(Long id);
  • impl : PurchaseDetailServiceImpl
@Overridepublic List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {List<PurchaseDetailEntity> purchaseId = this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id", id));return purchaseId;}
postman模拟领取采购单

  • 方送请求

  • 查看采购需求,采购单

5、完成采购

  • /ware/purchase/done

  • 新建Vo

  • PurchaseDoneVo

@Data
public class PurchaseDoneVo {@NotNullprivate Long id;//采购单idprivate List<PurchaseItemDoneVo> items;
}
  • PurchaseItemDoneVo
@Data
public class PurchaseItemDoneVo {//{itemId:1,status:4,reason:""}private Long itemId;private Integer status;private String reason;
}
  • PurchaseController
/*** 完成采购单*////ware/purchase/done@PostMapping("/done")public R finish(@RequestBody PurchaseDoneVo doneVo){purchaseService.done(doneVo);return R.ok();}
  • service
void done(PurchaseDoneVo doneVo);
  • impl
@Transactional@Overridepublic 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);}

addStock方法实现

  • service
void addStock(Long skuId, Long wareId, Integer skuNum);
  • impl
@AutowiredWareSkuDao wareSkuDao;
  • WareSkuDao
@Mapper
public interface WareSkuDao extends BaseMapper<WareSkuEntity> {void addStock(@Param("skuId") Long skuId, @Param("wareId") Long wareId, @Param("skuNum") Integer skuNum);
}
  • xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.wlq.gulimall.ware.dao.WareSkuDao"><!-- 可根据自己的需求,是否要使用 --><resultMap type="com.wlq.gulimall.ware.entity.WareSkuEntity" id="wareSkuMap"><result property="id" column="id"/><result property="skuId" column="sku_id"/><result property="wareId" column="ware_id"/><result property="stock" column="stock"/><result property="skuName" column="sku_name"/><result property="stockLocked" column="stock_locked"/></resultMap><update id="addStock">UPDATE `wms_ware_sku` SET stock=stock+#{skuNum} WHERE sku_id=#{skuId} AND ware_id=#{wareId}</update></mapper>
  • ProductFeignService
@FeignClient("gulimall-product")
public interface ProductFeignService {/***      /product/skuinfo/info/{skuId}***   1)、让所有请求过网关;*          1、@FeignClient("gulimall-gateway"):给gulimall-gateway所在的机器发请求*          2、/api/product/skuinfo/info/{skuId}*   2)、直接让后台指定服务处理*          1、@FeignClient("gulimall-gateway")*          2、/product/skuinfo/info/{skuId}** @return*/@RequestMapping("/product/skuinfo/info/{skuId}")public R info(@PathVariable("skuId") Long skuId);
}
  • 主启动
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.wlq.gulimall.ware.feign")
@MapperScan("com.wlq.gulimall.ware.dao")
public class GulimallWareApplication {public static void main(String[] args) {SpringApplication.run(GulimallWareApplication.class, args);}}
  • postman测试

4、完善商品管理的spu规格维护

1、获取spu规格,并回显

  • /product/attr/base/listforspu/{spuId}

如果点击规格出现404

/src/router/index.js 在mainRoutes->children【】里面加上这个就不会404了:{ path: ‘/product-attrupdate’, component: _import(‘modules/product/attrupdate’), name: ‘attr-update’, meta: { title: ‘规格维护’, isTab: true } }

  • 修改product服务的AttrController
/*** 获取spu规格* @param spuId* @return*/// /product/attr/base/listforspu/{spuId}@GetMapping("/base/listforspu/{spuId}")public R baseAttrlistforspu(@PathVariable("spuId") Long spuId){List<ProductAttrValueEntity> entities = productAttrValueService.baseAttrlistforspu(spuId);return R.ok().put("data",entities);}
  • ProductAttrValueService
List<ProductAttrValueEntity> baseAttrlistforspu(Long spuId);
  • impl
@Overridepublic List<ProductAttrValueEntity> baseAttrlistforspu(Long spuId) {List<ProductAttrValueEntity> entities = this.baseMapper.selectList(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));return entities;}
  • 测试

2、修改参数的保存方法(添加批量保存方法)

  • AttrController
/*** 批量保存*////product/attr/update/{spuId}@PostMapping("/update/{spuId}")public R updateSpuAttr(@PathVariable("spuId") Long spuId,@RequestBody List<ProductAttrValueEntity> entities){productAttrValueService.updateSpuAttr(spuId,entities);return R.ok();}
  • ProductAttrValueService
void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities);
  • impl
@Transactional@Overridepublic void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {//1、删除这个spuId之前对应的所有属性this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));List<ProductAttrValueEntity> collect = entities.stream().map(item -> {item.setSpuId(spuId);return item;}).collect(Collectors.toList());this.saveBatch(collect);}
  • 测试


确定修改后查看,回显修改后的数据成功

分布式基础篇总结

  • 1、分布式基础概念

    • 微服务、注册中心、配置中心、远程调用、Feign、 网关
  • 2、基础开发
    • SpringBoot2.0、 SpringCloud、 Mybatis-Plus、 Vue组件化、阿里云对象存储
  • 3、环境
    • Vagrant、 Linux、 Docker、 MySQL、 Redis、 逆向工程&人人开源
  • 4、开发规范
    • 数据校验JSR303、全局异常处理、全局统一返回、全局跨域处理
    • 枚举状态、业务状态码、VO与TO与PO划分、逻辑删除
    • Lombok: @Data、 @SIf4j

仓库管理(库存系统模块)相关推荐

  1. 坚持#第380天~WMS仓库管理移动应用解决方案-二维码库存系统

    沈阳工作感言 发生疫情了,我和经理都去不了沈阳,于是沈阳仓库黄了,法雷奥自己做了. 哈哈哈哈,仓库没有我和经理就不行呀,毕竟重点工作都是由我来做的. 好好总结一下我自己开发的系统吧(幸好之前我早已料到 ...

  2. 生产制造业ERP系统模块

    生产制造业ERP系统模块 1.  计划管理系统 (1).物料需求管理 支持如下功能: ●     配置产品的管理,用户可以定义可选件.必选件,以及必选件中的可选件 ●     BOM成批修改 ●    ...

  3. 仓库系统用什么服务器,什么是仓库管理saas系统 仓库管理saas系统的功能有哪些...

    随着互联网技术的发展让很多应用软件相对成熟,仓库管理saas系统的出现让企业能够更加方便方便管理业务,那开发仓库管理的saas系统的功能模块有哪些呢? 什么是仓库管理saas系统 仓库管理saas系统 ...

  4. 水果库存系统(基础版)

    不为失败找理由,只为成功找方法.所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长. 文章目录 一.知识储备 二.系统设计 1.系统介绍 2.系统结构 三.效果展示 四.功能 ...

  5. EBS 系统模块简称

    财务模块: Oracle 总帐管理(GL)General Ledger Oracle 应付帐管理(AP)Account Payable Oracle 应收帐管理(AR)Account Receivab ...

  6. 【电商】通过商品流转了解系统模块组成

    接二连三地写了十几篇关于电商财务的内容,都是些粗浅的介绍与总结,这部分只是财务系统的一部分,相对于电子商务公司的系统和业务来说更是很小的一部分. 罗马帝国不是一天建成的,正是因为有了这些微小系统的组成 ...

  7. 超市库存管理java sql_基于JAVA的超市管理(商店库存)系统的设计与实现(Eclipse,SQLServer)...

    基于JAVA的超市管理(商店库存)系统的设计与实现(Eclipse,SQLServer)(论文14000字,程序代码,SQLServer数据库) 摘要:本文的内容是针对超市管理系统,对该系统的运行过程 ...

  8. unity快速库存系统快速开发插件(Ultimate Inventory System)(二)

    文章目录 前言 一.准备工作(库存类型定义) 二.物品定义 三.货币系统 四.物品制作 总结 前言 这篇为自定义物品篇,我们将一起探索如何自定义各种物品,制作合成:篇幅略长,因为这块能说的挺多,可酌情 ...

  9. 系统模块——什么是系统模块、path 路径操作、相对路径VS绝对路径

    系统模块 什么是系统模块 Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块 系统模块fs 文件操作 系统模块path 路 ...

最新文章

  1. error MSB8008: 指定的平台工具集(v110)未安装或无效
  2. win10系统如何安装iis信息服务器,win10系统安装iis服务功能的具体方法【图文教程】...
  3. MacBook Air 使用技巧
  4. 最大矩形—leetcode85
  5. 两种求集合全部子集的方法
  6. 自定义工具类:导入工具类测试
  7. Spring的IoC与DI差异
  8. 字符串:2.BF算法(普通模式匹配算法)
  9. 怎样彻底删除系统服务项
  10. Torch环境搭建遇到的问题
  11. 2021年微信小程序点餐系统功能模板搭建
  12. 一位中科院计算机女生的读博日记
  13. Unity 3D 特效学习记录
  14. 高德地图哪个语音包最好_高德语音导航怎么呼叫?高德地图语音包怎么设置
  15. Spring Security 配置
  16. 黄一老师:管理者需要知道的“三多”和“三少”
  17. 有什么蓝牙耳机不贵又实用?学生党适合使用的蓝牙耳机
  18. 腾讯高级工程师保姆级“Java成长手册”,层层递进,全是精华
  19. 《SysML精粹》学习记录--第六章
  20. 计算机基础——Windows 7操作系统

热门文章

  1. BGA锡球选择与PITCH的关系
  2. linux 进程间通信 数据库,什么是进程间通信
  3. 进程通信实例之父子进程通信
  4. 通过 JFR 与日志深入探索 JVM - TLAB 原理详解
  5. ATOM基础教程一linter-php配置(12)
  6. 《一名网络工程师的自我修养》--子网划分
  7. JSP页面和html页面中文乱码的解决
  8. CSS样式自动换行(总结)
  9. PKUSC2019总结
  10. 985大学计算机国赛,盘点通往985、211院校的108条路,总有一条适合你的