【谷粒商城基础篇】仓储服务:仓库维护

news2024/11/15 20:35:20

在这里插入图片描述

谷粒商城笔记合集

分布式基础篇分布式高级篇高可用集群篇
===简介&环境搭建===
项目简介与分布式概念(第一、二章)
基础环境搭建(第三章)
===整合SpringCloud===
整合SpringCloud、SpringCloud alibaba(第四、五章)
===前端知识===
前端开发基础知识(第六章)
===商品服务开发===
商品服务开发:基础概念、三级分类(第七、八章)
商品服务开发:品牌管理(第九章)
商品服务开发:属性分组、平台属性(第十、十一章)
商品服务:商品维护(第十二、十三章)
===仓储服务开发===
仓储服务:仓库维护(第十四章)
基础篇总结(第十五章)

十四、仓储服务&仓库维护⚠️

14.1 后端开发:整合仓储服务⚠️

  1. 修改 网关服务 的路由配置并重启:application.yaml

    spring:
      cloud:
        gateway:
          routes:
            - id: ware_route
              uri: lb://bilimall-ware
              predicates:
                - Path=/api/ware/**
              filters:
                - RewritePath=/api/?(?<segment>.*),/$\{segment}
    
  2. 修改 仓储服务 的配置文件:注册中心、配置中心、服务名、Mybatis等

    spring:
      datasource:
        username: root
        password: bilimall
        url: jdbc:mysql://114.132.162.129:3306/bilimall_wms?useUnicode=true&characterEncoding=utf-8&useSSL=false
        driver-class-name: com.mysql.cj.jdbc.Driver
      cloud:
        nacos:
          discovery:
            server-addr: 114.132.162.129:8848
      application:
        name: bilimall-ware
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
    mybatis-plus:
      # mapper文件扫描:不仅扫描我的类路径,还包括依赖的其他类路径
      mapper-locations: classpath*:/mapper/**/*.xml
      global-config:
        db-config:
          id-type: auto # 数据库主键自增
    server:
      port: 12000
    logging:
      level: 
        cn.lzwei: debug
    
  3. 修改 仓储服务 的主启动类:cn/lzwei/bilimall/ware/BilimallWareApplication.java

    @EnableTransactionManagement
    @EnableFeignClients(basePackages = "cn.lzwei.bilimall.ware.feign")
    @EnableDiscoveryClient
    @MapperScan("cn.lzwei.bilimall.ware.dao")
    @SpringBootApplication
    public class BilimallWareApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BilimallWareApplication.class, args);
        }
    
    }
    

14.2 API:查询 仓库列表

在这里插入图片描述

  1. WareInfoController:查询仓库列表

    @RestController
    @RequestMapping("ware/wareinfo")
    public class WareInfoController {
        @Autowired
        private WareInfoService wareInfoService;
    
        /**
         * 查询仓库列表:模糊查询
         */
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params){
            PageUtils page = wareInfoService.queryPage(params);
    
            return R.ok().put("page", page);
        }
    }
    
  2. WareInfoService:查询仓库列表

    public interface WareInfoService extends IService<WareInfoEntity> {
    
        PageUtils queryPage(Map<String, Object> params);
    }
    
  3. WareInfoServiceImpl:查询仓库列表

    @Service("wareInfoService")
    public class WareInfoServiceImpl extends ServiceImpl<WareInfoDao, WareInfoEntity> implements WareInfoService {
    
        @Override
        public PageUtils queryPage(Map<String, Object> params) {
            QueryWrapper<WareInfoEntity> queryWrapper = new QueryWrapper<>();
            String key = (String) params.get("key");
            if(!StringUtils.isNullOrEmpty(key)){
                queryWrapper.and(item->{
                    item.eq("id",key).or().like("name",key).or().like("areacode",key);
                });
            }
            IPage<WareInfoEntity> page = this.page(
                    new Query<WareInfoEntity>().getPage(params),
                    queryWrapper
            );
    
            return new PageUtils(page);
        }
    }
    

14.3 API:查询 商品库存

