第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)

news2024/9/24 6:51:43

1.仓储服务开发配置



1.1.加入到Nacos注册中心

spring:
  application:
    name: gmall-ware
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.139.10:8848
        namespace: 36854647-e68c-409b-9233-708a2d41702c


1.2.配置网关路由

spring:
  cloud:
    gateway:
      routes:
      - id: ware_route
        uri: lb://gmall-ware
        predicates:
        - Path=/api/ware/**
        filters:
        - RewritePath=/api/(?<segment>.*), /$\{segment}


1.3.主启动类开启相关功能

package com.atguigu.gmall.ware;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class GmallWareApplication {

    public static void main(String[] args) {
        SpringApplication.run(GmallWareApplication.class, args);
    }

}


1.4.MyBatisPlus分页插件配置

package com.atguigu.gmall.ware.config;

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

/**
 * MyBatisPlus 配置类 {@link MybatisPlusConfig}
 * @author zhangwen
 * @email: 1466787185@qq.com
 */
@Configuration
//开启事务
@EnableTransactionManagement
@MapperScan("com.atguigu.gmall.ware.dao")
public class MybatisPlusConfig {
    /**
     * 引入分页插件
     * @return 分页插件拦截器实例
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求,默认false
        paginationInterceptor.setOverflow(true);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInterceptor.setLimit(100);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}


2.仓库维护CRUD

  • 逆向工程已经实现了CRUD,只需要对查询进行修改
  • 添加仓库信息

在这里插入图片描述



3.采购单维护



3.1.采购流程

  1. 创建采购需求
  2. 创建采购单
  3. 为采购单分配采购人员
  4. 领取采购单
  5. 完成采购单
  6. 商品入库

采购流程图如下:
在这里插入图片描述



3.2.采购需求

采购需求生成方式:

  • 人工创建采购需求(人工)
  • 库存预警自动创建采购需求(自动化)

3.2.1.采购需求-人工新增


3.2.2.采购需求-查询

在这里插入图片描述

GET /ware/purchasedetail/list

//请求参数
{
	page: 1, // 当前页码
	limit: 10, // 每页记录数
	sidx: 'id', // 排序字段
	order: 'asc/desc', // 排序方式
	key: '华为', // 检索关键字
	status: 0, // 状态
	wareId: 1, // 仓库id
}

//响应数据
{
	"msg": "success",
	"code": 0,
	"page": {
		"totalCount": 0,
		"pageSize": 10,
		"totalPage": 0,
		"currPage": 1,
		"list": [{
			"id": 2,
			"purchaseId": 1,
			"skuId": 1,
			"skuNum": 2,
			"skuPrice": 22.0000,
			"wareId": 1,
			"status": 1
		}]
	}
}

PurchaseDetailController

/**
 * 采购需求列表
 */
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
    PageUtils page = purchaseDetailService.queryPage(params);

    return R.ok().put("page", page);
}

PurchaseDetailServiceImpl

/**
 * 采购需求列表查询
 * @param params
 * @return
 */
@Override
public PageUtils queryPage(Map<String, Object> params) {
    QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<>();

    String key = (String) params.get("key");
    if (!StringUtils.isEmpty(key)) {
        queryWrapper.and(wrapper -> {
            wrapper.eq("purchase_id", key).or().eq("sku_id", key);
        });
    }

    String status = (String) params.get("status");
    if (!StringUtils.isEmpty(status)) {
        queryWrapper.eq("status", status);
    }

    String wareId = (String) params.get("wareId");
    if (!StringUtils.isEmpty(wareId)) {
        queryWrapper.eq("ware_id", wareId);
    }

    IPage<PurchaseDetailEntity> page = this.page(
            new Query<PurchaseDetailEntity>().getPage(params),
            queryWrapper
    );

    return new PageUtils(page);
}

3.2.3.合并采购单

在这里插入图片描述
合并采购单有两种方式

  • 选择一个采购单
  • 若没有选择一个采购单,系统自动创建一个新的采购单进行合并

