-- 复核记录表
CREATE TABLE wms_review_workbench (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
-- 复核配置信息
role_id BIGINT NOT NULL COMMENT '复核角色ID',
role_name VARCHAR(30) NOT NULL COMMENT '角色名称(关联system_role表的name)',
role_code VARCHAR(100) NOT NULL COMMENT '角色权限字符串(关联system_role表的code)',
-- 项目信息(参考wms_project表)
project_id VARCHAR(255) NOT NULL COMMENT '项目ID',
project_doc_no VARCHAR(50) NOT NULL COMMENT '项目单据号',
project_name VARCHAR(255) NULL COMMENT '项目名称',
-- 业务关联信息
biz_type VARCHAR(50) NOT NULL COMMENT '业务类型: INBOUND/OUTBOUND等',
biz_id VARCHAR(255) NOT NULL COMMENT '业务记录ID',
biz_doc_no VARCHAR(50) NOT NULL COMMENT '业务记录单据号',
-- 业务机构信息(参考wms_stock_inbound表)
biz_org_id VARCHAR(255) NULL COMMENT '业务机构ID',
biz_org_name VARCHAR(255) NULL COMMENT '业务机构名称',
-- 业务部门信息
biz_dept_id VARCHAR(255) NULL COMMENT '业务部门ID',
biz_dept_name VARCHAR(255) NULL COMMENT '业务部门名称',
-- 业务员信息
salesman_id VARCHAR(255) NULL COMMENT '业务员ID',
salesman_name VARCHAR(255) NULL COMMENT '业务员姓名',
-- 制单人信息
doc_maker_id BIGINT NULL COMMENT '制单人ID',
doc_maker_name VARCHAR(50) NULL COMMENT '制单人姓名',
-- 审核状态
review_status VARCHAR(20) NOT NULL COMMENT '审批状态: PENDING/APPROVED/REJECTED',
review_comment TEXT NULL COMMENT '审批意见',
reviewer_id BIGINT NULL COMMENT '审核人ID',
reviewer_name VARCHAR(50) NULL COMMENT '审核人姓名',
review_time TIMESTAMP NULL COMMENT '审核时间',
-- 元信息
tenant_id int null comment '租户ID;用于多租户区分',
creator varchar(255) null comment '创建人',
create_time datetime default CURRENT_TIMESTAMP null comment '创建时间',
updater varchar(255) null comment '更新人',
update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
deleted tinyint(1) default 0 null comment '逻辑删除标志,0表示未删除,1表示已删除',
-- 索引
-- 按角色和状态查询待办任务
INDEX idx_role_status (role_id, review_status),
-- 按业务单据查询
INDEX idx_biz_doc (biz_type, biz_id),
-- 按项目维度查询
INDEX idx_project_status (project_id, review_status),
-- 按单据号查询(业务单据)
INDEX idx_biz_doc_no (biz_doc_no),
-- 按项目单据号查询
INDEX idx_project_doc_no (project_doc_no),
-- 按制单人查询
INDEX idx_doc_maker (doc_maker_id),
-- 按审核人查询
INDEX idx_reviewer (reviewer_id),
-- 按审核时间范围查询
INDEX idx_review_time (review_time),
-- 按创建时间查询统计
INDEX idx_create_time (create_time),
-- 联合索引:按业务类型和状态查询
INDEX idx_biz_type_status (biz_type, review_status),
-- 联合索引:按项目和业务类型查询
INDEX idx_project_biz (project_id, biz_type)
) COMMENT '复核工作台记录表,聚合各业务单据的复核审批流转信息';
深度解析:从内存布局看并发模型的演进
0. 前情提要:内存的本质与“格子”理论
内存本质上只是操作系统(OS)管理的一堆带有编号的空白格子。它本身并没有“堆”或“栈”的概念。
-
规则定义形态: 当 JVM 租下 4 GB 空间并定义为**堆(Heap)**时,它建立了一套“随机存取”的规则,像仓库一样按需存放对象。
-
硬件驱动形态: 当物理线程从剩余内存中划走 1 MB 时,这块空间被赋予了**栈(Stack)的规则。这不是因为格子变了,而是因为 CPU 的硬件设计(SP 寄存器)要求这块空间必须像“试管”**一样运作——后进先出,极速压栈。
什么是 @MockBean
Mock 这个单词本身就有:adj. 仿制的;模拟的 的意思,所以见词知意,就是用于模拟测试的一个东西。
@Mock 是 Mockito 框架提供的注解,可以在 Maven 项目中引入使用。
而 @MockBean 和 @Mock 差不多,但是支持了 SpringBoot
一句话点拨出 MockBean 的核心作用
模拟行为并统计
一旦使用 @MockBean 标注某个依赖,这个依赖就会被完全替换为一个 “模拟对象”。它仅实现了接口的方法签名,但没有任何业务逻辑。如果不通过 when() 预设行为,模拟对象就不知道该返回什么,只能返回 Java 类型的默认值
简单记录下我做的一些工作事项,只记主要由我负责的事项,以及我特别思考的一些小点🤏
3 things worth it
- 开源项目的一阶段完成,耗时比较正常
- 新的 IOS 26 的效果我个人还是蛮喜欢的,那个新的 Watch 表盘也很惊艳
- 自己之前在贯彻使用的英语学习法是正确的,本周和一朋友讨论了一下,决定继续贯彻并更进一步。目前看简单的全英文字没啥大问题,可以简单的差两个陌生词,慢吞吞的看完。
One thing you could do better next week
- 继续加油,这周争取能拿到 3 个优秀小贴画
一次生产事故复盘:因厂商 SDK 对 SSL 握手与异常释放处理不当,叠加切面中 @Async 自调用导致异步失效,引发线程长期阻塞。文章还分析 Netty 连接池与握手时机、CountDownLatch 使用风险及修复方案。
3 things worth it
- I've been trying to analyze, design, and develop a complete open-sourxe project that can solve real-word problems and be truly paractcal.
- I am still learning English, and i have found a great, low-precessure method for it.
- This weekend, I went into the kitchen and cooked a dish of shredded potatoes(土豆丝). It turned out quite presentable(有模有样) this -- at the very least, it was still shredded potatoes, not a potato pancake(土豆饼)!
- I met up with friend.
- I also added a small life insight:
- Take a deep breath and let your mind calm down little by little.Listen to the sounds around you and look at the smiles in front of you.
- Just fell it -- fell those tiny, warm sounds(细碎的、温热的声响). Pause for a moment-pause in the present(驻足在此刻的时光). You might not realize how incredibly precious everything you are experiencing right now is.
安装 easyconnect-docker
docker run \
--name app-easyconnect \ # 容器名称
--device /dev/net/tun \ # 挂载网络隧道设备
--cap-add NET_ADMIN \ # 添加网络管理权限
-privileged \ # 最高权限模式
-ti \ # 交互式终端
-e PASSWORD=xxxx \ # VNC 连接密码
-e URLWIN=1 \ # 启用窗口模式
-e DISABLE_PKG_VERSION_XML=1 \ # 禁用包版本检查(适配 ARM64)
-v /Users/wangwenpeng/docker/app/easy-connect:/root \ # 挂载数据卷
-p 127.0.0.1:5901:5901 \ # VNC 端口映射
-p 127.0.0.1:1080:1080 \ # SOCKS5 代理端口映射
-p 127.0.0.1:8888:8888 \ # HTTP 代理端口映射
hagb/docker-easyconnect:7.6.7 # 镜像名称和版本
本文介绍了一套完整的区块链存证系统设计方案,旨在为业务系统提供零侵入、高可用的数据存证能力。通过 AOP 切面编程,业务代码只需添加 @BlockchainCertify 注解即可接入存证功能;采用策略模式支持多厂商 SDK(蚂蚁链、腾讯链、以太坊等);异步处理机制确保存证失败不影响原业务流程;完善的重试机制和状态监控保障系统稳定性。该方案可以封装为通用 Starter 组件,具备生产环境部署能力。
核心理解
@ConfigurationProperties(prefix = "blockchain") 不是专门绑定本地 application.yml 的!
这个注解的作用是:
- 告诉 Spring 如何 mapping 属性
- 无论配置来源是哪里(本地文件 OR Nacos OR 环境变量)
配置属性绑定机制
@Data
@Component
@ConfigurationProperties(prefix = "blockchain") // 这个prefix是通用的!
@RefreshScope
public class BlockchainConfig {
private String mainAddress; // 对应任何来源的 blockchain.main-address
private Integer mainPort; // 对应任何来源的 blockchain.main-port
private String fileAddress; // 对应任何来源的 blockchain.file-address
}