在这里插入图片描述

  1. WareSkuController:查询商品库存列表

    @RestController
    @RequestMapping("ware/waresku")
    public class WareSkuController {
        @Autowired
        private WareSkuService wareSkuService;
    
        /**
         * 查询商品库存列表:仓库、指定商品
         */
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params){
            PageUtils page = wareSkuService.queryPage(params);
    
            return R.ok().put("page", page);
        }
    }
    
  2. WareSkuService:查询商品库存列表

    public interface WareSkuService extends IService<WareSkuEntity> {
        /**
         * 查询商品库存列表:仓库、指定商品
         */
        PageUtils queryPage(Map<String, Object> params);
    }
    
  3. WareSkuServiceImpl:查询商品库存列表

    @Service("wareSkuService")
    public class WareSkuServiceImpl extends ServiceImpl<WareSkuDao, WareSkuEntity> implements WareSkuService {
        /**
         * 查询商品库存列表:仓库、指定商品
         */
        @Override
        public PageUtils queryPage(Map<String, Object> params) {
            QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>();
            //1.仓库
            String wareId = (String) params.get("wareId");
            if(!StringUtils.isNullOrEmpty(wareId)){
                queryWrapper.eq("ware_id",wareId);
            }
            //2.指定商品
            String skuId = (String) params.get("skuId");
            if(!StringUtils.isNullOrEmpty(skuId)){
                queryWrapper.eq("sku_id",skuId);
            }
            IPage<WareSkuEntity> page = this.page(
                    new Query<WareSkuEntity>().getPage(params),
                    queryWrapper
            );
    
            return new PageUtils(page);
        }
    }
    

14.4 API:查询 采购需求

在这里插入图片描述

  1. PurchaseDetailController

    @RestController
    @RequestMapping("ware/purchasedetail")
    public class PurchaseDetailController {
        @Autowired
        private PurchaseDetailService purchaseDetailService;
    
        /**
         * 查询采购需求列表:模糊查询、状态、指定仓库
         */
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params){
            PageUtils page = purchaseDetailService.queryPage(params);
    
            return R.ok().put("page", page);
        }
    }
    
  2. PurchaseDetailService

    public interface PurchaseDetailService extends IService<PurchaseDetailEntity> {
        /**
         * 查询采购需求列表:模糊查询、状态、指定仓库
         */
        PageUtils queryPage(Map<String, Object> params);
    }
    
  3. PurchaseDetailServiceImpl

    @Service("purchaseDetailService")
    public class PurchaseDetailServiceImpl extends ServiceImpl<PurchaseDetailDao, PurchaseDetailEntity> implements PurchaseDetailService {
        /**
         * 查询采购需求列表:模糊查询、状态、指定仓库
         */
        @Override
        public PageUtils queryPage(Map<String, Object> params) {
            QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<>();
            //1.模糊查询
            String key = (String) params.get("key");
            if (!StringUtils.isNullOrEmpty(key)){
                queryWrapper.and(item->{
                    item.eq("purchase_id",key).or().eq("id",key).or().eq("sku_id",key);
                });
            }
            //2.状态
            String status = (String) params.get("status");
            if (!StringUtils.isNullOrEmpty(status)){
                queryWrapper.eq("status",status);
            }
            //3.指定仓库
            String wareId = (String) params.get("wareId");
            if (!StringUtils.isNullOrEmpty(wareId)){
                queryWrapper.eq("ware_id",wareId);
            }
            IPage<PurchaseDetailEntity> page = this.page(
                    new Query<PurchaseDetailEntity>().getPage(params),
                    queryWrapper
            );
    
            return new PageUtils(page);
        }
    }
    

14.5 API:新增 采购单

在这里插入图片描述

新增采购单,同时保存相关时间信息:PurchaseController

@RestController
@RequestMapping("ware/purchase")
public class PurchaseController {
    @Autowired
    private PurchaseService purchaseService;

    /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody PurchaseEntity purchase){
        purchase.setCreateTime(new Date());
        purchase.setUpdateTime(new Date());
		purchaseService.save(purchase);

        return R.ok();
    }
}

14.5 API:合并采购需求⚠️

在这里插入图片描述

14.5.1 查询 可被合并到的采购单