3.2.4.查询未领取的采购单

采购单状态:

  • CREATED(0, “新建”)
  • ASSIGNED(1, “已分配”)
  • RECEIVED(2, “已领取”)
  • FINISHED(3, “已完成”)
  • ERROR(4, “有异常”)

未领取的采购单:新建和已分配

GET /ware/purchase/unreceive/list

PurchaseController

/**
 * 查询未领取的采购单
 */
 @RequestMapping("/unreceive/list")
 public R listUnReceive(@RequestParam Map<String, Object> params){
     PageUtils page = purchaseService.queryPageUnReceivePurchase(params);
     return R.ok().put("page", page);
 }

PurchaseServiceImpl

 /**
  * 查询未领取的采购单
  * @param params
  * @return
  */
 @Override
 public PageUtils queryPageUnReceivePurchase(Map<String, Object> params) {
     IPage<PurchaseEntity> page = this.page(
             new Query<PurchaseEntity>().getPage(params),
             new QueryWrapper<PurchaseEntity>()
                     .eq("status",
                             WareConstant.PurchaseStatusEnum.CREATED.getCode()).or()
                     .eq("status",
                             WareConstant.PurchaseStatusEnum.ASSIGNED.getCode())
     );
     return new PageUtils(page);
 }

3.2.5.合并采购需求

在这里插入图片描述

POST /ware/purchase/merge

//请求参数
{
	purchaseId: 1, // 整单id
	items: [1,2,3] // 合并项集合
}

PurchaseController

/**
 * 合并采购需求-采购单
 * @return
 */
 @PostMapping("/merge")
 public R merge(@RequestBody MergeVO mergeVO) {
     purchaseService.mergePurchase(mergeVO);
     return R.ok();
 }

purchaseServiceImpl

/**
 * 合并采购需求-采购单
 * @param mergeVO
 */
@Transactional(rollbackFor = Exception.class)
@Override
public void mergePurchase(MergeVO mergeVO) {
    Long purchaseId = mergeVO.getPurchaseId();
    if (StringUtils.isEmpty(purchaseId)) {
        // 新增
        PurchaseEntity purchaseEntity = new PurchaseEntity();
        purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());
        purchaseEntity.setCreateTime(new Date());
        purchaseEntity.setUpdateTime(new Date());
        this.save(purchaseEntity);
        purchaseId = purchaseEntity.getId();
    }
    
    List<Long> items = mergeVO.getItems();
    Long finalPurchaseId = purchaseId;
    List<PurchaseDetailEntity> detailEntities = items.stream().map(item -> {
        PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
        purchaseDetailEntity.setId(item);
        purchaseDetailEntity.setPurchaseId(finalPurchaseId);
        purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailEnum.ASSIGNED.getCode());
        return purchaseDetailEntity;
    }).collect(Collectors.toList());
    detailService.updateBatchById(detailEntities);

    // 采购单更新时间
    PurchaseEntity purchaseEntity = new PurchaseEntity();
    purchaseEntity.setId(purchaseId);
    purchaseEntity.setUpdateTime(new Date());
    this.updateById(purchaseEntity);
}

4.采购单

菜单路径:库存系统 -> 采购单维护 -> 采购单



4.1.新建采购单-人工新增



4.2.查询采购单



4.3.分配采购人员

为采购单分配采购人员,采购人员从系统用户表中查询

在这里插入图片描述



4.4.领取采购单


4.4.1.API

POST /ware/purchase/received

//请求参数
[1,2,3,4] //采购单id

4.4.2.后台接口实现

PurchaseController

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

PurchaseServiceImpl

/**
 * 领取采购单
 * @param ids 采购单id集合
 */
@Transactional(rollbackFor = Exception.class)
@Override
public void receivePurchase(List<Long> ids) {
    // 1.确认当前采购单是新建或已分配状态
    List<PurchaseEntity> purchaseEntities = ids.stream().map(id -> {
        PurchaseEntity purchaseEntity = this.getById(id);
        return purchaseEntity;
    }).filter(purchaseEntity -> {
        if (purchaseEntity.getStatus() ==
        WareConstant.PurchaseStatusEnum.CREATED.getCode() ||
                purchaseEntity.getStatus() ==
        WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) {
            return true;
        }
        return false;
    }).map(purchaseEntity -> {
        // 设置采购单的状态为已领取
        purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.RECEIVED.getCode());
        purchaseEntity.setUpdateTime(new Date());
        return purchaseEntity;
    }).collect(Collectors.toList());
    
    // 2.批量修改采购单的状态
    this.updateBatchById(purchaseEntities);
    
    // 3.修改采购项的状态
    purchaseEntities.forEach(purchaseEntity -> {
        // 根据采购单id获取采购项
        List<PurchaseDetailEntity> detailEntities =
                detailService.listDetailByPurchaseId(purchaseEntity.getId());
        List<PurchaseDetailEntity> collect =
                detailEntities.stream().map(detailEntity ->{
            PurchaseDetailEntity entity = new PurchaseDetailEntity();
            entity.setId(detailEntity.getId());
            entity.setStatus(WareConstant.PurchaseDetailEnum.BUYING.getCode());
            return entity;
        }).collect(Collectors.toList());
        // 批量修改采购项状态
        detailService.updateBatchById(collect);
    });
}

4.4.3.Postman模拟领取采购单

使用Postman发送领取采购单请求

POST /ware/purchase/received

//请求参数
[1,2,3,4] //采购单id

领取成功后,采购单状态更新为 已领取

在这里插入图片描述

采购需求状态更新为 正在采购

在这里插入图片描述



4.5.完成采购单


4.5.1.API

POST /ware/purchase/done

// 请求参数
{
	"id":1, // 采购单id
	// itemId 采购项id,status 采购状态,reason 采购情况说明
	"items":[
		{"itemId":1,"status":3,"reason":"完成"},
		{"itemId":2,"status":3,"reason":"完成"},
		{"itemId":3,"status":3,"reason":"完成"}
	]
}

4.5.2.后台接口实现

PurchaseController

 /**
  * 完成采购单
  * @param purchaseDoneVO
  * @return
  */
  @PostMapping("/done")
  public R finished(@RequestBody PurchaseDoneVO purchaseDoneVO) {
      purchaseService.done(purchaseDoneVO);
      return R.ok();
  }

PurchaseServiceImpl

/**
 * 完成采购单
 * @param purchaseDoneVO
 */
@Transactional(rollbackFor = Exception.class)
@Override
public void done(PurchaseDoneVO purchaseDoneVO) {
    // 1.修改采购项状态
    List<PurchaseDetailEntity> updateList = new ArrayList<>();
    boolean flag = true;
    for (PurchaseItemDoneVO itemDoneVO : purchaseDoneVO.getItems()) {
        PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
        if (itemDoneVO.getStatus() ==
        WareConstant.PurchaseDetailEnum.FAILED.getCode()) {
            flag = false;
            purchaseDetailEntity.setStatus(itemDoneVO.getStatus());
        } else {
            purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailEnum.FINISHED.getCode());

            // 2.将成功采购的商品入库
            PurchaseDetailEntity detailEntity =
                    detailService.getById(itemDoneVO.getItemId());
            wareSkuService.addStock(detailEntity.getSkuId(),
                    detailEntity.getWareId(), detailEntity.getSkuNum());
        }
        purchaseDetailEntity.setId(itemDoneVO.getItemId());
        updateList.add(purchaseDetailEntity);
    }
    detailService.updateBatchById(updateList);
    
    // 3.修改采购单状态
    PurchaseEntity purchaseEntity = new PurchaseEntity();
    purchaseEntity.setId(purchaseDoneVO.getId());
    purchaseEntity.setStatus(flag ?
            WareConstant.PurchaseStatusEnum.FINISHED.getCode()
            : WareConstant.PurchaseStatusEnum.ERROR.getCode());
    purchaseEntity.setUpdateTime(new Date());
    this.updateById(purchaseEntity);
}