在这里插入图片描述

  1. PurchaseController

    @RestController
    @RequestMapping("ware/purchase")
    public class PurchaseController {
        @Autowired
        private PurchaseService purchaseService;
    
        /**
         * 获取采购单列表:状态为 新建、已分配
         */
        @GetMapping("/unreceive/list")
        public R unrecivePurchase(@RequestParam Map<String, Object> params){
            PageUtils page=purchaseService.getUnrecivePurchase(params);
            return R.ok().put("page",page);
        }
    }
    
  2. PurchaseService

    public interface PurchaseService extends IService<PurchaseEntity> {
        /**
         * 获取采购单列表:状态为 新建、已分配
         */
        PageUtils getUnrecivePurchase(Map<String, Object> params);
    }
    
  3. PurchaseServiceImpl

    @Service("purchaseService")
    public class PurchaseServiceImpl extends ServiceImpl<PurchaseDao, PurchaseEntity> implements PurchaseService {
        /**
         * 获取采购单列表:状态为 新建、已分配
         */
        @Override
        public PageUtils getUnrecivePurchase(Map<String, Object> params) {
            QueryWrapper<PurchaseEntity> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("status",0).or().eq("status",1);
            IPage<PurchaseEntity> page = this.page(
                    new Query<PurchaseEntity>().getPage(params),
                    queryWrapper
            );
    
            return new PageUtils(page);
        }
    }
    

14.5.2 合并采购需求⚠️

在这里插入图片描述

  1. 公共服务 中创建 采购单、采购需求 状态的枚举常量类:cn/lzwei/common/constant/WareConstant.java

    public class WareConstant {
        //采购单状态
        public enum PurchaseType{
            CREATE(0,"新建"),ASSIGNED(1,"已分配"),
            RECEIVED(2,"已领取"),FINISHED(3,"已完成"),
            HASEXECPTION(4,"有异常");
            private Integer code;
            private String msg;
            PurchaseType(Integer code,String msg){
                this.code=code;
                this.msg=msg;
            }
    
            public Integer getCode() {
                return code;
            }
    
            public String getMsg() {
                return msg;
            }
        }
        //采购需求状态
        public enum PurchaseDetailType{
            CREATE(0,"新建"),ASSIGNED(1,"已分配"),
            BUYING(2,"正在采购"),FINISHED(3,"已完成"),
            FAILED(4,"采购失败");
            private Integer code;
            private String msg;
            PurchaseDetailType(Integer code,String msg){
                this.code=code;
                this.msg=msg;
            }
    
            public Integer getCode() {
                return code;
            }
    
            public String getMsg() {
                return msg;
            }
        }
    }
    
  2. 仓储服务 中创建用来接收请求的VO:cn/lzwei/bilimall/ware/vo/MergePurchaseVo.java

    @Data
    public class MergePurchaseVo {
        //采购单id
        private Long purchaseId;
        //采购需求列表
        private List<Long> items;
    }
    
  3. PurchaseController:合并采购需求

    @RestController
    @RequestMapping("ware/purchase")
    public class PurchaseController {
        @Autowired
        private PurchaseService purchaseService;
    
        /**
         * 合并采购需求:1.指定采购单,更新对应的采购需求以及采购单信息;2.无指定采购单,创建采购单并更新采购需求以及采购单信息
         */
        @PostMapping("/merge")
        public R mergePurchase(@RequestBody MergePurchaseVo mergePurchaseVo){
            purchaseService.mergePurchase(mergePurchaseVo);
            return R.ok();
        }
    }
    
  4. PurchaseService:合并采购需求

    public interface PurchaseService extends IService<PurchaseEntity> {
        /**
         * 合并采购需求:1.指定采购单,更新对应的采购需求以及采购单信息;2.无指定采购单,创建采购单并更新采购需求以及采购单信息
         */
        void mergePurchase(MergePurchaseVo mergePurchaseVo);
    }
    
  5. PurchaseServiceImpl:合并采购需求

    @Service("purchaseService")
    public class PurchaseServiceImpl extends ServiceImpl<PurchaseDao, PurchaseEntity> implements PurchaseService {
        @Resource
        PurchaseDetailService purchaseDetailService;
        
        /**
         * 合并采购需求:1.指定采购单,更新对应的采购需求以及采购单信息;2.无指定采购单,创建采购单并更新采购需求以及采购单信息
         */
        @Transactional
        @Override
        public void mergePurchase(MergePurchaseVo mergePurchaseVo) {
            //判断是否有指定采购单
            Long purchaseId = mergePurchaseVo.getPurchaseId();
            if(purchaseId==null){
                //新建采购单
                PurchaseEntity purchaseEntity = new PurchaseEntity();
                purchaseEntity.setCreateTime(new Date());
                purchaseEntity.setUpdateTime(new Date());
                purchaseEntity.setStatus(WareConstant.PurchaseType.CREATE.getCode()); //新建状态
                this.save(purchaseEntity);
                purchaseId=purchaseEntity.getId();
            }
            //TODO 确认采购单状态是0、1才可以合并
            //1.获取采购单集合
            List<Long> items = mergePurchaseVo.getItems();
            Long finalPurchaseId = purchaseId;
            List<PurchaseDetailEntity> purchaseDetailEntities = items.stream().map(item -> {
                PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
                purchaseDetailEntity.setId(item);
                purchaseDetailEntity.setPurchaseId(finalPurchaseId);
                purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailType.ASSIGNED.getCode());
                return purchaseDetailEntity;
            }).collect(Collectors.toList());
            //2.更新采购需求上的采购单id和状态
            purchaseDetailService.updateBatchById(purchaseDetailEntities);
            //3.修改采购单的更新时间
            PurchaseEntity purchaseEntity = new PurchaseEntity();
            purchaseEntity.setId(finalPurchaseId);
            purchaseEntity.setUpdateTime(new Date());
            this.updateById(purchaseEntity);
        }
    }
    

14.6 API:模拟领取采购单💡

在这里插入图片描述

  1. PurchaseController:模拟领取采购单

    @RestController
    @RequestMapping("ware/purchase")
    public class PurchaseController {
        @Autowired
        private PurchaseService purchaseService;
    
        /**
         * 模拟领取采购单:需要验证采购单、采购需求的状态
         */
        @PostMapping("/received")
        public R receivedPurchase(@RequestBody List<Long> ids){
            purchaseService.receivedPurchase(ids);
            return R.ok();
        }
    }
    
  2. PurchaseService:模拟领取采购单

    public interface PurchaseService extends IService<PurchaseEntity> {
        /**
         * 模拟领取采购单:需要验证采购单、采购需求的状态
         */
        void receivedPurchase(List<Long> ids);
    }
    
  3. PurchaseServiceImpl:模拟领取采购单

    @Service("purchaseService")
    public class PurchaseServiceImpl extends ServiceImpl<PurchaseDao, PurchaseEntity> implements PurchaseService {
        @Resource
        PurchaseDetailService purchaseDetailService;
        /**
         * 模拟领取采购单:需要验证采购单、采购需求的状态
         */
        @Transactional
        @Override
        public void receivedPurchase(List<Long> ids) {
            //1.验证采购单状态:只有新建、已分配的采购单可以被领取
            List<PurchaseEntity> purchaseEntities = ids.stream().map(item -> {
                PurchaseEntity purchaseEntity = this.getById(item);
                return purchaseEntity;
            }).filter(item->{
                Integer status = item.getStatus();
                if(status==WareConstant.PurchaseType.CREATE.getCode() || status==WareConstant.PurchaseType.ASSIGNED.getCode()){
                    return true;
                }
                return false;
            }).map(item->{
                //2.更新采购单状态、更新时间
                item.setStatus(WareConstant.PurchaseType.RECEIVED.getCode());
                item.setUpdateTime(new Date());
                return item;
            }).collect(Collectors.toList());
            this.updateBatchById(purchaseEntities);
            //遍历每一份采购单
            for (PurchaseEntity purchaseEntity : purchaseEntities) {
                //3.获取采购单下的采购需求:状态必须为新建、已分配
                Long id = purchaseEntity.getId();
                List<PurchaseDetailEntity> purchaseDetailEntities = purchaseDetailService.listDetailByPurchaseId(id);
                List<PurchaseDetailEntity> collect = purchaseDetailEntities.stream().map(item -> {
                    PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
                    purchaseDetailEntity.setId(item.getId());
                    purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailType.BUYING.getCode());
                    return purchaseDetailEntity;
                }).collect(Collectors.toList());
                //4.更新采购需求的状态
                purchaseDetailService.updateBatchById(collect);
            }
        }
    }
    
  4. PurchaseDetailService:获取采购单下新建或已分配状态的采购需求

    public interface PurchaseDetailService extends IService<PurchaseDetailEntity> {
        /**
         * 获取采购单下新建或已分配状态的采购需求:用于领取采购单
         */
        List<PurchaseDetailEntity> listDetailByPurchaseId(Long id);
    }
    
  5. PurchaseDetailServiceImpl:获取采购单下新建或已分配状态的采购需求

    @Service("purchaseDetailService")
    public class PurchaseDetailServiceImpl extends ServiceImpl<PurchaseDetailDao, PurchaseDetailEntity> implements PurchaseDetailService {
        /**
         * 获取采购单下新建或已分配状态的采购需求:用于领取采购单
         */
        @Override
        public List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {
            //获取采购单下新建或已分配状态的采购需求
            QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<PurchaseDetailEntity>()
                    .eq("purchase_id", id)
                    .and(item->{
                                item.eq("status",0).or().eq("status",1);
                            }
                    );
            return this.list(queryWrapper);
        }
    }
    