4.5.3.Postman模拟完成采购单

使用Postman发送完成采购单请求

POST /ware/purchase/done

// 请求参数
{
	"id":1, // 采购单id
	"items": [
		// itemId 采购项id,status 采购状态, reason 采购说明
		{"itemId":1,"status":3,"reason":"完成"},
		{"itemId":2,"status":3,"reason":"完成"}
	]
}

完成采购单后

采购单状态更新为 已完成

在这里插入图片描述

采购商品状态更新为 已完成

在这里插入图片描述

商品库存更新

在这里插入图片描述



5.商品库存



5.1.入库方式

  • 手动新增库存(不能直接新增,只能作为补偿手段)

  • 采购入库(常规)

    1、发起商品采购需求
    2、创建采购单
    3、采购人员领取采购单,进行商品采购(对接采购系统)
    4、完成采购
    5、商品入库



5.2.库存查询


5.2.1.API

GET /ware/waresku/list

// 请求参数
{
	page: 1, // 当前页码
	limit: 10, // 每页记录数
	sidx: 'id', // 排序字段
	order: 'asc/desc', // 排序方式
	wareId: 123, // 仓库id
	skuId: 123 // 商品id
}

//响应数据
{
	"msg": "success",
	"code": 0,
	"page": {
		"totalCount": 0,
		"pageSize": 10,
		"totalPage": 0,
		"currPage": 1,
		"list": [{
			"id": 1,
			"skuId": 1,
			"wareId": 1,
			"stock": 1,
			"skuName": "dd",
			"stockLocked": 1
		}]
	}
}

5.2.2.后台接口实现

WareSkuController

/**
 * 商品库存查询
 */
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
    PageUtils page = wareSkuService.queryPage(params);

    return R.ok().put("page", page);
}

WareSkuServiceImpl

/**
 * 查询商品库存
 * @param params
 * @return
 */
@Override
public PageUtils queryPage(Map<String, Object> params) {
    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(skuId)) {
        queryWrapper.eq("ware_id", wareId);
    }

    IPage<WareSkuEntity> page = this.page(
            new Query<WareSkuEntity>().getPage(params),
            queryWrapper
    );

    return new PageUtils(page);
}


6.SPU规格维护



6.1.获取SPU规格

在这里插入图片描述

6.1.1.API

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

//响应数据
{
	"msg": "success",
	"code": 0,
	"data": [{
		"id": 43,
		"spuId": 11,
		"attrId": 7,
		"attrName": "入网型号",
		"attrValue": "LIO-AL00",
		"attrSort": null,
		"quickShow": 1
	}]
}

6.1.2.后台接口实现

AttrController

/**
 * 获取SPU规格属性
 * @param spuId
 * @return
 */
 @GetMapping("/base/listforspu/{spuId}")
 public R listBaseAttrForSpu(@PathVariable("spuId") Long spuId) {
     List<ProductAttrValueEntity> entities = productAttrValueService.listBaseAttrForSpu(spuId);
     return R.ok().put("data", entities);
 }

ProductAttrValueServiceImpl

/**
 * 获取SPU规格属性
 * @param spuId
 * @return
 */
@Override
public List<ProductAttrValueEntity> listBaseAttrForSpu(Long spuId) {
    List<ProductAttrValueEntity> attrValueEntities = this.list(
            new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));
    return attrValueEntities;
}


6.2.修改SPU规格


6.2.1.API

POST /product/attr/update/{spuId}

// 请求参数
[{
	"attrId": 7,
	"attrName": "入网型号",
	"attrValue": "LIO-AL00",
	"quickShow": 1
}, {
	"attrId": 14,
	"attrName": "机身材质工艺",
	"attrValue": "玻璃",
	"quickShow": 0
}, {
	"attrId": 16,
	"attrName": "CPU型号",
	"attrValue": "HUAWEI Kirin 980",
	"quickShow": 1
}]