14.7 API:模拟完成采购单⚠️

14.7.1 效果

采购完成前

在这里插入图片描述

模拟采购

在这里插入图片描述

采购完成后

在这里插入图片描述

14.7.2 商品服务开发

  • SkuInfoController.java:用于仓库服务远程调用查询商品名称

    @RestController
    @RequestMapping("product/skuinfo")
    public class SkuInfoController {
        @Autowired
        private SkuInfoService skuInfoService;
        /**
         * 信息:将用于仓库服务远程调用查询商品名称
         */
        @RequestMapping("/info/{skuId}")
        public R info(@PathVariable("skuId") Long skuId){
    		SkuInfoEntity skuInfo = skuInfoService.getById(skuId);
    
            return R.ok().put("skuInfo", skuInfo);
        }
    }
    

14.7.3 库存服务开发

  1. 创建接收数据的采购单VO:cn/lzwei/bilimall/ware/vo/PurchaseDoneVo.java

    @Data
    public class PurchaseDoneVo {
        //采购单id
        @NotNull
        private Long id;
        //采购需求列表完成状况
        private List<PurchaseDetailsDoneVo> items;
    }
    
  2. 创建接收数据的采购需求VO:cn/lzwei/bilimall/ware/vo/PurchaseDetailsDoneVo.java

    @Data
    public class PurchaseDetailsDoneVo {
        //采购需求id
        private Long itemId;
        //采购需求状态
        private Integer status;
        //失败原因
        private String reason;
    }
    
  3. 创建远程调用商品服务的接口:cn/lzwei/bilimall/ware/feign/ProductFeignService.java

    @FeignClient(name = "bilimall-product")
    public interface ProductFeignService {
        //获取商品服务的sku信息
        @RequestMapping("/product/skuinfo/info/{skuId}")
        R info(@PathVariable("skuId") Long skuId);
    }
    
  4. PurchaseController:模拟完成采购:更新采购需求的状态 ——> 更新采购单状态 ——> 添加库存

    @RestController
    @RequestMapping("ware/purchase")
    public class PurchaseController {
        @Autowired
        private PurchaseService purchaseService;
    
        /**
         * 模拟完成采购:更新采购需求的状态 ——> 更新采购单状态 ——> 添加库存
         */
        @PostMapping("/done")
        public R done(@Valid @RequestBody PurchaseDoneVo purchaseDoneVo){
            purchaseService.done(purchaseDoneVo);
            return R.ok();
        }
    }
    
  5. PurchaseService:模拟完成采购:更新采购需求的状态 ——> 更新采购单状态 ——> 添加库存

    public interface PurchaseService extends IService<PurchaseEntity> {
        /**
         * 模拟完成采购:更新采购需求的状态 ——> 更新采购单状态 ——> 添加库存
         */
        void done(PurchaseDoneVo purchaseDoneVo);
    }
    
  6. PurchaseServiceImpl:模拟完成采购:更新采购需求的状态 ——> 更新采购单状态 ——> 添加库存

    @Service("purchaseService")
    public class PurchaseServiceImpl extends ServiceImpl<PurchaseDao, PurchaseEntity> implements PurchaseService {
        @Resource
        PurchaseDetailService purchaseDetailService;
        @Resource
        WareSkuService wareSkuService;
        @Resource
        ProductFeignService productFeignService;
    
        /**
         * 模拟完成采购:更新采购需求的状态 ——> 更新采购单状态 ——> 添加库存
         */
        @Transactional
    	@Override
        public void done(PurchaseDoneVo purchaseDoneVo) {
            //此采购单状态为新建、已分配、已领取时才可被完成
            Long PurchaseId = purchaseDoneVo.getId();
            PurchaseEntity purchase = this.getById(PurchaseId);
            Integer purchaseCanDone = purchase.getStatus();
            if(purchaseCanDone==WareConstant.PurchaseType.CREATE.getCode() ||
                    purchaseCanDone==WareConstant.PurchaseType.ASSIGNED.getCode() ||
                    purchaseCanDone==WareConstant.PurchaseType.RECEIVED.getCode()){
                //标志位:用于判断采购单状态
                boolean purchaseStatus=true;
                //遍历采购需求列表
                List<PurchaseDetailsDoneVo> items = purchaseDoneVo.getItems();
                for (PurchaseDetailsDoneVo item : items) {
                    //采购需求状态为新建、已分配、正在采购时才可被完成
                    Long itemId = item.getItemId();
                    PurchaseDetailEntity purchaseDetailEntity = purchaseDetailService.getById(itemId);
                    Integer purchaseDetailCanDone = purchaseDetailEntity.getStatus();
                    if(purchaseDetailCanDone==WareConstant.PurchaseDetailType.CREATE.getCode() ||
                            purchaseDetailCanDone==WareConstant.PurchaseDetailType.ASSIGNED.getCode() ||
                            purchaseDetailCanDone==WareConstant.PurchaseDetailType.BUYING.getCode()){
                        //1.更新采购需求状态
                        Integer status = item.getStatus();
                        purchaseDetailEntity.setStatus(status);
                        purchaseDetailService.updateById(purchaseDetailEntity);
                        if(status==4){
                            //采购失败
                            purchaseStatus=false;
                        }else{
                            //采购完成
                            //2.添加或者修改采购完成的商品库存:需要skuid、仓库id、库存、sku名字(调用远程服务)
                            Long skuId = purchaseDetailEntity.getSkuId();
                            Long wareId = purchaseDetailEntity.getWareId();
                            Integer skuNum = purchaseDetailEntity.getSkuNum();
                            Map<String,Object> skuInfo = (Map<String, Object>) productFeignService.info(skuId).get("skuInfo");
                            String skuName= (String) skuInfo.get("skuName");
                            wareSkuService.addWare(skuId,wareId,skuNum,skuName);
                        }
                    }
                }
                //3.根据采购需求列表的状态更新采购单状态
                PurchaseEntity purchaseEntity = new PurchaseEntity();
                purchaseEntity.setId(PurchaseId);
                purchaseEntity.setStatus(purchaseStatus?WareConstant.PurchaseType.FINISHED.getCode():WareConstant.PurchaseType.HASEXECPTION.getCode());
                purchaseEntity.setUpdateTime(new Date());
                this.updateById(purchaseEntity);
            }
        }
    }
    
  7. WareSkuService:添加或者修改采购完成的商品库存

    public interface WareSkuService extends IService<WareSkuEntity> {
        /**
         * 添加或者修改采购完成的商品库存:需要skuid、仓库id、库存、sku名字(调用远程服务)
         */
        void addWare(Long skuId, Long wareId, Integer skuNum, String skuName);
    }
    
  8. WareSkuServiceImpl:添加或者修改采购完成的商品库存

    @Service("wareSkuService")
    public class WareSkuServiceImpl extends ServiceImpl<WareSkuDao, WareSkuEntity> implements WareSkuService {
        /**
         * 添加或者修改采购完成的商品库存:需要skuid、仓库id、库存、sku名字(调用远程服务)
         */
        @Override
        public void addWare(Long skuId, Long wareId, Integer skuNum, String skuName) {
            //判断仓库是否存在该商品记录
            QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("sku_id",skuId).eq("ware_id",wareId);
            List<WareSkuEntity> list = this.list(queryWrapper);
            if(list==null || list.size()==0){
                //1.新增:不存在库存记录
                WareSkuEntity wareSkuEntity = new WareSkuEntity();
                wareSkuEntity.setSkuId(skuId);
                wareSkuEntity.setWareId(wareId);
                wareSkuEntity.setStock(skuNum);
                wareSkuEntity.setSkuName(skuName);
                this.save(wareSkuEntity);
            }else{
                //2.修改:存在库存记录
                baseMapper.updateSkuStock(skuId,wareId,skuNum);
            }
        }
    }
    
  9. WareSkuDao.java:完成采购单,商品存在库存记录时更新库存

    @Mapper
    public interface WareSkuDao extends BaseMapper<WareSkuEntity> {
        void updateSkuStock(@Param(value = "skuId") Long skuId,@Param(value = "wareId") Long wareId,@Param(value = "skuNum") Integer skuNum);
    }
    
  10. WareSkuDao.xml:完成采购单,商品存在库存记录时更新库存

    <mapper namespace="cn.lzwei.bilimall.ware.dao.WareSkuDao">
        <update id="updateSkuStock">
            UPDATE `wms_ware_sku` SET stock=stock+#{skuNum} WHERE sku_id=#{skuId} AND ware_id=#{wareId}
        </update>
    </mapper>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android 创建aar包

1. 背景 由于新入职公司在做硬件接入的项目&#xff0c;需要接入多款硬件&#xff0c;而且&#xff0c;几个app的功能不太一样。于是&#xff0c;需要模块化开发&#xff0c;并且许多东西都是可以复用的&#xff08;像网络框架、log、shareprefrence、权限申请等&#xff09;。…

嵌入式HLS 案例开发步骤分享——Zynq-7010/20工业开发板(1)

目 录 前 言 3 1 HLS 开发流程说明 5 1.1 HLS 工程导入 5 1.2 编译与仿真 6 1.3 综合 8 1.4 IP 核封装 10 1.5 IP 核测试 14 前 言 本文主要介绍 HLS 案例的使用说明,适用开发环境: Windows 7/10 64bit、Xilinx Vivado 2017.4 、Xilinx Vivado HLS 2017.4 、Xilinx…

数据结构|排序算法详解

​​​​​​​目录 一.插入类 1.直接插入排序 2.希尔排序 二.选择类&#xff0c;排一次选出一个最值 1.选择排序 2.堆排序 三.交换类&#xff0c;通过一直交换一次确定数字的位置 1.冒泡排序 2.快速排序 2.1 hoare版本 2.2挖坑法 2.3前后指针法 四.归并类 1.归并…