6.2.2.后台接口实现

AttrController

/**
 * 修改SPU规格属性
 * @param spuId
 * @param entities
 * @return
 */
 @PostMapping("/update/{spuId}")
 public R updateSpuAttr(@PathVariable("spuId") Long spuId, @RequestBody List<ProductAttrValueEntity> entities){
     productAttrValueService.updateSpuAttr(spuId, entities);
     return R.ok();
 }

ProductAttrValueServiceImpl

/**
 * 修改SPU规格属性
 * @param spuId
 * @param entities
 */
@Transactional(rollbackFor = Exception.class)
@Override
public void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {
    // 删除spu之前对应的所有规格属性
    this.remove(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));

    //插入spu新的规格属性
    List<ProductAttrValueEntity> ProductAttrValueEntities = entities.stream().map(entity -> {
        entity.setSpuId(spuId);
        return entity;
    }).collect(Collectors.toList());
    this.saveBatch(ProductAttrValueEntities);
}

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

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

相关文章

CDH 6.3.2启用YARN高可用

升级原因 CDH平台即将被切换成生产环境&#xff0c;而生产环境几乎都是HA&#xff0c;所以需要将YARN升级成HA。 升级准备 CDH已经成功安装并正常使用CMS的管理员账号正常登陆 CDH启用YARN HA 登陆CMS系统->选择YARN服务->点击进入到YARN服务详情页面&#xff0c;再…

【Yolov5】保姆级别源码讲解之-模型训练部分train.py文件

本次讲解yolov5训练类train.py1.主函数2.main函数2.1 第一部分 进行校验2.2 第二部分 配置resume参数用于中断之后进行训练2.3第三部分 DDP mode2.4 第四部分3.训练结果1.主函数 opt参数部分和main方法 weights&#xff1a;权重文件路径 – cfg&#xff1a;存储模型结构的配置…

解决AAC音频编码时间戳的计算问题

1.主题音频是流式数据&#xff0c;并不像视频一样有P帧和B帧的概念。就像砌墙一样&#xff0c;咔咔往上摞就行了。一般来说&#xff0c;AAC编码中生成文件这一步&#xff0c;如果使用的是OutputStream流写入文件的话&#xff0c;就完全不需要计算时间。但在音视频同步或者使用A…

pytorch入门3--线性回归以及许多python,pytorch函数的用法

先补充一些知识点&#xff0c;这里不一定用得到&#xff0c;后面的学习过程中可能用得到。 1.batch表示批量&#xff0c;就是一批数据集的意思&#xff1b; 2.batch_size表示数据集&#xff08;样本集、训练集&#xff09;的大小&#xff08;数据的个数&#xff09;&#xff1b…

进程与线程的区别

进程和线程 进程 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程 进程中的一个执行任务&#xff08;控制单元&#xff09;&#xf…

深入理解跳表及其在Redis中的应用

前言跳表可以达到和红黑树一样的时间复杂度 O(logN)&#xff0c;且实现简单&#xff0c;Redis 中的有序集合对象的底层数据结构就使用了跳表。其作者威廉普评价&#xff1a;跳跃链表是在很多应用中有可能替代平衡树的一种数据结构。本篇文章将对跳表的实现及在Redis中的应用进行…

蓝桥杯:染色时间

蓝桥杯&#xff1a;染色时间https://www.lanqiao.cn/problems/2386/learning/?contest_id80 问题描述 输入格式 输出格式 样例输入输出 样例输入 样例输出 评测用例规模与约定 解题思路&#xff1a;优先队列 AC代码(Java)&#xff1a; 问题描述 小蓝有一个 n 行 m 列…

华为OD机试题,用 Java 解【任务混部】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

本地docker部署mysql,IDEA直连实战