Go第 5 章:程序流程控制

第五章程序流程控制 5.1程序流程控制介绍 在程序中&#xff0c;程序运行的流程控制决定程序是如何执行的&#xff0c;是我们必须掌握的&#xff0c;主要有三大流程控 制语句。 1)顺序控制 2)分支控制 3)循环控制 5.2 顺序控制 程序从上到下逐行地执行&#xff0c;中间没有任…

C++标准库的智能指针:shared_ptr、weak_ptr和unique_ptr

文章目录智能指针shared_ptr模版类week_ptr模版类unique_ptrC中是没有内存回收机制的&#xff0c;我在之前的一篇文章中提到使用指针的一些基本方法。C在std标准库中也提供了三种封装过的指针模版类&#xff0c;称作为智能指针&#xff1a;shared_ptrunique_ptrweek_ptr 我这里…

JVM性能调优详解

前面我们学习了整个JVM系列&#xff0c;最终目标的不仅仅是了解JVM的基础知识&#xff0c;也是为了进行JVM性能调优做准备。这篇文章带领大家学习JVM性能调优的知识。 性能调优 性能调优包含多个层次&#xff0c;比如&#xff1a;架构调优、代码调优、JVM调优、数据库调优、操…

最优二叉树(哈夫曼树)

一、最优二叉树 1、定义 官方定义&#xff1a;在权值为w1&#xff0c;w2&#xff0c;…&#xff0c;wn的 n个叶子所构成的所有二叉树中&#xff0c;带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。 通俗来讲&#xff0c;就是给定N个权值作为N个叶子结点&…

仿牛客论坛项目总结

一.数据库中每一张表有哪些字段 user表 用户表 &#xff08;1&#xff09;id 用户的id &#xff08;2&#xff09; username 用户名 &#xff08;3&#xff09;password 密码 &#xff08;4&#xff09;salt 盐 &#xff08;5&#xff09;emai邮箱 &#xff08;6&…

PAT甲级1008 Elevator C++/C语言

1008 Elevator 分数 20 作者 CHEN, Yue 单位 浙江大学 The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified order. It costs 6 seconds …

联邦学习将如何影响您的日常生活?