1、安装mysql镜像 前文中我们安装了docker和redis镜像&#xff0c;并在idea中成功连接&#xff0c;现在安装mysql镜像 docker pull mysql &#xff0c;默认最新版本 ps:可以参考https://www.runoob.com/docker/docker-install-mysql.html 2、启动mysql 打开powershell&…

快速掌握 Flutter 图片开发核心技能

大家好&#xff0c;我是 17。 在 Flutter 中使用图片是最基础能力之一。17 做了精心准备&#xff0c;满满的都是干货&#xff01;本文介绍如何在 Flutter 中使用图片&#xff0c;尽量详细&#xff0c;示例完整&#xff0c;包会&#xff01; 使用网络图片 使用网络图片超级简…

【035】基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …

【知识图谱】架构-特点-缺点简介

架构物联网、云计算、人工智能等新一代信息技术的迅猛发展&#xff0c;带来了制造业的新一轮突破&#xff0c;推动着制造系统向智能化方向发展&#xff0c;驱动着未来制造模式的创新。其中数据和知识是实现制造业与新一代信息技术融合的基础&#xff0c;是实现智能制造的保障。…

PyQt5(二) python程序打包成.exe文件

目录一、安装 **pyinstaller**二、pyinstaller 打包2.1 pyinstaller 打包机制参考链接前言我们在 pycharm 上写的程序在发送到一台没有安装 python 解释器的机器上是不能运行的&#xff0c;甚至还要安装程序中所使用的第三方包&#xff0c;这样极其不方便。 但是 PC 是可以直接…

【C++】哈希——unordered系列容器|哈希冲突|闭散列|开散列

文章目录一、unordered系列关联式容器二、哈希概念三、哈希冲突四、哈希函数五、解决哈希冲突1.闭散列——开放定址法2.代码实现3.开散列——开链法4.代码实现六、结语一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c…

MySQL 横表和竖表相互转换

一 竖表转横表 1. 首先创建竖表 create table student ( id varchar(32) primary key, name varchar (50) not null, subject varchar(50) not null, result int); 2. 插入数据 insert into student (id, name, subject, result) values (0001, 小明, 语文, 83); insert into…

RK系列(RK3568) 收音机tef6686芯片驱动,i2c驱动

SOC:RK3568模块&#xff1a;tef6686系统&#xff1a;Android121.首先目前tef6686只有单片机才有驱动&#xff0c;Linux要集成只需要控制模块内部的i2c地址的顺序从github下载tef6686 Andruino的代码 https://github.com/tehniq3/TEF6686解压进入TEF6686-master\TEF6686_1602i2c…

华为OD机试用Python实现 -【任务混部】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲任务混部题目输入输出示例一输入输出说明示例二输入输出说明备注Code代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/ca…

Google Guice 5:AOP

1. AOP 1.1 实际开发中面临的问题 在实际开发中&#xff0c;经常需要打印一个方法的执行时间&#xff0c;以确定是否存在慢操作 最简单的方法&#xff0c;直接修改已有的方法&#xff0c;在finnally语句中打印耗时 Override public Optional<Table> getTable(String da…

中级嵌入式系统设计师2014下半年下午试题与答案解析

中级嵌入式系统设计师2014下半年下午试题与答案解析 试题一 阅读下列说明和图,回答下列问题。 [说明] ATM自动取款机系统是一个由终端机、ATM系统、数据库组成的应用系统,具有提取现金、查询账户余额、修改密码及转账等功能。ATM自动取款机系统用例图如图1所示。

win11开始菜单增强工具:StartAllBack

StartAllBack是一款Windows11开始菜单增强工具&#xff0c;在任务栏上为Windows 11恢复经典样式的Windows 7主题风格开始菜单&#xff0c;主要功能包括&#xff1a;恢复和改进开始菜单样式、个性化任务栏、资源管理器等功能。软件功能恢复和改进任务栏在任务图标上显示标签调整…