人工智能 (AI) 被认为是下一次工业革命的最大创新之一&#xff0c;其中包括机器学习。另一方面&#xff0c;随着原油和电力成为现代工业的基础资源&#xff0c;数据成为人工智能和机器学习的关键要素。 数据隐私与需求之间的冲突 训练的数据样本的大小决定了可用于增强 AI 性能…

CPT203-Software Engineering(2)

文章目录5. Scrum Framework5.1 Scrum Roles5.2 Scrum Activities and Artifacts6. Requirements Engineering6.1 User requirements and system requirements6.2 Functional & Non-functional requirements6.2.1 Functional requirements6.2.2 Non-functional requirement…

第一章:C++算法基础之基础算法

系列文章目录 文章目录系列文章目录前言一、排序&#xff08;1&#xff09;快速排序核心思想思路分析模板&#xff08;2&#xff09;归并排序核心思想思路分析模板稳定性时间复杂度二分查找&#xff08;1&#xff09;整数二分核心思想思路分析模板&#xff08;2&#xff09;浮点…

jetson nano系统引导安装(无外设安装方式)

文章目录一.硬件设置二.系统设置一.硬件设置 插入烧写好系统的SD卡将micro USB线接到jetson nano上&#xff0c;另一端USB A接到电脑上为jetson nano插入电源&#xff0c;开机等待电脑检测到如下盘符说明jetson nano连接成功 二.系统设置 进入电脑的设备管理器&#xff0c;查…

【linux】三种权限的使用和更改、粘滞位和yum的使用

目录 1.权限问题 ①什么是权限&#xff1f; ②小问题 ③默认权限 ④如何更改“人”的权限呢&#xff1f; ⑤更改权限的八进制方案 ⑥强制改权限里的“人”&#xff08;权限人文件属性&#xff09; 2.粘滞位 2.yum的使用 1.权限问题 ①什么是权限&#xff1f; 权限人&a…

HTTP协议解析

HTTP概述 HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的应用层协议~~我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的。 HTTP工作过程&#xff1a; 当我们在浏览器中输入一个 "网址"&#xff0c;此时浏览器就会给对应的服务器发送一个 H…

CTF中的PHP特性函数(上)

前言 对于PHP大家一定不陌生&#xff0c;但你知道PHP在CTF中是如何考察的吗&#xff0c;本文给大家带来的是通过PHP特性来进行CTF比赛中解题出题的知识&#xff0c;会介绍一下CTF中常见的php特性以及围绕该知识点的相关案例&#xff0c;因为内容过多这里分成上中下三篇来讲&am…

操作系统的特征

文章目录&#x1f380;前言&#xff1a;本篇博客知识总览&#x1f354;并发&#x1f387;概念&#xff1a;&#x1f354;共享&#x1f387;概念&#xff1a;&#x1f354;虚拟&#x1f387;概念&#xff1a;&#x1f354;异步&#x1f387;概念&#xff1a;&#x1f3f3;️‍&a…

ThinkPHP 多应用模式之Api路由分组+中间件

ThinkPHP 6.1 在多应用模式下实现API路由分组中间件验证业务 目录 1.创建中间件文件 2.迁移中间件到子应用目录中 3.编辑中间件验证业务 修改命名空间 编写handle处理代码 4.注册中间件 编辑中间件文件 TP内置中间件 5.设置路由分组 优化相同控制器前缀 最终效果&am…

【信息论与编码 沈连丰】第六章:连续信息和连续信道

【信息论与编码 沈连丰】第六章&#xff1a;连续信息和连续信道第六章 连续信息和连续信道6.1 连续消息的信息6.2 连续消息在信道上的传输问题6.3 香农信道容量公式6.4 连续消息的识别和理想接收机6.5 连续信源的数字处理及其编码第六章 连续信息和连续信道 6.1 连续消息的信息…

在 KubeSphere 上部署 OpenLDAP 并进行对接使用

在 KubeSphere 上部署 OpenLDAP 并进行对接-进阶背景前置条件KubeSphere 中部署 LDAP部署 LDAP 应用ApacheDirectoryStudio 验证 LDAP下载部署 ApacheDirectoryStudioApacheDirectoryStudio 测试 LDAP创建 Ldap Search &#xff0c;KS 对接时可选择使用KubeSphere 对接 LDAPHar…